summaryrefslogtreecommitdiff
path: root/frontend/gamma
Unidiff
Diffstat (limited to 'frontend/gamma') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/css/web.css3871
-rw-r--r--frontend/gamma/html/exitPage_template.html25
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy.js2
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js33
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js52
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js8
-rw-r--r--frontend/gamma/js/MochiKit/Async.js120
-rw-r--r--frontend/gamma/js/MochiKit/Base.js156
-rw-r--r--frontend/gamma/js/MochiKit/Color.js17
-rw-r--r--frontend/gamma/js/MochiKit/DOM.js165
-rw-r--r--frontend/gamma/js/MochiKit/DateTime.js49
-rw-r--r--frontend/gamma/js/MochiKit/DragAndDrop.js14
-rw-r--r--frontend/gamma/js/MochiKit/Format.js16
-rw-r--r--frontend/gamma/js/MochiKit/Iter.js16
-rw-r--r--frontend/gamma/js/MochiKit/Logging.js4
-rw-r--r--frontend/gamma/js/MochiKit/LoggingPane.js13
-rw-r--r--frontend/gamma/js/MochiKit/MochiKit.js11
-rw-r--r--frontend/gamma/js/MochiKit/MockDOM.js9
-rw-r--r--frontend/gamma/js/MochiKit/Position.js2
-rw-r--r--frontend/gamma/js/MochiKit/Selector.js16
-rw-r--r--frontend/gamma/js/MochiKit/Signal.js47
-rw-r--r--frontend/gamma/js/MochiKit/Sortable.js12
-rw-r--r--frontend/gamma/js/MochiKit/Style.js19
-rw-r--r--frontend/gamma/js/MochiKit/Test.js2
-rw-r--r--frontend/gamma/js/MochiKit/Text.js359
-rw-r--r--frontend/gamma/js/MochiKit/Visual.js39
-rw-r--r--frontend/gamma/js/MochiKit/__package__.js18
-rw-r--r--frontend/gamma/js/main.js10
-rw-r--r--frontend/gamma/properties/gamma.properties.json7
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Base.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Date.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Proxy.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Toll.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html1
-rw-r--r--frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html1
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/index.html4
-rw-r--r--frontend/gamma/tests/tests/Components/Tooltips/index.html4
48 files changed, 1843 insertions, 3294 deletions
diff --git a/frontend/gamma/css/web.css b/frontend/gamma/css/web.css
index e4890b6..0a72e09 100644
--- a/frontend/gamma/css/web.css
+++ b/frontend/gamma/css/web.css
@@ -1,3703 +1,2210 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24*/ 24*/
25 25
26/* 26/*
27 27
28Color list: 28Color list:
29- login box: 29- login box:
30 light#ff9955 30 light#ff9955
31 dark#ff6622 31 dark#ff6622
32- login button: 32- login button:
33 regular#dd5500 33 regular#dd5500
34 hover#773311 34 hover#773311
35- login translations: 35- login translations:
36 box: #cc6622; 36 box: #cc6622;
37 not-selected: 37 not-selected:
38 color: #ddaa99 38 color: #ddaa99
39 background:#994422 39 background:#994422
40 selected: #772211; 40 selected: #772211;
41*/ 41*/
42html { 42html {
43 height: 100%; 43 height: 100%;
44} 44}
45body { 45body {
46 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 46 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
47 margin: 0px; 47 margin: 0px;
48} 48}
49div.modalDialogMask.userInfoBoxMask {
50 -moz-opacity: 0.0;
51 opacity: .0;
52 filter: alpha(opacity=0);
53 z-index: 19000;
54}
49.reset-margin { 55.reset-margin {
50 margin: 0px; 56 margin: 0px;
51 padding: 0px; 57 padding: 0px;
52 border: 0px; 58 border: 0px;
53} 59}
54.clear { 60.clear {
55 clear: both; 61 clear: both;
56} 62}
57.hidden_none { 63.hidden_none {
58 display: none; 64 display: none;
59 visibility: hidden; 65 visibility: hidden;
60} 66}
61.keepTogether { 67.keepTogether {
62 display: inline-block; 68 display: inline-block;
63 white-space: nowrap; 69 white-space: nowrap;
64} 70}
65#mainDiv { 71#mainDiv {
66 margin: 0 auto; 72 margin: 0 auto;
67} 73}
68/* 74/*
69 75
70Color list: 76Color list:
71- login box: 77- login box:
72 light#ff9955 78 light#ff9955
73 dark#ff6622 79 dark#ff6622
74- login button: 80- login button:
75 regular#dd5500 81 regular#dd5500
76 hover#773311 82 hover#773311
77- login translations: 83- login translations:
78 box: #cc6622; 84 box: #cc6622;
79 not-selected: 85 not-selected:
80 color: #ddaa99 86 color: #ddaa99
81 background:#994422 87 background:#994422
82 selected: #772211; 88 selected: #772211;
83*/ 89*/
84html { 90html {
85 height: 100%; 91 height: 100%;
86} 92}
87body { 93body {
88 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 94 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
89 margin: 0px; 95 margin: 0px;
90} 96}
97div.modalDialogMask.userInfoBoxMask {
98 -moz-opacity: 0.0;
99 opacity: .0;
100 filter: alpha(opacity=0);
101 z-index: 19000;
102}
91.reset-margin { 103.reset-margin {
92 margin: 0px; 104 margin: 0px;
93 padding: 0px; 105 padding: 0px;
94 border: 0px; 106 border: 0px;
95} 107}
96.clear { 108.clear {
97 clear: both; 109 clear: both;
98} 110}
99.hidden_none { 111.hidden_none {
100 display: none; 112 display: none;
101 visibility: hidden; 113 visibility: hidden;
102} 114}
103.keepTogether { 115.keepTogether {
104 display: inline-block; 116 display: inline-block;
105 white-space: nowrap; 117 white-space: nowrap;
106} 118}
107#mainDiv { 119#mainDiv {
108 margin: 0 auto; 120 margin: 0 auto;
109} 121}
110div#loading { 122div#loading {
111 width: 100%; 123 width: 100%;
112 height: 100%; 124 height: 100%;
113 display: table; 125 display: table;
114 background-image: -ms-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 126 background-image: -ms-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
115 /* IE10 */ 127 /* IE10 */
116 background-image: -moz-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 128 background-image: -moz-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
117 /* Mozilla Firefox */ 129 /* Mozilla Firefox */
118 background-image: -o-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 130 background-image: -o-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
119 /* Opera */ 131 /* Opera */
120 background-image: -webkit-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 132 background-image: -webkit-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
121 /* Webkit (Chrome 11+) */ 133 /* Webkit (Chrome 11+) */
122 background-image: radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 134 background-image: radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
123 /* Proposed W3C Markup */ 135 /* Proposed W3C Markup */
124 background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, #4d52b3), color-stop(1, #1f2148)); 136 background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, #4d52b3), color-stop(1, #1f2148));
125 /* Webkit (Safari/Chrome 10) */ 137 /* Webkit (Safari/Chrome 10) */
126} 138}
127div#loading div { 139div#loading div {
128 display: table-cell; 140 display: table-cell;
129 vertical-align: middle; 141 vertical-align: middle;
130 width: 100%; 142 width: 100%;
131 text-align: center; 143 text-align: center;
132} 144}
133div#loading div h1 { 145div#loading div h1 {
134 font-size: 40pt; 146 font-size: 40pt;
135 color: #ffffff; 147 color: #ffffff;
136 text-shadow: -1px -1px 2px #2e316c, 1px 1px 1px #454aa1; 148 text-shadow: -1px -1px 2px #2e316c, 1px 1px 1px #454aa1;
137} 149}
138div#loading div h3 { 150div#loading div h3 {
139 font-size: 18pt; 151 font-size: 18pt;
140 text-shadow: -1px -1px 1px #2e316c, 1px 1px 1px #454aa1; 152 text-shadow: -1px -1px 1px #2e316c, 1px 1px 1px #454aa1;
141 color: #1f2148; 153 color: #1f2148;
142} 154}
143div#loading div h5 { 155div#loading div h5 {
144 padding-left: 20px; 156 padding-left: 20px;
145 color: #ff9200; 157 color: #ff9200;
146} 158}
147/* 159/*
148 160
149Color list: 161Color list:
150- login box: 162- login box:
151 light#ff9955 163 light#ff9955
152 dark#ff6622 164 dark#ff6622
153- login button: 165- login button:
154 regular#dd5500 166 regular#dd5500
155 hover#773311 167 hover#773311
156- login translations: 168- login translations:
157 box: #cc6622; 169 box: #cc6622;
158 not-selected: 170 not-selected:
159 color: #ddaa99 171 color: #ddaa99
160 background:#994422 172 background:#994422
161 selected: #772211; 173 selected: #772211;
162*/ 174*/
163html { 175html {
164 height: 100%; 176 height: 100%;
165} 177}
166body { 178body {
167 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 179 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
168 margin: 0px; 180 margin: 0px;
169} 181}
182div.modalDialogMask.userInfoBoxMask {
183 -moz-opacity: 0.0;
184 opacity: .0;
185 filter: alpha(opacity=0);
186 z-index: 19000;
187}
188.reset-margin {
189 margin: 0px;
190 padding: 0px;
191 border: 0px;
192}
193.clear {
194 clear: both;
195}
196.hidden_none {
197 display: none;
198 visibility: hidden;
199}
200.keepTogether {
201 display: inline-block;
202 white-space: nowrap;
203}
204#mainDiv {
205 margin: 0 auto;
206}
207div.tooltip {
208 position: absolute;
209 z-index: 30001;
210}
211div.tooltip div.tooltip_body {
212 border-radius: 8px;
213 -moz-border-radius: 8px;
214 -webkit-border-radius: 8px;
215 border-radius: 8px;
216 -moz-border-radius: 8px;
217 -webkit-border-radius: 8px;
218 border-radius: 8px;
219 -moz-border-radius: 8px;
220 -webkit-border-radius: 8px;
221 border-radius: 8px;
222 -moz-border-radius: 8px;
223 -webkit-border-radius: 8px;
224 border-radius: 8px;
225 -moz-border-radius: 8px;
226 -webkit-border-radius: 8px;
227 border-radius: 8px;
228 -moz-border-radius: 8px;
229 -webkit-border-radius: 8px;
230 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
231 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
232 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
233 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
234 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
235 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
236 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
237 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
238 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
239 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
240 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
241 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
242 -webkit-box-shadow: 4px 4px 10px #333333;
243 -moz-box-shadow: 4px 4px 10px #333333;
244 box-shadow: 4px 4px 10px #333333;
245 -webkit-box-shadow: 4px 4px 10px #333333;
246 -moz-box-shadow: 4px 4px 10px #333333;
247 box-shadow: 4px 4px 10px #333333;
248 -webkit-box-shadow: 4px 4px 10px #333333;
249 -moz-box-shadow: 4px 4px 10px #333333;
250 box-shadow: 4px 4px 10px #333333;
251 -webkit-box-shadow: 4px 4px 10px #333333;
252 -moz-box-shadow: 4px 4px 10px #333333;
253 box-shadow: 4px 4px 10px #333333;
254 -webkit-box-shadow: 4px 4px 10px #333333;
255 -moz-box-shadow: 4px 4px 10px #333333;
256 box-shadow: 4px 4px 10px #333333;
257 -webkit-box-shadow: 4px 4px 10px #333333;
258 -moz-box-shadow: 4px 4px 10px #333333;
259 box-shadow: 4px 4px 10px #333333;
260 border-top: 1px solid #d4d4d4;
261 border-left: 1px solid #a2a2a2;
262 border-right: 1px solid #6f6f6f;
263 border-bottom: 1px solid #3c3c3c;
264 border-radius: 8px;
265 -moz-border-radius: 8px;
266 -webkit-border-radius: 8px;
267 border-radius: 8px;
268 -moz-border-radius: 8px;
269 -webkit-border-radius: 8px;
270 border-radius: 8px;
271 -moz-border-radius: 8px;
272 -webkit-border-radius: 8px;
273 border-radius: 8px;
274 -moz-border-radius: 8px;
275 -webkit-border-radius: 8px;
276 border-radius: 8px;
277 -moz-border-radius: 8px;
278 -webkit-border-radius: 8px;
279 border-radius: 8px;
280 -moz-border-radius: 8px;
281 -webkit-border-radius: 8px;
282 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
283 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
284 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
285 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
286 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
287 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
288 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
289 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
290 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
291 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
292 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
293 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
294 -webkit-box-shadow: 4px 4px 10px #333333;
295 -moz-box-shadow: 4px 4px 10px #333333;
296 box-shadow: 4px 4px 10px #333333;
297 -webkit-box-shadow: 4px 4px 10px #333333;
298 -moz-box-shadow: 4px 4px 10px #333333;
299 box-shadow: 4px 4px 10px #333333;
300 -webkit-box-shadow: 4px 4px 10px #333333;
301 -moz-box-shadow: 4px 4px 10px #333333;
302 box-shadow: 4px 4px 10px #333333;
303 -webkit-box-shadow: 4px 4px 10px #333333;
304 -moz-box-shadow: 4px 4px 10px #333333;
305 box-shadow: 4px 4px 10px #333333;
306 -webkit-box-shadow: 4px 4px 10px #333333;
307 -moz-box-shadow: 4px 4px 10px #333333;
308 box-shadow: 4px 4px 10px #333333;
309 -webkit-box-shadow: 4px 4px 10px #333333;
310 -moz-box-shadow: 4px 4px 10px #333333;
311 box-shadow: 4px 4px 10px #333333;
312 border-top: 1px solid #d4d4d4;
313 border-left: 1px solid #a2a2a2;
314 border-right: 1px solid #6f6f6f;
315 border-bottom: 1px solid #3c3c3c;
316 border-radius: 8px;
317 -moz-border-radius: 8px;
318 -webkit-border-radius: 8px;
319 border-radius: 8px;
320 -moz-border-radius: 8px;
321 -webkit-border-radius: 8px;
322 border-radius: 8px;
323 -moz-border-radius: 8px;
324 -webkit-border-radius: 8px;
325 border-radius: 8px;
326 -moz-border-radius: 8px;
327 -webkit-border-radius: 8px;
328 border-radius: 8px;
329 -moz-border-radius: 8px;
330 -webkit-border-radius: 8px;
331 border-radius: 8px;
332 -moz-border-radius: 8px;
333 -webkit-border-radius: 8px;
334 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
335 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
336 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
337 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
338 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
339 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
340 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
341 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
342 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
343 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
344 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
345 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
346 -webkit-box-shadow: 4px 4px 10px #333333;
347 -moz-box-shadow: 4px 4px 10px #333333;
348 box-shadow: 4px 4px 10px #333333;
349 -webkit-box-shadow: 4px 4px 10px #333333;
350 -moz-box-shadow: 4px 4px 10px #333333;
351 box-shadow: 4px 4px 10px #333333;
352 -webkit-box-shadow: 4px 4px 10px #333333;
353 -moz-box-shadow: 4px 4px 10px #333333;
354 box-shadow: 4px 4px 10px #333333;
355 -webkit-box-shadow: 4px 4px 10px #333333;
356 -moz-box-shadow: 4px 4px 10px #333333;
357 box-shadow: 4px 4px 10px #333333;
358 -webkit-box-shadow: 4px 4px 10px #333333;
359 -moz-box-shadow: 4px 4px 10px #333333;
360 box-shadow: 4px 4px 10px #333333;
361 -webkit-box-shadow: 4px 4px 10px #333333;
362 -moz-box-shadow: 4px 4px 10px #333333;
363 box-shadow: 4px 4px 10px #333333;
364 border-top: 1px solid #d4d4d4;
365 border-left: 1px solid #a2a2a2;
366 border-right: 1px solid #6f6f6f;
367 border-bottom: 1px solid #3c3c3c;
368 border-radius: 8px;
369 -moz-border-radius: 8px;
370 -webkit-border-radius: 8px;
371 border-radius: 8px;
372 -moz-border-radius: 8px;
373 -webkit-border-radius: 8px;
374 border-radius: 8px;
375 -moz-border-radius: 8px;
376 -webkit-border-radius: 8px;
377 border-radius: 8px;
378 -moz-border-radius: 8px;
379 -webkit-border-radius: 8px;
380 border-radius: 8px;
381 -moz-border-radius: 8px;
382 -webkit-border-radius: 8px;
383 border-radius: 8px;
384 -moz-border-radius: 8px;
385 -webkit-border-radius: 8px;
386 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
387 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
388 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
389 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
390 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
391 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
392 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
393 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
394 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
395 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
396 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
397 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
398 -webkit-box-shadow: 4px 4px 10px #333333;
399 -moz-box-shadow: 4px 4px 10px #333333;
400 box-shadow: 4px 4px 10px #333333;
401 -webkit-box-shadow: 4px 4px 10px #333333;
402 -moz-box-shadow: 4px 4px 10px #333333;
403 box-shadow: 4px 4px 10px #333333;
404 -webkit-box-shadow: 4px 4px 10px #333333;
405 -moz-box-shadow: 4px 4px 10px #333333;
406 box-shadow: 4px 4px 10px #333333;
407 -webkit-box-shadow: 4px 4px 10px #333333;
408 -moz-box-shadow: 4px 4px 10px #333333;
409 box-shadow: 4px 4px 10px #333333;
410 -webkit-box-shadow: 4px 4px 10px #333333;
411 -moz-box-shadow: 4px 4px 10px #333333;
412 box-shadow: 4px 4px 10px #333333;
413 -webkit-box-shadow: 4px 4px 10px #333333;
414 -moz-box-shadow: 4px 4px 10px #333333;
415 box-shadow: 4px 4px 10px #333333;
416 border-top: 1px solid #d4d4d4;
417 border-left: 1px solid #a2a2a2;
418 border-right: 1px solid #6f6f6f;
419 border-bottom: 1px solid #3c3c3c;
420 border-radius: 8px;
421 -moz-border-radius: 8px;
422 -webkit-border-radius: 8px;
423 border-radius: 8px;
424 -moz-border-radius: 8px;
425 -webkit-border-radius: 8px;
426 border-radius: 8px;
427 -moz-border-radius: 8px;
428 -webkit-border-radius: 8px;
429 border-radius: 8px;
430 -moz-border-radius: 8px;
431 -webkit-border-radius: 8px;
432 border-radius: 8px;
433 -moz-border-radius: 8px;
434 -webkit-border-radius: 8px;
435 border-radius: 8px;
436 -moz-border-radius: 8px;
437 -webkit-border-radius: 8px;
438 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
439 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
440 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
441 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
442 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
443 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
444 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
445 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
446 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
447 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
448 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
449 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
450 -webkit-box-shadow: 4px 4px 10px #333333;
451 -moz-box-shadow: 4px 4px 10px #333333;
452 box-shadow: 4px 4px 10px #333333;
453 -webkit-box-shadow: 4px 4px 10px #333333;
454 -moz-box-shadow: 4px 4px 10px #333333;
455 box-shadow: 4px 4px 10px #333333;
456 -webkit-box-shadow: 4px 4px 10px #333333;
457 -moz-box-shadow: 4px 4px 10px #333333;
458 box-shadow: 4px 4px 10px #333333;
459 -webkit-box-shadow: 4px 4px 10px #333333;
460 -moz-box-shadow: 4px 4px 10px #333333;
461 box-shadow: 4px 4px 10px #333333;
462 -webkit-box-shadow: 4px 4px 10px #333333;
463 -moz-box-shadow: 4px 4px 10px #333333;
464 box-shadow: 4px 4px 10px #333333;
465 -webkit-box-shadow: 4px 4px 10px #333333;
466 -moz-box-shadow: 4px 4px 10px #333333;
467 box-shadow: 4px 4px 10px #333333;
468 border-top: 1px solid #d4d4d4;
469 border-left: 1px solid #a2a2a2;
470 border-right: 1px solid #6f6f6f;
471 border-bottom: 1px solid #3c3c3c;
472 border-radius: 8px;
473 -moz-border-radius: 8px;
474 -webkit-border-radius: 8px;
475 border-radius: 8px;
476 -moz-border-radius: 8px;
477 -webkit-border-radius: 8px;
478 border-radius: 8px;
479 -moz-border-radius: 8px;
480 -webkit-border-radius: 8px;
481 border-radius: 8px;
482 -moz-border-radius: 8px;
483 -webkit-border-radius: 8px;
484 border-radius: 8px;
485 -moz-border-radius: 8px;
486 -webkit-border-radius: 8px;
487 border-radius: 8px;
488 -moz-border-radius: 8px;
489 -webkit-border-radius: 8px;
490 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
491 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
492 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
493 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
494 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
495 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
496 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
497 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
498 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
499 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
500 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
501 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
502 -webkit-box-shadow: 4px 4px 10px #333333;
503 -moz-box-shadow: 4px 4px 10px #333333;
504 box-shadow: 4px 4px 10px #333333;
505 -webkit-box-shadow: 4px 4px 10px #333333;
506 -moz-box-shadow: 4px 4px 10px #333333;
507 box-shadow: 4px 4px 10px #333333;
508 -webkit-box-shadow: 4px 4px 10px #333333;
509 -moz-box-shadow: 4px 4px 10px #333333;
510 box-shadow: 4px 4px 10px #333333;
511 -webkit-box-shadow: 4px 4px 10px #333333;
512 -moz-box-shadow: 4px 4px 10px #333333;
513 box-shadow: 4px 4px 10px #333333;
514 -webkit-box-shadow: 4px 4px 10px #333333;
515 -moz-box-shadow: 4px 4px 10px #333333;
516 box-shadow: 4px 4px 10px #333333;
517 -webkit-box-shadow: 4px 4px 10px #333333;
518 -moz-box-shadow: 4px 4px 10px #333333;
519 box-shadow: 4px 4px 10px #333333;
520 border-top: 1px solid #d4d4d4;
521 border-left: 1px solid #a2a2a2;
522 border-right: 1px solid #6f6f6f;
523 border-bottom: 1px solid #3c3c3c;
524}
525div.tooltip div.tooltip_body span {
526 display: block;
527 padding: 10px;
528 font-size: 10pt;
529 color: white;
530}
531div.tooltip div.tooltip_body div.tooltip_text {
532 width: 200px;
533}
534div.tooltip div.tooltip_arrow {
535 position: absolute;
536 width: 0;
537 height: 0;
538 border: 6px solid transparent;
539}
540div.tooltip.BELOW div.tooltip_arrow {
541 top: -12px;
542 left: 97px;
543 border-bottom: 6px solid #bbbbbb;
544}
545div.tooltip.ABOVE div.tooltip_arrow {
546 position: static;
547 margin-left: 97px;
548 border-top: 6px solid #555555;
549}
550div.tooltip.LEFT div.tooltip_arrow {
551 left: 203px;
552 top: 10px;
553 border-left: 6px solid #747474;
554}
555div.tooltip.LEFT div.tooltip_body div.tooltip_text {
556 min-height: 45px;
557}
558div.tooltip.RIGHT div.tooltip_arrow {
559 left: -12px;
560 top: 10px;
561 border-right: 6px solid #9c9c9c;
562}
563div.tooltip.RIGHT div.tooltip_body div.tooltip_text {
564 min-height: 45px;
565}
566/*
567
568Color list:
569- login box:
570 light#ff9955
571 dark#ff6622
572- login button:
573 regular#dd5500
574 hover#773311
575- login translations:
576 box: #cc6622;
577 not-selected:
578 color: #ddaa99
579 background:#994422
580 selected: #772211;
581*/
582html {
583 height: 100%;
584}
585body {
586 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
587 margin: 0px;
588}
589div.modalDialogMask.userInfoBoxMask {
590 -moz-opacity: 0.0;
591 opacity: .0;
592 filter: alpha(opacity=0);
593 z-index: 19000;
594}
170.reset-margin { 595.reset-margin {
171 margin: 0px; 596 margin: 0px;
172 padding: 0px; 597 padding: 0px;
173 border: 0px; 598 border: 0px;
174} 599}
175.clear { 600.clear {
176 clear: both; 601 clear: both;
177} 602}
178.hidden_none { 603.hidden_none {
179 display: none; 604 display: none;
180 visibility: hidden; 605 visibility: hidden;
181} 606}
182.keepTogether { 607.keepTogether {
183 display: inline-block; 608 display: inline-block;
184 white-space: nowrap; 609 white-space: nowrap;
185} 610}
186#mainDiv { 611#mainDiv {
187 margin: 0 auto; 612 margin: 0 auto;
188} 613}
189div.pageHeaderAndBody { 614div.pageHeaderAndBody {
190 height: 100%; 615 height: 100%;
191} 616}
192body > div.pageHeaderAndBody { 617body > div.pageHeaderAndBody {
193 height: auto; 618 height: auto;
194 min-height: 100%; 619 min-height: 100%;
195} 620}
196div.pageHeader { 621div.pageHeader {
197 background-color: #1f2148; 622 background-color: #1f2148;
198 min-width: 1013px; 623 min-width: 1013px;
199} 624}
200div.pageHeader div#miscLinks { 625div.pageHeader div#miscLinks {
201 float: right; 626 float: right;
202} 627}
203div.pageHeader div#miscLinks ul { 628div.pageHeader div#miscLinks ul {
204 margin: 12px 0px 0px; 629 margin: 12px 0px 0px;
205 padding: 15px; 630 padding: 15px;
206} 631}
207div.pageHeader div#miscLinks ul li { 632div.pageHeader div#miscLinks ul li {
208 display: inline; 633 display: inline;
209 margin: 0px; 634 margin: 0px;
210 padding: 0px; 635 padding: 0px;
211 border: 0px; 636 border: 0px;
212} 637}
213div.pageHeader div#miscLinks ul li a { 638div.pageHeader div#miscLinks ul li a {
214 color: #ffffff; 639 color: #ffffff;
215 margin: 0px; 640 margin: 0px;
216 padding: 0px; 641 padding: 0px;
217 border: 0px; 642 border: 0px;
218 margin: 0px; 643 margin: 0px;
219 padding: 0px; 644 padding: 0px;
220 border: 0px; 645 border: 0px;
221 margin: 0px; 646 margin: 0px;
222 padding: 0px; 647 padding: 0px;
223 border: 0px; 648 border: 0px;
224 margin: 0px; 649 margin: 0px;
225 padding: 0px; 650 padding: 0px;
226 border: 0px; 651 border: 0px;
652 margin: 0px;
653 padding: 0px;
654 border: 0px;
655 margin: 0px;
656 padding: 0px;
657 border: 0px;
227 padding: 15px; 658 padding: 15px;
228 border-left: 1px solid #3e428f; 659 border-left: 1px solid #3e428f;
229 font-weight: normal; 660 font-weight: normal;
230 text-decoration: none; 661 text-decoration: none;
231 font-size: 12pt; 662 font-size: 12pt;
232 min-width: 70px; 663 min-width: 70px;
233} 664}
234div.pageHeader div#miscLinks ul li a:hover { 665div.pageHeader div#miscLinks ul li a:hover {
235 color: #b8bae1; 666 color: #b8bae1;
236} 667}
237div.pageHeader div#miscLinks ul li a#donateHeaderLink { 668div.pageHeader div#miscLinks ul li a#donateHeaderLink {
238 border-left: 0px; 669 border-left: 0px;
239} 670}
240div.pageHeader div#logoFrame { 671div.pageHeader div#logoFrame {
241 padding: 16px 16px 60px 16px; 672 padding: 16px 16px 60px 16px;
242 min-height: 44px; 673 min-height: 44px;
243} 674}
244div.pageHeader div#logoFrame a { 675div.pageHeader div#logoFrame a {
245 color: white; 676 color: white;
246 text-decoration: none; 677 text-decoration: none;
247} 678}
248div.pageHeader div#logoFrame a canvas { 679div.pageHeader div#logoFrame a canvas {
249 margin: 0px; 680 margin: 0px;
250 padding: 0px; 681 padding: 0px;
251 border: 0px; 682 border: 0px;
252 margin: 0px; 683 margin: 0px;
253 padding: 0px; 684 padding: 0px;
254 border: 0px; 685 border: 0px;
255 margin: 0px; 686 margin: 0px;
256 padding: 0px; 687 padding: 0px;
257 border: 0px; 688 border: 0px;
258 margin: 0px; 689 margin: 0px;
259 padding: 0px; 690 padding: 0px;
260 border: 0px; 691 border: 0px;
692 margin: 0px;
693 padding: 0px;
694 border: 0px;
695 margin: 0px;
696 padding: 0px;
697 border: 0px;
261 width: 150px; 698 width: 150px;
262 height: 39px; 699 height: 39px;
263} 700}
264div.pageHeader div#logoFrame a h5.clipperzPayoff { 701div.pageHeader div#logoFrame a h5.clipperzPayoff {
265 font-size: 13pt; 702 font-size: 13pt;
266 font-weight: normal; 703 font-weight: normal;
267 white-space: nowrap; 704 white-space: nowrap;
268 margin: 0px; 705 margin: 0px;
269 padding-left: 4px; 706 padding-left: 4px;
270} 707}
271div.pageHeader div#featureTabs table { 708div.pageHeader div#featureTabs table {
272 width: 100%; 709 width: 100%;
273 padding: 6px; 710 padding: 6px;
274 padding-left: 15px; 711 padding-left: 15px;
275 padding-right: 15px; 712 padding-right: 15px;
276 padding-bottom: 46px; 713 padding-bottom: 46px;
277} 714}
278div.pageHeader div#featureTabs table tr td { 715div.pageHeader div#featureTabs table tr td {
279 width: 25%; 716 width: 25%;
280 vertical-align: top; 717 vertical-align: top;
281 font-size: 11pt; 718 font-size: 11pt;
282 color: white; 719 color: white;
283} 720}
284div.pageHeader div#featureTabs table tr td img { 721div.pageHeader div#featureTabs table tr td img {
285 float: left; 722 float: left;
286} 723}
287div.pageHeader div#featureTabs table tr td span { 724div.pageHeader div#featureTabs table tr td span {
288 display: block; 725 display: block;
289 padding: 5 10 5 85; 726 padding: 5 10 5 85;
290} 727}
291div.pageHeader div#featureTabs canvas.featureIcon { 728div.pageHeader div#featureTabs canvas.featureIcon {
292 width: 76px; 729 width: 76px;
293 height: 76px; 730 height: 76px;
294 display: block; 731 display: block;
295 float: left; 732 float: left;
296 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622)); 733 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
297 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79); 734 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
298 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622)); 735 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
299 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79); 736 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
300 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622)); 737 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
301 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79); 738 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
302 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622)); 739 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
303 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79); 740 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
741 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
742 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
743 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
744 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
745 border-radius: 38px;
746 -moz-border-radius: 38px;
747 -webkit-border-radius: 38px;
748 border-radius: 38px;
749 -moz-border-radius: 38px;
750 -webkit-border-radius: 38px;
304 border-radius: 38px; 751 border-radius: 38px;
305 -moz-border-radius: 38px; 752 -moz-border-radius: 38px;
306 -webkit-border-radius: 38px; 753 -webkit-border-radius: 38px;
307 border-radius: 38px; 754 border-radius: 38px;
308 -moz-border-radius: 38px; 755 -moz-border-radius: 38px;
309 -webkit-border-radius: 38px; 756 -webkit-border-radius: 38px;
310 border-radius: 38px; 757 border-radius: 38px;
311 -moz-border-radius: 38px; 758 -moz-border-radius: 38px;
312 -webkit-border-radius: 38px; 759 -webkit-border-radius: 38px;
313 border-radius: 38px; 760 border-radius: 38px;
314 -moz-border-radius: 38px; 761 -moz-border-radius: 38px;
315 -webkit-border-radius: 38px; 762 -webkit-border-radius: 38px;
316} 763}
317div.pageHeader div#news { 764div.pageHeader div#news {
318 top: -82px; 765 top: -82px;
319 left: 240px; 766 left: 240px;
320 width: 310px; 767 width: 310px;
321 height: 90px; 768 height: 90px;
322 position: absolute; 769 position: absolute;
323 background-color: #616475; 770 background-color: #616475;
324 -webkit-border-bottom-left-radius: 8px; 771 -webkit-border-bottom-left-radius: 8px;
325 -moz-border-radius-bottomleft: 8px; 772 -moz-border-radius-bottomleft: 8px;
326 border-bottom-left-radius: 8px; 773 border-bottom-left-radius: 8px;
327 -webkit-border-bottom-left-radius: 8px; 774 -webkit-border-bottom-left-radius: 8px;
328 -moz-border-radius-bottomleft: 8px; 775 -moz-border-radius-bottomleft: 8px;
329 border-bottom-left-radius: 8px; 776 border-bottom-left-radius: 8px;
330 -webkit-border-bottom-left-radius: 8px; 777 -webkit-border-bottom-left-radius: 8px;
331 -moz-border-radius-bottomleft: 8px; 778 -moz-border-radius-bottomleft: 8px;
332 border-bottom-left-radius: 8px; 779 border-bottom-left-radius: 8px;
333 -webkit-border-bottom-left-radius: 8px; 780 -webkit-border-bottom-left-radius: 8px;
334 -moz-border-radius-bottomleft: 8px; 781 -moz-border-radius-bottomleft: 8px;
335 border-bottom-left-radius: 8px; 782 border-bottom-left-radius: 8px;
783 -webkit-border-bottom-left-radius: 8px;
784 -moz-border-radius-bottomleft: 8px;
785 border-bottom-left-radius: 8px;
786 -webkit-border-bottom-left-radius: 8px;
787 -moz-border-radius-bottomleft: 8px;
788 border-bottom-left-radius: 8px;
789 -webkit-border-bottom-right-radius: 8px;
790 -moz-border-radius-bottomright: 8px;
791 border-bottom-right-radius: 8px;
792 -webkit-border-bottom-right-radius: 8px;
793 -moz-border-radius-bottomright: 8px;
794 border-bottom-right-radius: 8px;
336 -webkit-border-bottom-right-radius: 8px; 795 -webkit-border-bottom-right-radius: 8px;
337 -moz-border-radius-bottomright: 8px; 796 -moz-border-radius-bottomright: 8px;
338 border-bottom-right-radius: 8px; 797 border-bottom-right-radius: 8px;
339 -webkit-border-bottom-right-radius: 8px; 798 -webkit-border-bottom-right-radius: 8px;
340 -moz-border-radius-bottomright: 8px; 799 -moz-border-radius-bottomright: 8px;
341 border-bottom-right-radius: 8px; 800 border-bottom-right-radius: 8px;
342 -webkit-border-bottom-right-radius: 8px; 801 -webkit-border-bottom-right-radius: 8px;
343 -moz-border-radius-bottomright: 8px; 802 -moz-border-radius-bottomright: 8px;
344 border-bottom-right-radius: 8px; 803 border-bottom-right-radius: 8px;
345 -webkit-border-bottom-right-radius: 8px; 804 -webkit-border-bottom-right-radius: 8px;
346 -moz-border-radius-bottomright: 8px; 805 -moz-border-radius-bottomright: 8px;
347 border-bottom-right-radius: 8px; 806 border-bottom-right-radius: 8px;
348 -webkit-border-bottom-left-radius: 8px; 807 -webkit-border-bottom-left-radius: 8px;
349 -moz-border-radius-bottomleft: 8px; 808 -moz-border-radius-bottomleft: 8px;
350 border-bottom-left-radius: 8px; 809 border-bottom-left-radius: 8px;
351 -webkit-border-bottom-left-radius: 8px; 810 -webkit-border-bottom-left-radius: 8px;
352 -moz-border-radius-bottomleft: 8px; 811 -moz-border-radius-bottomleft: 8px;
353 border-bottom-left-radius: 8px; 812 border-bottom-left-radius: 8px;
354 -webkit-border-bottom-left-radius: 8px; 813 -webkit-border-bottom-left-radius: 8px;
355 -moz-border-radius-bottomleft: 8px; 814 -moz-border-radius-bottomleft: 8px;
356 border-bottom-left-radius: 8px; 815 border-bottom-left-radius: 8px;
357 -webkit-border-bottom-left-radius: 8px; 816 -webkit-border-bottom-left-radius: 8px;
358 -moz-border-radius-bottomleft: 8px; 817 -moz-border-radius-bottomleft: 8px;
359 border-bottom-left-radius: 8px; 818 border-bottom-left-radius: 8px;
819 -webkit-border-bottom-left-radius: 8px;
820 -moz-border-radius-bottomleft: 8px;
821 border-bottom-left-radius: 8px;
822 -webkit-border-bottom-left-radius: 8px;
823 -moz-border-radius-bottomleft: 8px;
824 border-bottom-left-radius: 8px;
825 -webkit-border-bottom-right-radius: 8px;
826 -moz-border-radius-bottomright: 8px;
827 border-bottom-right-radius: 8px;
828 -webkit-border-bottom-right-radius: 8px;
829 -moz-border-radius-bottomright: 8px;
830 border-bottom-right-radius: 8px;
360 -webkit-border-bottom-right-radius: 8px; 831 -webkit-border-bottom-right-radius: 8px;
361 -moz-border-radius-bottomright: 8px; 832 -moz-border-radius-bottomright: 8px;
362 border-bottom-right-radius: 8px; 833 border-bottom-right-radius: 8px;
363 -webkit-border-bottom-right-radius: 8px; 834 -webkit-border-bottom-right-radius: 8px;
364 -moz-border-radius-bottomright: 8px; 835 -moz-border-radius-bottomright: 8px;
365 border-bottom-right-radius: 8px; 836 border-bottom-right-radius: 8px;
366 -webkit-border-bottom-right-radius: 8px; 837 -webkit-border-bottom-right-radius: 8px;
367 -moz-border-radius-bottomright: 8px; 838 -moz-border-radius-bottomright: 8px;
368 border-bottom-right-radius: 8px; 839 border-bottom-right-radius: 8px;
369 -webkit-border-bottom-right-radius: 8px; 840 -webkit-border-bottom-right-radius: 8px;
370 -moz-border-radius-bottomright: 8px; 841 -moz-border-radius-bottomright: 8px;
371 border-bottom-right-radius: 8px; 842 border-bottom-right-radius: 8px;
372 -webkit-border-bottom-left-radius: 8px; 843 -webkit-border-bottom-left-radius: 8px;
373 -moz-border-radius-bottomleft: 8px; 844 -moz-border-radius-bottomleft: 8px;
374 border-bottom-left-radius: 8px; 845 border-bottom-left-radius: 8px;
375 -webkit-border-bottom-left-radius: 8px; 846 -webkit-border-bottom-left-radius: 8px;
376 -moz-border-radius-bottomleft: 8px; 847 -moz-border-radius-bottomleft: 8px;
377 border-bottom-left-radius: 8px; 848 border-bottom-left-radius: 8px;
378 -webkit-border-bottom-left-radius: 8px; 849 -webkit-border-bottom-left-radius: 8px;
379 -moz-border-radius-bottomleft: 8px; 850 -moz-border-radius-bottomleft: 8px;
380 border-bottom-left-radius: 8px; 851 border-bottom-left-radius: 8px;
381 -webkit-border-bottom-left-radius: 8px; 852 -webkit-border-bottom-left-radius: 8px;
382 -moz-border-radius-bottomleft: 8px; 853 -moz-border-radius-bottomleft: 8px;
383 border-bottom-left-radius: 8px; 854 border-bottom-left-radius: 8px;
855 -webkit-border-bottom-left-radius: 8px;
856 -moz-border-radius-bottomleft: 8px;
857 border-bottom-left-radius: 8px;
858 -webkit-border-bottom-left-radius: 8px;
859 -moz-border-radius-bottomleft: 8px;
860 border-bottom-left-radius: 8px;
861 -webkit-border-bottom-right-radius: 8px;
862 -moz-border-radius-bottomright: 8px;
863 border-bottom-right-radius: 8px;
864 -webkit-border-bottom-right-radius: 8px;
865 -moz-border-radius-bottomright: 8px;
866 border-bottom-right-radius: 8px;
384 -webkit-border-bottom-right-radius: 8px; 867 -webkit-border-bottom-right-radius: 8px;
385 -moz-border-radius-bottomright: 8px; 868 -moz-border-radius-bottomright: 8px;
386 border-bottom-right-radius: 8px; 869 border-bottom-right-radius: 8px;
387 -webkit-border-bottom-right-radius: 8px; 870 -webkit-border-bottom-right-radius: 8px;
388 -moz-border-radius-bottomright: 8px; 871 -moz-border-radius-bottomright: 8px;
389 border-bottom-right-radius: 8px; 872 border-bottom-right-radius: 8px;
390 -webkit-border-bottom-right-radius: 8px; 873 -webkit-border-bottom-right-radius: 8px;
391 -moz-border-radius-bottomright: 8px; 874 -moz-border-radius-bottomright: 8px;
392 border-bottom-right-radius: 8px; 875 border-bottom-right-radius: 8px;
393 -webkit-border-bottom-right-radius: 8px; 876 -webkit-border-bottom-right-radius: 8px;
394 -moz-border-radius-bottomright: 8px; 877 -moz-border-radius-bottomright: 8px;
395 border-bottom-right-radius: 8px; 878 border-bottom-right-radius: 8px;
396 -webkit-border-bottom-left-radius: 8px; 879 -webkit-border-bottom-left-radius: 8px;
397 -moz-border-radius-bottomleft: 8px; 880 -moz-border-radius-bottomleft: 8px;
398 border-bottom-left-radius: 8px; 881 border-bottom-left-radius: 8px;
399 -webkit-border-bottom-left-radius: 8px; 882 -webkit-border-bottom-left-radius: 8px;
400 -moz-border-radius-bottomleft: 8px; 883 -moz-border-radius-bottomleft: 8px;
401 border-bottom-left-radius: 8px; 884 border-bottom-left-radius: 8px;
402 -webkit-border-bottom-left-radius: 8px; 885 -webkit-border-bottom-left-radius: 8px;
403 -moz-border-radius-bottomleft: 8px; 886 -moz-border-radius-bottomleft: 8px;
404 border-bottom-left-radius: 8px; 887 border-bottom-left-radius: 8px;
405 -webkit-border-bottom-left-radius: 8px; 888 -webkit-border-bottom-left-radius: 8px;
406 -moz-border-radius-bottomleft: 8px; 889 -moz-border-radius-bottomleft: 8px;
407 border-bottom-left-radius: 8px; 890 border-bottom-left-radius: 8px;
891 -webkit-border-bottom-left-radius: 8px;
892 -moz-border-radius-bottomleft: 8px;
893 border-bottom-left-radius: 8px;
894 -webkit-border-bottom-left-radius: 8px;
895 -moz-border-radius-bottomleft: 8px;
896 border-bottom-left-radius: 8px;
897 -webkit-border-bottom-right-radius: 8px;
898 -moz-border-radius-bottomright: 8px;
899 border-bottom-right-radius: 8px;
900 -webkit-border-bottom-right-radius: 8px;
901 -moz-border-radius-bottomright: 8px;
902 border-bottom-right-radius: 8px;
903 -webkit-border-bottom-right-radius: 8px;
904 -moz-border-radius-bottomright: 8px;
905 border-bottom-right-radius: 8px;
906 -webkit-border-bottom-right-radius: 8px;
907 -moz-border-radius-bottomright: 8px;
908 border-bottom-right-radius: 8px;
408 -webkit-border-bottom-right-radius: 8px; 909 -webkit-border-bottom-right-radius: 8px;
409 -moz-border-radius-bottomright: 8px; 910 -moz-border-radius-bottomright: 8px;
410 border-bottom-right-radius: 8px; 911 border-bottom-right-radius: 8px;
411 -webkit-border-bottom-right-radius: 8px; 912 -webkit-border-bottom-right-radius: 8px;
412 -moz-border-radius-bottomright: 8px; 913 -moz-border-radius-bottomright: 8px;
413 border-bottom-right-radius: 8px; 914 border-bottom-right-radius: 8px;
915 -webkit-border-bottom-left-radius: 8px;
916 -moz-border-radius-bottomleft: 8px;
917 border-bottom-left-radius: 8px;
918 -webkit-border-bottom-left-radius: 8px;
919 -moz-border-radius-bottomleft: 8px;
920 border-bottom-left-radius: 8px;
921 -webkit-border-bottom-left-radius: 8px;
922 -moz-border-radius-bottomleft: 8px;
923 border-bottom-left-radius: 8px;
924 -webkit-border-bottom-left-radius: 8px;
925 -moz-border-radius-bottomleft: 8px;
926 border-bottom-left-radius: 8px;
927 -webkit-border-bottom-left-radius: 8px;
928 -moz-border-radius-bottomleft: 8px;
929 border-bottom-left-radius: 8px;
930 -webkit-border-bottom-left-radius: 8px;
931 -moz-border-radius-bottomleft: 8px;
932 border-bottom-left-radius: 8px;
933 -webkit-border-bottom-right-radius: 8px;
934 -moz-border-radius-bottomright: 8px;
935 border-bottom-right-radius: 8px;
414 -webkit-border-bottom-right-radius: 8px; 936 -webkit-border-bottom-right-radius: 8px;
415 -moz-border-radius-bottomright: 8px; 937 -moz-border-radius-bottomright: 8px;
416 border-bottom-right-radius: 8px; 938 border-bottom-right-radius: 8px;
417 -webkit-border-bottom-right-radius: 8px; 939 -webkit-border-bottom-right-radius: 8px;
418 -moz-border-radius-bottomright: 8px; 940 -moz-border-radius-bottomright: 8px;
419 border-bottom-right-radius: 8px; 941 border-bottom-right-radius: 8px;
420 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 942 -webkit-border-bottom-right-radius: 8px;
421 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 943 -moz-border-radius-bottomright: 8px;
422 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 944 border-bottom-right-radius: 8px;
423 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 945 -webkit-border-bottom-right-radius: 8px;
424 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 946 -moz-border-radius-bottomright: 8px;
425 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 947 border-bottom-right-radius: 8px;
426 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 948 -webkit-border-bottom-right-radius: 8px;
427 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 949 -moz-border-radius-bottomright: 8px;
428 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 950 border-bottom-right-radius: 8px;
429 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 951 -webkit-border-bottom-left-radius: 8px;
430 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 952 -moz-border-radius-bottomleft: 8px;
431 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6); 953 border-bottom-left-radius: 8px;
954 -webkit-border-bottom-left-radius: 8px;
955 -moz-border-radius-bottomleft: 8px;
956 border-bottom-left-radius: 8px;
957 -webkit-border-bottom-left-radius: 8px;
958 -moz-border-radius-bottomleft: 8px;
959 border-bottom-left-radius: 8px;
960 -webkit-border-bottom-left-radius: 8px;
961 -moz-border-radius-bottomleft: 8px;
962 border-bottom-left-radius: 8px;
963 -webkit-border-bottom-left-radius: 8px;
964 -moz-border-radius-bottomleft: 8px;
965 border-bottom-left-radius: 8px;
966 -webkit-border-bottom-left-radius: 8px;
967 -moz-border-radius-bottomleft: 8px;
968 border-bottom-left-radius: 8px;
969 -webkit-border-bottom-right-radius: 8px;
970 -moz-border-radius-bottomright: 8px;
971 border-bottom-right-radius: 8px;
972 -webkit-border-bottom-right-radius: 8px;
973 -moz-border-radius-bottomright: 8px;
974 border-bottom-right-radius: 8px;
975 -webkit-border-bottom-right-radius: 8px;
976 -moz-border-radius-bottomright: 8px;
977 border-bottom-right-radius: 8px;
978 -webkit-border-bottom-right-radius: 8px;
979 -moz-border-radius-bottomright: 8px;
980 border-bottom-right-radius: 8px;
981 -webkit-border-bottom-right-radius: 8px;
982 -moz-border-radius-bottomright: 8px;
983 border-bottom-right-radius: 8px;
984 -webkit-border-bottom-right-radius: 8px;
985 -moz-border-radius-bottomright: 8px;
986 border-bottom-right-radius: 8px;
987 -webkit-box-shadow: 2px 2px 9px #333333;
988 -moz-box-shadow: 2px 2px 9px #333333;
989 box-shadow: 2px 2px 9px #333333;
990 -webkit-box-shadow: 2px 2px 9px #333333;
991 -moz-box-shadow: 2px 2px 9px #333333;
992 box-shadow: 2px 2px 9px #333333;
993 -webkit-box-shadow: 2px 2px 9px #333333;
994 -moz-box-shadow: 2px 2px 9px #333333;
995 box-shadow: 2px 2px 9px #333333;
996 -webkit-box-shadow: 2px 2px 9px #333333;
997 -moz-box-shadow: 2px 2px 9px #333333;
998 box-shadow: 2px 2px 9px #333333;
999 -webkit-box-shadow: 2px 2px 9px #333333;
1000 -moz-box-shadow: 2px 2px 9px #333333;
1001 box-shadow: 2px 2px 9px #333333;
1002 -webkit-box-shadow: 2px 2px 9px #333333;
1003 -moz-box-shadow: 2px 2px 9px #333333;
1004 box-shadow: 2px 2px 9px #333333;
432} 1005}
433div.pageHeader div#news div#newsframe { 1006div.pageHeader div#news div#newsframe {
434 margin-left: 10px; 1007 margin-left: 10px;
435 margin-right: 10px; 1008 margin-right: 10px;
436 height: 75px; 1009 height: 75px;
437 overflow: hidden; 1010 overflow: hidden;
438} 1011}
439div.pageHeader div#news div#newsframe iframe { 1012div.pageHeader div#news div#newsframe iframe {
440 width: 290px; 1013 width: 290px;
441 border: 0px; 1014 border: 0px;
442 color: #616475; 1015 color: #616475;
443 background-color: #616475; 1016 background-color: #616475;
444} 1017}
445div.pageHeader div#news div.grip { 1018div.pageHeader div#news div.grip {
446 width: 310px; 1019 width: 310px;
447 height: 12px; 1020 height: 12px;
448 margin-top: 2px; 1021 margin-top: 2px;
449 cursor: pointer; 1022 cursor: pointer;
450} 1023}
451div.pageHeader div#news div.grip div.gripHandler { 1024div.pageHeader div#news div.grip div.gripHandler {
452 margin-left: auto; 1025 margin-left: auto;
453 margin-right: auto; 1026 margin-right: auto;
454 margin-top: 8px; 1027 margin-top: 8px;
455 width: 0; 1028 width: 0;
456 height: 0; 1029 height: 0;
457 border-left: 5px solid transparent; 1030 border-left: 5px solid transparent;
458 border-right: 5px solid transparent; 1031 border-right: 5px solid transparent;
459} 1032}
460div.pageHeader div#news.open div.grip div.gripHandler { 1033div.pageHeader div#news.open div.grip div.gripHandler {
461 border-bottom: 5px solid #e9e9ec; 1034 border-bottom: 5px solid #e9e9ec;
462} 1035}
463div.pageHeader div#news.hidden div.grip div.gripHandler { 1036div.pageHeader div#news.hidden div.grip div.gripHandler {
464 border-top: 5px solid #e9e9ec; 1037 border-top: 5px solid #e9e9ec;
465} 1038}
466div.pageFooter { 1039div.pageFooter {
467 margin-top: -90px; 1040 margin-top: -90px;
468 height: 90px; 1041 height: 90px;
469 clear: both; 1042 clear: both;
470} 1043}
471div.pageFooter div.footerWrapper { 1044div.pageFooter div.footerWrapper {
472 clear: both; 1045 clear: both;
473 padding-top: 10px; 1046 padding-top: 10px;
474} 1047}
475div.pageFooter div.footerWrapper div.footerContent { 1048div.pageFooter div.footerWrapper div.footerContent {
476 background-color: #eaebe6; 1049 background-color: #eaebe6;
477 padding: 20px; 1050 padding: 20px;
478 font-size: 8pt; 1051 font-size: 8pt;
479} 1052}
480div.pageFooter div.footerWrapper div.footerContent canvas.footerStarIcon { 1053div.pageFooter div.footerWrapper div.footerContent canvas.footerStarIcon {
481 width: 40px; 1054 width: 40px;
482 height: 40px; 1055 height: 40px;
483 float: left; 1056 float: left;
484} 1057}
485div.pageFooter div.footerWrapper div.footerContent span.copyright { 1058div.pageFooter div.footerWrapper div.footerContent span.copyright {
486 padding-left: 10px; 1059 padding-left: 10px;
487 color: #a0a0a0; 1060 color: #a0a0a0;
488} 1061}
489div.pageFooter div.footerWrapper div.footerContent a { 1062div.pageFooter div.footerWrapper div.footerContent a {
490 padding-left: 50px; 1063 padding-left: 50px;
491 display: block; 1064 display: block;
492 color: #888888; 1065 color: #888888;
493 font-weight: bold; 1066 font-weight: bold;
494 text-decoration: none; 1067 text-decoration: none;
495} 1068}
496div.pageFooter div.footerWrapper div.footerContent span.applicationVersion { 1069div.pageFooter div.footerWrapper div.footerContent span.applicationVersion {
497 padding: 8px; 1070 padding: 8px;
498 color: #888888; 1071 color: #888888;
499 background-color: #d2d2d2; 1072 background-color: #d2d2d2;
500 position: relative; 1073 position: relative;
501 top: -40px; 1074 top: -40px;
502 float: right; 1075 float: right;
503} 1076}
504/* 1077/*
505 1078
506Color list: 1079Color list:
507- login box: 1080- login box:
508 light#ff9955 1081 light#ff9955
509 dark#ff6622 1082 dark#ff6622
510- login button: 1083- login button:
511 regular#dd5500 1084 regular#dd5500
512 hover#773311 1085 hover#773311
513- login translations: 1086- login translations:
514 box: #cc6622; 1087 box: #cc6622;
515 not-selected: 1088 not-selected:
516 color: #ddaa99 1089 color: #ddaa99
517 background:#994422 1090 background:#994422
518 selected: #772211; 1091 selected: #772211;
519*/ 1092*/
520html { 1093html {
521 height: 100%; 1094 height: 100%;
522} 1095}
523body { 1096body {
524 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 1097 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
525 margin: 0px; 1098 margin: 0px;
526} 1099}
1100div.modalDialogMask.userInfoBoxMask {
1101 -moz-opacity: 0.0;
1102 opacity: .0;
1103 filter: alpha(opacity=0);
1104 z-index: 19000;
1105}
527.reset-margin { 1106.reset-margin {
528 margin: 0px; 1107 margin: 0px;
529 padding: 0px; 1108 padding: 0px;
530 border: 0px; 1109 border: 0px;
531} 1110}
532.clear { 1111.clear {
533 clear: both; 1112 clear: both;
534} 1113}
535.hidden_none { 1114.hidden_none {
536 display: none; 1115 display: none;
537 visibility: hidden; 1116 visibility: hidden;
538} 1117}
539.keepTogether { 1118.keepTogether {
540 display: inline-block; 1119 display: inline-block;
541 white-space: nowrap; 1120 white-space: nowrap;
542} 1121}
543#mainDiv { 1122#mainDiv {
544 margin: 0 auto; 1123 margin: 0 auto;
545} 1124}
546div#loginBox { 1125div#loginBox {
547 width: 273px; 1126 width: 273px;
548 z-index: 19000; 1127 z-index: 19000;
549 top: -30px; 1128 top: -30px;
550 right: 30px; 1129 right: 30px;
551 position: relative; 1130 position: relative;
552 float: right; 1131 float: right;
553} 1132}
554div#loginBox div.header { 1133div#loginBox div.header {
555 height: 25px; 1134 height: 25px;
556 width: 273px; 1135 width: 273px;
557 background-color: #ff9b5a; 1136 background-color: #ff9b5a;
558 -webkit-border-top-left-radius: 20px; 1137 -webkit-border-top-left-radius: 20px;
559 -moz-border-radius-topleft: 20px; 1138 -moz-border-radius-topleft: 20px;
560 border-top-left-radius: 20px; 1139 border-top-left-radius: 20px;
561 -webkit-border-top-left-radius: 20px; 1140 -webkit-border-top-left-radius: 20px;
562 -moz-border-radius-topleft: 20px; 1141 -moz-border-radius-topleft: 20px;
563 border-top-left-radius: 20px; 1142 border-top-left-radius: 20px;
564 -webkit-border-top-left-radius: 20px; 1143 -webkit-border-top-left-radius: 20px;
565 -moz-border-radius-topleft: 20px; 1144 -moz-border-radius-topleft: 20px;
566 border-top-left-radius: 20px; 1145 border-top-left-radius: 20px;
567 -webkit-border-top-left-radius: 20px; 1146 -webkit-border-top-left-radius: 20px;
568 -moz-border-radius-topleft: 20px; 1147 -moz-border-radius-topleft: 20px;
569 border-top-left-radius: 20px; 1148 border-top-left-radius: 20px;
1149 -webkit-border-top-left-radius: 20px;
1150 -moz-border-radius-topleft: 20px;
1151 border-top-left-radius: 20px;
1152 -webkit-border-top-left-radius: 20px;
1153 -moz-border-radius-topleft: 20px;
1154 border-top-left-radius: 20px;
1155 -webkit-border-top-right-radius: 20px;
1156 -moz-border-radius-topright: 20px;
1157 border-top-right-radius: 20px;
1158 -webkit-border-top-right-radius: 20px;
1159 -moz-border-radius-topright: 20px;
1160 border-top-right-radius: 20px;
1161 -webkit-border-top-right-radius: 20px;
1162 -moz-border-radius-topright: 20px;
1163 border-top-right-radius: 20px;
1164 -webkit-border-top-right-radius: 20px;
1165 -moz-border-radius-topright: 20px;
1166 border-top-right-radius: 20px;
1167 -webkit-border-top-right-radius: 20px;
1168 -moz-border-radius-topright: 20px;
1169 border-top-right-radius: 20px;
1170 -webkit-border-top-right-radius: 20px;
1171 -moz-border-radius-topright: 20px;
1172 border-top-right-radius: 20px;
1173 -webkit-border-top-left-radius: 20px;
1174 -moz-border-radius-topleft: 20px;
1175 border-top-left-radius: 20px;
1176 -webkit-border-top-left-radius: 20px;
1177 -moz-border-radius-topleft: 20px;
1178 border-top-left-radius: 20px;
1179 -webkit-border-top-left-radius: 20px;
1180 -moz-border-radius-topleft: 20px;
1181 border-top-left-radius: 20px;
1182 -webkit-border-top-left-radius: 20px;
1183 -moz-border-radius-topleft: 20px;
1184 border-top-left-radius: 20px;
1185 -webkit-border-top-left-radius: 20px;
1186 -moz-border-radius-topleft: 20px;
1187 border-top-left-radius: 20px;
1188 -webkit-border-top-left-radius: 20px;
1189 -moz-border-radius-topleft: 20px;
1190 border-top-left-radius: 20px;
1191 -webkit-border-top-right-radius: 20px;
1192 -moz-border-radius-topright: 20px;
1193 border-top-right-radius: 20px;
1194 -webkit-border-top-right-radius: 20px;
1195 -moz-border-radius-topright: 20px;
1196 border-top-right-radius: 20px;
1197 -webkit-border-top-right-radius: 20px;
1198 -moz-border-radius-topright: 20px;
1199 border-top-right-radius: 20px;
1200 -webkit-border-top-right-radius: 20px;
1201 -moz-border-radius-topright: 20px;
1202 border-top-right-radius: 20px;
1203 -webkit-border-top-right-radius: 20px;
1204 -moz-border-radius-topright: 20px;
1205 border-top-right-radius: 20px;
1206 -webkit-border-top-right-radius: 20px;
1207 -moz-border-radius-topright: 20px;
1208 border-top-right-radius: 20px;
1209 -webkit-border-top-left-radius: 20px;
1210 -moz-border-radius-topleft: 20px;
1211 border-top-left-radius: 20px;
1212 -webkit-border-top-left-radius: 20px;
1213 -moz-border-radius-topleft: 20px;
1214 border-top-left-radius: 20px;
1215 -webkit-border-top-left-radius: 20px;
1216 -moz-border-radius-topleft: 20px;
1217 border-top-left-radius: 20px;
1218 -webkit-border-top-left-radius: 20px;
1219 -moz-border-radius-topleft: 20px;
1220 border-top-left-radius: 20px;
1221 -webkit-border-top-left-radius: 20px;
1222 -moz-border-radius-topleft: 20px;
1223 border-top-left-radius: 20px;
1224 -webkit-border-top-left-radius: 20px;
1225 -moz-border-radius-topleft: 20px;
1226 border-top-left-radius: 20px;
570 -webkit-border-top-right-radius: 20px; 1227 -webkit-border-top-right-radius: 20px;
571 -moz-border-radius-topright: 20px; 1228 -moz-border-radius-topright: 20px;
572 border-top-right-radius: 20px; 1229 border-top-right-radius: 20px;
573 -webkit-border-top-right-radius: 20px; 1230 -webkit-border-top-right-radius: 20px;
574 -moz-border-radius-topright: 20px; 1231 -moz-border-radius-topright: 20px;
575 border-top-right-radius: 20px; 1232 border-top-right-radius: 20px;
576 -webkit-border-top-right-radius: 20px; 1233 -webkit-border-top-right-radius: 20px;
577 -moz-border-radius-topright: 20px; 1234 -moz-border-radius-topright: 20px;
578 border-top-right-radius: 20px; 1235 border-top-right-radius: 20px;
579 -webkit-border-top-right-radius: 20px; 1236 -webkit-border-top-right-radius: 20px;
580 -moz-border-radius-topright: 20px; 1237 -moz-border-radius-topright: 20px;
581 border-top-right-radius: 20px; 1238 border-top-right-radius: 20px;
1239 -webkit-border-top-right-radius: 20px;
1240 -moz-border-radius-topright: 20px;
1241 border-top-right-radius: 20px;
1242 -webkit-border-top-right-radius: 20px;
1243 -moz-border-radius-topright: 20px;
1244 border-top-right-radius: 20px;
1245 -webkit-border-top-left-radius: 20px;
1246 -moz-border-radius-topleft: 20px;
1247 border-top-left-radius: 20px;
582 -webkit-border-top-left-radius: 20px; 1248 -webkit-border-top-left-radius: 20px;
583 -moz-border-radius-topleft: 20px; 1249 -moz-border-radius-topleft: 20px;
584 border-top-left-radius: 20px; 1250 border-top-left-radius: 20px;
585 -webkit-border-top-left-radius: 20px; 1251 -webkit-border-top-left-radius: 20px;
586 -moz-border-radius-topleft: 20px; 1252 -moz-border-radius-topleft: 20px;
587 border-top-left-radius: 20px; 1253 border-top-left-radius: 20px;
588 -webkit-border-top-left-radius: 20px; 1254 -webkit-border-top-left-radius: 20px;
589 -moz-border-radius-topleft: 20px; 1255 -moz-border-radius-topleft: 20px;
590 border-top-left-radius: 20px; 1256 border-top-left-radius: 20px;
591 -webkit-border-top-left-radius: 20px; 1257 -webkit-border-top-left-radius: 20px;
592 -moz-border-radius-topleft: 20px; 1258 -moz-border-radius-topleft: 20px;
593 border-top-left-radius: 20px; 1259 border-top-left-radius: 20px;
1260 -webkit-border-top-left-radius: 20px;
1261 -moz-border-radius-topleft: 20px;
1262 border-top-left-radius: 20px;
1263 -webkit-border-top-right-radius: 20px;
1264 -moz-border-radius-topright: 20px;
1265 border-top-right-radius: 20px;
594 -webkit-border-top-right-radius: 20px; 1266 -webkit-border-top-right-radius: 20px;
595 -moz-border-radius-topright: 20px; 1267 -moz-border-radius-topright: 20px;
596 border-top-right-radius: 20px; 1268 border-top-right-radius: 20px;
597 -webkit-border-top-right-radius: 20px; 1269 -webkit-border-top-right-radius: 20px;
598 -moz-border-radius-topright: 20px; 1270 -moz-border-radius-topright: 20px;
599 border-top-right-radius: 20px; 1271 border-top-right-radius: 20px;
600 -webkit-border-top-right-radius: 20px; 1272 -webkit-border-top-right-radius: 20px;
601 -moz-border-radius-topright: 20px; 1273 -moz-border-radius-topright: 20px;
602 border-top-right-radius: 20px; 1274 border-top-right-radius: 20px;
603 -webkit-border-top-right-radius: 20px; 1275 -webkit-border-top-right-radius: 20px;
604 -moz-border-radius-topright: 20px; 1276 -moz-border-radius-topright: 20px;
605 border-top-right-radius: 20px; 1277 border-top-right-radius: 20px;
1278 -webkit-border-top-right-radius: 20px;
1279 -moz-border-radius-topright: 20px;
1280 border-top-right-radius: 20px;
1281 -webkit-border-top-left-radius: 20px;
1282 -moz-border-radius-topleft: 20px;
1283 border-top-left-radius: 20px;
1284 -webkit-border-top-left-radius: 20px;
1285 -moz-border-radius-topleft: 20px;
1286 border-top-left-radius: 20px;
606 -webkit-border-top-left-radius: 20px; 1287 -webkit-border-top-left-radius: 20px;
607 -moz-border-radius-topleft: 20px; 1288 -moz-border-radius-topleft: 20px;
608 border-top-left-radius: 20px; 1289 border-top-left-radius: 20px;
609 -webkit-border-top-left-radius: 20px; 1290 -webkit-border-top-left-radius: 20px;
610 -moz-border-radius-topleft: 20px; 1291 -moz-border-radius-topleft: 20px;
611 border-top-left-radius: 20px; 1292 border-top-left-radius: 20px;
612 -webkit-border-top-left-radius: 20px; 1293 -webkit-border-top-left-radius: 20px;
613 -moz-border-radius-topleft: 20px; 1294 -moz-border-radius-topleft: 20px;
614 border-top-left-radius: 20px; 1295 border-top-left-radius: 20px;
615 -webkit-border-top-left-radius: 20px; 1296 -webkit-border-top-left-radius: 20px;
616 -moz-border-radius-topleft: 20px; 1297 -moz-border-radius-topleft: 20px;
617 border-top-left-radius: 20px; 1298 border-top-left-radius: 20px;
618 -webkit-border-top-right-radius: 20px; 1299 -webkit-border-top-right-radius: 20px;
619 -moz-border-radius-topright: 20px; 1300 -moz-border-radius-topright: 20px;
620 border-top-right-radius: 20px; 1301 border-top-right-radius: 20px;
621 -webkit-border-top-right-radius: 20px; 1302 -webkit-border-top-right-radius: 20px;
622 -moz-border-radius-topright: 20px; 1303 -moz-border-radius-topright: 20px;
623 border-top-right-radius: 20px; 1304 border-top-right-radius: 20px;
624 -webkit-border-top-right-radius: 20px; 1305 -webkit-border-top-right-radius: 20px;
625 -moz-border-radius-topright: 20px; 1306 -moz-border-radius-topright: 20px;
626 border-top-right-radius: 20px; 1307 border-top-right-radius: 20px;
627 -webkit-border-top-right-radius: 20px; 1308 -webkit-border-top-right-radius: 20px;
628 -moz-border-radius-topright: 20px; 1309 -moz-border-radius-topright: 20px;
629 border-top-right-radius: 20px; 1310 border-top-right-radius: 20px;
1311 -webkit-border-top-right-radius: 20px;
1312 -moz-border-radius-topright: 20px;
1313 border-top-right-radius: 20px;
1314 -webkit-border-top-right-radius: 20px;
1315 -moz-border-radius-topright: 20px;
1316 border-top-right-radius: 20px;
630 -webkit-border-top-left-radius: 20px; 1317 -webkit-border-top-left-radius: 20px;
631 -moz-border-radius-topleft: 20px; 1318 -moz-border-radius-topleft: 20px;
632 border-top-left-radius: 20px; 1319 border-top-left-radius: 20px;
633 -webkit-border-top-left-radius: 20px; 1320 -webkit-border-top-left-radius: 20px;
634 -moz-border-radius-topleft: 20px; 1321 -moz-border-radius-topleft: 20px;
635 border-top-left-radius: 20px; 1322 border-top-left-radius: 20px;
636 -webkit-border-top-left-radius: 20px; 1323 -webkit-border-top-left-radius: 20px;
637 -moz-border-radius-topleft: 20px; 1324 -moz-border-radius-topleft: 20px;
638 border-top-left-radius: 20px; 1325 border-top-left-radius: 20px;
639 -webkit-border-top-left-radius: 20px; 1326 -webkit-border-top-left-radius: 20px;
640 -moz-border-radius-topleft: 20px; 1327 -moz-border-radius-topleft: 20px;
641 border-top-left-radius: 20px; 1328 border-top-left-radius: 20px;
1329 -webkit-border-top-left-radius: 20px;
1330 -moz-border-radius-topleft: 20px;
1331 border-top-left-radius: 20px;
1332 -webkit-border-top-left-radius: 20px;
1333 -moz-border-radius-topleft: 20px;
1334 border-top-left-radius: 20px;
1335 -webkit-border-top-right-radius: 20px;
1336 -moz-border-radius-topright: 20px;
1337 border-top-right-radius: 20px;
1338 -webkit-border-top-right-radius: 20px;
1339 -moz-border-radius-topright: 20px;
1340 border-top-right-radius: 20px;
642 -webkit-border-top-right-radius: 20px; 1341 -webkit-border-top-right-radius: 20px;
643 -moz-border-radius-topright: 20px; 1342 -moz-border-radius-topright: 20px;
644 border-top-right-radius: 20px; 1343 border-top-right-radius: 20px;
645 -webkit-border-top-right-radius: 20px; 1344 -webkit-border-top-right-radius: 20px;
646 -moz-border-radius-topright: 20px; 1345 -moz-border-radius-topright: 20px;
647 border-top-right-radius: 20px; 1346 border-top-right-radius: 20px;
648 -webkit-border-top-right-radius: 20px; 1347 -webkit-border-top-right-radius: 20px;
649 -moz-border-radius-topright: 20px; 1348 -moz-border-radius-topright: 20px;
650 border-top-right-radius: 20px; 1349 border-top-right-radius: 20px;
651 -webkit-border-top-right-radius: 20px; 1350 -webkit-border-top-right-radius: 20px;
652 -moz-border-radius-topright: 20px; 1351 -moz-border-radius-topright: 20px;
653 border-top-right-radius: 20px; 1352 border-top-right-radius: 20px;
654} 1353}
655div#loginBox div.body { 1354div#loginBox div.body {
656 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622)); 1355 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
657 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a); 1356 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
658 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622)); 1357 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
659 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a); 1358 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
660 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622)); 1359 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
661 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a); 1360 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
662 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622)); 1361 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
663 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a); 1362 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
1363 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
1364 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
1365 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
1366 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
664} 1367}
665div#loginBox div.body h4 { 1368div#loginBox div.body h4 {
666 color: #ffffff; 1369 color: #ffffff;
667 font-size: 16pt; 1370 font-size: 16pt;
668 font-weight: normal; 1371 font-weight: normal;
669 padding-left: 20px; 1372 padding-left: 20px;
670 margin: 0px; 1373 margin: 0px;
671} 1374}
672div#loginBox div.body form.loginForm { 1375div#loginBox div.body form.loginForm {
673 padding: 5px 20px 0px; 1376 padding: 5px 20px 0px;
674 margin-bottom: 0px; 1377 margin-bottom: 0px;
675} 1378}
676div#loginBox div.body form.loginForm label { 1379div#loginBox div.body form.loginForm label {
677 color: #ffffff; 1380 color: #ffffff;
678 font-size: 10pt; 1381 font-size: 10pt;
679 display: block; 1382 display: block;
680 padding-top: 5px; 1383 padding-top: 5px;
681} 1384}
682div#loginBox div.body form.loginForm label.checkbox { 1385div#loginBox div.body form.loginForm label.checkbox {
683 display: inline; 1386 display: inline;
684} 1387}
685div#loginBox div.body form.loginForm input { 1388div#loginBox div.body form.loginForm input {
686 width: 230px; 1389 width: 230px;
687 font-size: 14pt; 1390 font-size: 14pt;
688 color: #333366; 1391 color: #333366;
689 background-color: #ffffff; 1392 background-color: #ffffff;
690 border: 1px solid #bb4924; 1393 border: 1px solid #bb4924;
691 padding: 2px 5px; 1394 padding: 2px 5px;
692 height: 28px; 1395 height: 28px;
693} 1396}
694div#loginBox div.body form.loginForm input.checkbox { 1397div#loginBox div.body form.loginForm input.checkbox {
695 margin: 10px 8px 0px 0px; 1398 margin: 10px 8px 0px 0px;
696 height: auto; 1399 height: auto;
697 width: auto; 1400 width: auto;
698 border: 0px; 1401 border: 0px;
699} 1402}
700div#loginBox div.body form.loginForm input.checkbox:hover { 1403div#loginBox div.body form.loginForm input.checkbox:hover {
701 cursor: pointer; 1404 cursor: pointer;
702} 1405}
703div#loginBox div.body form.loginForm input.otp { 1406div#loginBox div.body form.loginForm input.otp {
704 width: 57px; 1407 width: 57px;
705 display: inline; 1408 display: inline;
706 padding-left: 0px; 1409 padding-left: 0px;
707 padding-right: 0px; 1410 padding-right: 0px;
708 height: 28px; 1411 height: 28px;
709 font: 8pt monospace; 1412 font: 8pt monospace;
710} 1413}
711div#loginBox div.body form.loginForm input.submit { 1414div#loginBox div.body form.loginForm input.submit {
712 margin: 0px 45px; 1415 margin: 0px 45px;
713 width: 140px; 1416 width: 140px;
714 color: #ffffff; 1417 color: #ffffff;
715 background-color: #d44100; 1418 background-color: #d44100;
716 border: 1px solid #bb4924; 1419 border: 1px solid #bb4924;
717 padding: 6px; 1420 padding: 6px;
718 font-size: 12pt; 1421 font-size: 12pt;
719 height: auto; 1422 height: auto;
720} 1423}
721div#loginBox div.body form.loginForm input.submit:hover { 1424div#loginBox div.body form.loginForm input.submit:hover {
722 color: #ffffff; 1425 color: #ffffff;
723 background-color: #7e2700; 1426 background-color: #7e2700;
724 cursor: pointer; 1427 cursor: pointer;
725} 1428}
726div#loginBox div.body form.loginForm ul { 1429div#loginBox div.body form.loginForm ul {
727 list-style-type: none; 1430 list-style-type: none;
728 padding: 0px; 1431 padding: 0px;
729 margin: 0px; 1432 margin: 0px;
730} 1433}
731div#loginBox div.body form.loginForm ul li { 1434div#loginBox div.body form.loginForm ul li {
732 display: block; 1435 display: block;
733} 1436}
734div#loginBox div.body form.loginForm div.translations { 1437div#loginBox div.body form.loginForm div.translations {
735 margin: 15px -20px; 1438 margin: 15px -20px;
736 background-color: #c87b59; 1439 background-color: #c87b59;
737} 1440}
738div#loginBox div.body form.loginForm div.translations h4 { 1441div#loginBox div.body form.loginForm div.translations h4 {
739 font-size: 9pt; 1442 font-size: 9pt;
740 padding: 6px 20px 0px; 1443 padding: 6px 20px 0px;
741} 1444}
742div#loginBox div.body form.loginForm div.translations ul { 1445div#loginBox div.body form.loginForm div.translations ul {
743 margin: 0px; 1446 margin: 0px;
744 padding: 5px 10px 10px; 1447 padding: 5px 10px 10px;
745 margin-bottom: 15px; 1448 margin-bottom: 15px;
746} 1449}
747div#loginBox div.body form.loginForm div.translations ul li { 1450div#loginBox div.body form.loginForm div.translations ul li {
748 font-size: 8pt; 1451 font-size: 8pt;
749 color: #ddaa99; 1452 color: #ddaa99;
750 background-color: #994422; 1453 background-color: #994422;
751 display: inline-block; 1454 display: inline-block;
752 padding: 2px 4px; 1455 padding: 2px 4px;
753 margin: 1px; 1456 margin: 1px;
754} 1457}
755div#loginBox div.body form.loginForm div.translations ul li.selected { 1458div#loginBox div.body form.loginForm div.translations ul li.selected {
756 color: #ffffff; 1459 color: #ffffff;
757 background-color: #772211; 1460 background-color: #772211;
758} 1461}
759div#loginBox div.body form.loginForm div.translations ul li.selected:hover { 1462div#loginBox div.body form.loginForm div.translations ul li.selected:hover {
760 cursor: default; 1463 cursor: default;
761} 1464}
762div#loginBox div.body form.loginForm div.translations ul li:hover { 1465div#loginBox div.body form.loginForm div.translations ul li:hover {
763 cursor: pointer; 1466 cursor: pointer;
764 color: #ffffff; 1467 color: #ffffff;
765} 1468}
766div#loginBox div.footer { 1469div#loginBox div.footer {
767 height: 37px; 1470 height: 37px;
768 width: 273px; 1471 width: 273px;
769 background-color: #ff6622; 1472 background-color: #ff6622;
770 -webkit-border-bottom-left-radius: 20px; 1473 -webkit-border-bottom-left-radius: 20px;
771 -moz-border-radius-bottomleft: 20px; 1474 -moz-border-radius-bottomleft: 20px;
772 border-bottom-left-radius: 20px; 1475 border-bottom-left-radius: 20px;
773 -webkit-border-bottom-left-radius: 20px; 1476 -webkit-border-bottom-left-radius: 20px;
774 -moz-border-radius-bottomleft: 20px; 1477 -moz-border-radius-bottomleft: 20px;
775 border-bottom-left-radius: 20px; 1478 border-bottom-left-radius: 20px;
776 -webkit-border-bottom-left-radius: 20px; 1479 -webkit-border-bottom-left-radius: 20px;
777 -moz-border-radius-bottomleft: 20px; 1480 -moz-border-radius-bottomleft: 20px;
778 border-bottom-left-radius: 20px; 1481 border-bottom-left-radius: 20px;
779 -webkit-border-bottom-left-radius: 20px; 1482 -webkit-border-bottom-left-radius: 20px;
780 -moz-border-radius-bottomleft: 20px; 1483 -moz-border-radius-bottomleft: 20px;
781 border-bottom-left-radius: 20px; 1484 border-bottom-left-radius: 20px;
1485 -webkit-border-bottom-left-radius: 20px;
1486 -moz-border-radius-bottomleft: 20px;
1487 border-bottom-left-radius: 20px;
1488 -webkit-border-bottom-left-radius: 20px;
1489 -moz-border-radius-bottomleft: 20px;
1490 border-bottom-left-radius: 20px;
1491 -webkit-border-bottom-right-radius: 20px;
1492 -moz-border-radius-bottomright: 20px;
1493 border-bottom-right-radius: 20px;
1494 -webkit-border-bottom-right-radius: 20px;
1495 -moz-border-radius-bottomright: 20px;
1496 border-bottom-right-radius: 20px;
782 -webkit-border-bottom-right-radius: 20px; 1497 -webkit-border-bottom-right-radius: 20px;
783 -moz-border-radius-bottomright: 20px; 1498 -moz-border-radius-bottomright: 20px;
784 border-bottom-right-radius: 20px; 1499 border-bottom-right-radius: 20px;
785 -webkit-border-bottom-right-radius: 20px; 1500 -webkit-border-bottom-right-radius: 20px;
786 -moz-border-radius-bottomright: 20px; 1501 -moz-border-radius-bottomright: 20px;
787 border-bottom-right-radius: 20px; 1502 border-bottom-right-radius: 20px;
788 -webkit-border-bottom-right-radius: 20px; 1503 -webkit-border-bottom-right-radius: 20px;
789 -moz-border-radius-bottomright: 20px; 1504 -moz-border-radius-bottomright: 20px;
790 border-bottom-right-radius: 20px; 1505 border-bottom-right-radius: 20px;
791 -webkit-border-bottom-right-radius: 20px; 1506 -webkit-border-bottom-right-radius: 20px;
792 -moz-border-radius-bottomright: 20px; 1507 -moz-border-radius-bottomright: 20px;
793 border-bottom-right-radius: 20px; 1508 border-bottom-right-radius: 20px;
794 -webkit-border-bottom-left-radius: 20px; 1509 -webkit-border-bottom-left-radius: 20px;
795 -moz-border-radius-bottomleft: 20px; 1510 -moz-border-radius-bottomleft: 20px;
796 border-bottom-left-radius: 20px; 1511 border-bottom-left-radius: 20px;
797 -webkit-border-bottom-left-radius: 20px; 1512 -webkit-border-bottom-left-radius: 20px;
798 -moz-border-radius-bottomleft: 20px; 1513 -moz-border-radius-bottomleft: 20px;
799 border-bottom-left-radius: 20px; 1514 border-bottom-left-radius: 20px;
800 -webkit-border-bottom-left-radius: 20px; 1515 -webkit-border-bottom-left-radius: 20px;
801 -moz-border-radius-bottomleft: 20px; 1516 -moz-border-radius-bottomleft: 20px;
802 border-bottom-left-radius: 20px; 1517 border-bottom-left-radius: 20px;
803 -webkit-border-bottom-left-radius: 20px; 1518 -webkit-border-bottom-left-radius: 20px;
804 -moz-border-radius-bottomleft: 20px; 1519 -moz-border-radius-bottomleft: 20px;
805 border-bottom-left-radius: 20px; 1520 border-bottom-left-radius: 20px;
1521 -webkit-border-bottom-left-radius: 20px;
1522 -moz-border-radius-bottomleft: 20px;
1523 border-bottom-left-radius: 20px;
1524 -webkit-border-bottom-left-radius: 20px;
1525 -moz-border-radius-bottomleft: 20px;
1526 border-bottom-left-radius: 20px;
1527 -webkit-border-bottom-right-radius: 20px;
1528 -moz-border-radius-bottomright: 20px;
1529 border-bottom-right-radius: 20px;
1530 -webkit-border-bottom-right-radius: 20px;
1531 -moz-border-radius-bottomright: 20px;
1532 border-bottom-right-radius: 20px;
806 -webkit-border-bottom-right-radius: 20px; 1533 -webkit-border-bottom-right-radius: 20px;
807 -moz-border-radius-bottomright: 20px; 1534 -moz-border-radius-bottomright: 20px;
808 border-bottom-right-radius: 20px; 1535 border-bottom-right-radius: 20px;
809 -webkit-border-bottom-right-radius: 20px; 1536 -webkit-border-bottom-right-radius: 20px;
810 -moz-border-radius-bottomright: 20px; 1537 -moz-border-radius-bottomright: 20px;
811 border-bottom-right-radius: 20px; 1538 border-bottom-right-radius: 20px;
812 -webkit-border-bottom-right-radius: 20px; 1539 -webkit-border-bottom-right-radius: 20px;
813 -moz-border-radius-bottomright: 20px; 1540 -moz-border-radius-bottomright: 20px;
814 border-bottom-right-radius: 20px; 1541 border-bottom-right-radius: 20px;
815 -webkit-border-bottom-right-radius: 20px; 1542 -webkit-border-bottom-right-radius: 20px;
816 -moz-border-radius-bottomright: 20px; 1543 -moz-border-radius-bottomright: 20px;
817 border-bottom-right-radius: 20px; 1544 border-bottom-right-radius: 20px;
818 -webkit-border-bottom-left-radius: 20px; 1545 -webkit-border-bottom-left-radius: 20px;
819 -moz-border-radius-bottomleft: 20px; 1546 -moz-border-radius-bottomleft: 20px;
820 border-bottom-left-radius: 20px; 1547 border-bottom-left-radius: 20px;
821 -webkit-border-bottom-left-radius: 20px; 1548 -webkit-border-bottom-left-radius: 20px;
822 -moz-border-radius-bottomleft: 20px; 1549 -moz-border-radius-bottomleft: 20px;
823 border-bottom-left-radius: 20px; 1550 border-bottom-left-radius: 20px;
824 -webkit-border-bottom-left-radius: 20px; 1551 -webkit-border-bottom-left-radius: 20px;
825 -moz-border-radius-bottomleft: 20px; 1552 -moz-border-radius-bottomleft: 20px;
826 border-bottom-left-radius: 20px; 1553 border-bottom-left-radius: 20px;
827 -webkit-border-bottom-left-radius: 20px; 1554 -webkit-border-bottom-left-radius: 20px;
828 -moz-border-radius-bottomleft: 20px; 1555 -moz-border-radius-bottomleft: 20px;
829 border-bottom-left-radius: 20px; 1556 border-bottom-left-radius: 20px;
1557 -webkit-border-bottom-left-radius: 20px;
1558 -moz-border-radius-bottomleft: 20px;
1559 border-bottom-left-radius: 20px;
1560 -webkit-border-bottom-left-radius: 20px;
1561 -moz-border-radius-bottomleft: 20px;
1562 border-bottom-left-radius: 20px;
830 -webkit-border-bottom-right-radius: 20px; 1563 -webkit-border-bottom-right-radius: 20px;
831 -moz-border-radius-bottomright: 20px; 1564 -moz-border-radius-bottomright: 20px;
832 border-bottom-right-radius: 20px; 1565 border-bottom-right-radius: 20px;
833 -webkit-border-bottom-right-radius: 20px; 1566 -webkit-border-bottom-right-radius: 20px;
834 -moz-border-radius-bottomright: 20px; 1567 -moz-border-radius-bottomright: 20px;
835 border-bottom-right-radius: 20px; 1568 border-bottom-right-radius: 20px;
836 -webkit-border-bottom-right-radius: 20px; 1569 -webkit-border-bottom-right-radius: 20px;
837 -moz-border-radius-bottomright: 20px; 1570 -moz-border-radius-bottomright: 20px;
838 border-bottom-right-radius: 20px; 1571 border-bottom-right-radius: 20px;
839 -webkit-border-bottom-right-radius: 20px; 1572 -webkit-border-bottom-right-radius: 20px;
840 -moz-border-radius-bottomright: 20px; 1573 -moz-border-radius-bottomright: 20px;
841 border-bottom-right-radius: 20px; 1574 border-bottom-right-radius: 20px;
1575 -webkit-border-bottom-right-radius: 20px;
1576 -moz-border-radius-bottomright: 20px;
1577 border-bottom-right-radius: 20px;
1578 -webkit-border-bottom-right-radius: 20px;
1579 -moz-border-radius-bottomright: 20px;
1580 border-bottom-right-radius: 20px;
1581 -webkit-border-bottom-left-radius: 20px;
1582 -moz-border-radius-bottomleft: 20px;
1583 border-bottom-left-radius: 20px;
1584 -webkit-border-bottom-left-radius: 20px;
1585 -moz-border-radius-bottomleft: 20px;
1586 border-bottom-left-radius: 20px;
842 -webkit-border-bottom-left-radius: 20px; 1587 -webkit-border-bottom-left-radius: 20px;
843 -moz-border-radius-bottomleft: 20px; 1588 -moz-border-radius-bottomleft: 20px;
844 border-bottom-left-radius: 20px; 1589 border-bottom-left-radius: 20px;
845 -webkit-border-bottom-left-radius: 20px; 1590 -webkit-border-bottom-left-radius: 20px;
846 -moz-border-radius-bottomleft: 20px; 1591 -moz-border-radius-bottomleft: 20px;
847 border-bottom-left-radius: 20px; 1592 border-bottom-left-radius: 20px;
848 -webkit-border-bottom-left-radius: 20px; 1593 -webkit-border-bottom-left-radius: 20px;
849 -moz-border-radius-bottomleft: 20px; 1594 -moz-border-radius-bottomleft: 20px;
850 border-bottom-left-radius: 20px; 1595 border-bottom-left-radius: 20px;
851 -webkit-border-bottom-left-radius: 20px; 1596 -webkit-border-bottom-left-radius: 20px;
852 -moz-border-radius-bottomleft: 20px; 1597 -moz-border-radius-bottomleft: 20px;
853 border-bottom-left-radius: 20px; 1598 border-bottom-left-radius: 20px;
854 -webkit-border-bottom-right-radius: 20px; 1599 -webkit-border-bottom-right-radius: 20px;
855 -moz-border-radius-bottomright: 20px; 1600 -moz-border-radius-bottomright: 20px;
856 border-bottom-right-radius: 20px; 1601 border-bottom-right-radius: 20px;
857 -webkit-border-bottom-right-radius: 20px; 1602 -webkit-border-bottom-right-radius: 20px;
858 -moz-border-radius-bottomright: 20px; 1603 -moz-border-radius-bottomright: 20px;
859 border-bottom-right-radius: 20px; 1604 border-bottom-right-radius: 20px;
860 -webkit-border-bottom-right-radius: 20px; 1605 -webkit-border-bottom-right-radius: 20px;
861 -moz-border-radius-bottomright: 20px; 1606 -moz-border-radius-bottomright: 20px;
862 border-bottom-right-radius: 20px; 1607 border-bottom-right-radius: 20px;
863 -webkit-border-bottom-right-radius: 20px; 1608 -webkit-border-bottom-right-radius: 20px;
864 -moz-border-radius-bottomright: 20px; 1609 -moz-border-radius-bottomright: 20px;
865 border-bottom-right-radius: 20px; 1610 border-bottom-right-radius: 20px;
1611 -webkit-border-bottom-right-radius: 20px;
1612 -moz-border-radius-bottomright: 20px;
1613 border-bottom-right-radius: 20px;
1614 -webkit-border-bottom-right-radius: 20px;
1615 -moz-border-radius-bottomright: 20px;
1616 border-bottom-right-radius: 20px;
1617 -webkit-border-bottom-left-radius: 20px;
1618 -moz-border-radius-bottomleft: 20px;
1619 border-bottom-left-radius: 20px;
1620 -webkit-border-bottom-left-radius: 20px;
1621 -moz-border-radius-bottomleft: 20px;
1622 border-bottom-left-radius: 20px;
1623 -webkit-border-bottom-left-radius: 20px;
1624 -moz-border-radius-bottomleft: 20px;
1625 border-bottom-left-radius: 20px;
1626 -webkit-border-bottom-left-radius: 20px;
1627 -moz-border-radius-bottomleft: 20px;
1628 border-bottom-left-radius: 20px;
1629 -webkit-border-bottom-left-radius: 20px;
1630 -moz-border-radius-bottomleft: 20px;
1631 border-bottom-left-radius: 20px;
1632 -webkit-border-bottom-left-radius: 20px;
1633 -moz-border-radius-bottomleft: 20px;
1634 border-bottom-left-radius: 20px;
1635 -webkit-border-bottom-right-radius: 20px;
1636 -moz-border-radius-bottomright: 20px;
1637 border-bottom-right-radius: 20px;
1638 -webkit-border-bottom-right-radius: 20px;
1639 -moz-border-radius-bottomright: 20px;
1640 border-bottom-right-radius: 20px;
1641 -webkit-border-bottom-right-radius: 20px;
1642 -moz-border-radius-bottomright: 20px;
1643 border-bottom-right-radius: 20px;
1644 -webkit-border-bottom-right-radius: 20px;
1645 -moz-border-radius-bottomright: 20px;
1646 border-bottom-right-radius: 20px;
1647 -webkit-border-bottom-right-radius: 20px;
1648 -moz-border-radius-bottomright: 20px;
1649 border-bottom-right-radius: 20px;
1650 -webkit-border-bottom-right-radius: 20px;
1651 -moz-border-radius-bottomright: 20px;
1652 border-bottom-right-radius: 20px;
1653 -webkit-border-bottom-left-radius: 20px;
1654 -moz-border-radius-bottomleft: 20px;
1655 border-bottom-left-radius: 20px;
1656 -webkit-border-bottom-left-radius: 20px;
1657 -moz-border-radius-bottomleft: 20px;
1658 border-bottom-left-radius: 20px;
1659 -webkit-border-bottom-left-radius: 20px;
1660 -moz-border-radius-bottomleft: 20px;
1661 border-bottom-left-radius: 20px;
1662 -webkit-border-bottom-left-radius: 20px;
1663 -moz-border-radius-bottomleft: 20px;
1664 border-bottom-left-radius: 20px;
1665 -webkit-border-bottom-left-radius: 20px;
1666 -moz-border-radius-bottomleft: 20px;
1667 border-bottom-left-radius: 20px;
1668 -webkit-border-bottom-left-radius: 20px;
1669 -moz-border-radius-bottomleft: 20px;
1670 border-bottom-left-radius: 20px;
1671 -webkit-border-bottom-right-radius: 20px;
1672 -moz-border-radius-bottomright: 20px;
1673 border-bottom-right-radius: 20px;
1674 -webkit-border-bottom-right-radius: 20px;
1675 -moz-border-radius-bottomright: 20px;
1676 border-bottom-right-radius: 20px;
1677 -webkit-border-bottom-right-radius: 20px;
1678 -moz-border-radius-bottomright: 20px;
1679 border-bottom-right-radius: 20px;
1680 -webkit-border-bottom-right-radius: 20px;
1681 -moz-border-radius-bottomright: 20px;
1682 border-bottom-right-radius: 20px;
1683 -webkit-border-bottom-right-radius: 20px;
1684 -moz-border-radius-bottomright: 20px;
1685 border-bottom-right-radius: 20px;
1686 -webkit-border-bottom-right-radius: 20px;
1687 -moz-border-radius-bottomright: 20px;
1688 border-bottom-right-radius: 20px;
866} 1689}
867body.ext-gecko div#loginBox form.loginForm div.translations ul li { 1690body.ext-gecko div#loginBox form.loginForm div.translations ul li {
868 display: -moz-inline-box; 1691 display: -moz-inline-box;
869} 1692}
870div#featurePoints { 1693div#featurePoints {
871 min-width: 400px; 1694 min-width: 400px;
872 padding-top: 15px; 1695 padding-top: 15px;
873 padding-bottom: 20px; 1696 padding-bottom: 20px;
874 padding-left: 20px; 1697 padding-left: 20px;
875 padding-right: 330px; 1698 padding-right: 330px;
876} 1699}
877div#featurePoints table tbody tr td { 1700div#featurePoints table tbody tr td {
878 width: 50%; 1701 width: 50%;
879 vertical-align: top; 1702 vertical-align: top;
880} 1703}
881div#featurePoints div.block { 1704div#featurePoints div.block {
882 padding: 10px; 1705 padding: 10px;
883 color: #86858e; 1706 color: #86858e;
884} 1707}
885div#featurePoints div.block h3 { 1708div#featurePoints div.block h3 {
886 font-weight: normal; 1709 font-weight: normal;
887 font-size: 12pt; 1710 font-size: 12pt;
888 margin: 0px; 1711 margin: 0px;
889 padding: 5px 0px; 1712 padding: 5px 0px;
890} 1713}
891div#featurePoints div.block ul { 1714div#featurePoints div.block ul {
892 margin: 0px; 1715 margin: 0px;
893 margin-left: 20px; 1716 margin-left: 20px;
894 padding: 0px; 1717 padding: 0px;
895 list-style-position: outside; 1718 list-style-position: outside;
896} 1719}
897div#featurePoints div.block ul li { 1720div#featurePoints div.block ul li {
898 font-size: 10pt; 1721 font-size: 10pt;
899 padding: 3px 0px; 1722 padding: 3px 0px;
900} 1723}
901div.activeFeatures { 1724div.activeFeatures {
902 float: left; 1725 float: left;
903 margin-left: 20px; 1726 margin-left: 20px;
904 height: 100px; 1727 height: 100px;
905} 1728}
906div.activeFeatures a { 1729div.activeFeatures a {
907 display: inline-block; 1730 display: inline-block;
908 padding-left: 46px; 1731 padding-left: 46px;
909 color: #ff5906; 1732 color: #ff5906;
910 text-decoration: none; 1733 text-decoration: none;
911 font-size: 10pt; 1734 font-size: 10pt;
912} 1735}
913div.activeFeatures a span.payoff { 1736div.activeFeatures a span.payoff {
914 display: block; 1737 display: block;
915 font-size: 13pt; 1738 font-size: 13pt;
916 font-weight: lighter; 1739 font-weight: lighter;
917 color: #9b9689; 1740 color: #9b9689;
918 margin: 0px; 1741 margin: 0px;
919 padding: 0px; 1742 padding: 0px;
920} 1743}
921div.activeFeatures a:hover span.payoff { 1744div.activeFeatures a:hover span.payoff {
922 color: #666666; 1745 color: #666666;
923} 1746}
924div.activeFeatures div.keepTogether a { 1747div.activeFeatures div.keepTogether a {
925 padding-left: 0px; 1748 padding-left: 0px;
926} 1749}
927div.activeFeatures div.keepTogether div { 1750div.activeFeatures div.keepTogether div {
928 display: inline-block; 1751 display: inline-block;
929 padding-right: 15px; 1752 padding-right: 15px;
930} 1753}
931div.activeFeatures div.keepTogether canvas { 1754div.activeFeatures div.keepTogether canvas {
932 width: 46px; 1755 width: 46px;
933 height: 46px; 1756 height: 46px;
934 vertical-align: bottom; 1757 vertical-align: bottom;
935} 1758}
936div.activeFeatures div.createAccountLink { 1759div.activeFeatures div.createAccountLink {
937 display: inline-block; 1760 display: inline-block;
938 width: 282; 1761 width: 282;
939 height: 65px; 1762 height: 65px;
940 margin-right: 20px; 1763 margin-right: 20px;
941} 1764}
942div.activeFeatures div.createAccountLink a.createAccountLink { 1765div.activeFeatures div.createAccountLink a.createAccountLink {
943 position: relative; 1766 position: relative;
944 top: -92px; 1767 top: -92px;
945 left: 5px; 1768 left: 5px;
946} 1769}
947div.activeFeatures div.createAccountLink a.createAccountLink span.payoff { 1770div.activeFeatures div.createAccountLink a.createAccountLink span.payoff {
948 margin-top: 23px; 1771 margin-top: 23px;
949 margin-left: 40px; 1772 margin-left: 40px;
950 font-size: 17pt; 1773 font-size: 17pt;
951 color: #64626c; 1774 color: #64626c;
952} 1775}
953div.activeFeatures div.createAccountLink a.createAccountLink span.link { 1776div.activeFeatures div.createAccountLink a.createAccountLink span.link {
954 padding-left: 40px; 1777 padding-left: 40px;
955 padding-right: 50px; 1778 padding-right: 50px;
956 padding-bottom: 10px; 1779 padding-bottom: 10px;
957 font-size: 12pt; 1780 font-size: 12pt;
958} 1781}
959div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff { 1782div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff {
960 color: #54535a; 1783 color: #54535a;
961} 1784}
962div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link { 1785div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link {
963 color: white; 1786 color: white;
964} 1787}
965div.activeFeatures div.createAccountLink canvas { 1788div.activeFeatures div.createAccountLink canvas {
966 width: 282px; 1789 width: 282px;
967 height: 93px; 1790 height: 93px;
968} 1791}
969/* 1792/*
970 1793
971img.favicon { 1794Color list:
972 height: 16px; 1795- login box:
973 width: 16px; 1796 light#ff9955
974} 1797 dark#ff6622
975 1798- login button:
976body.ext-gecko .keepTogether { 1799 regular#dd5500
977 display: -moz-inline-box; 1800 hover#773311
978} 1801- login translations:
979 1802 box: #cc6622;
980 1803 not-selected:
981 1804 color: #ddaa99
982 1805 background:#994422
983 1806 selected: #772211;
984 1807*/
985 1808html {
986 1809 height: 100%;
987div.activeFeatures {
988 float: left;
989 margin-left: 20px;
990 height: 100px;
991}
992div.activeFeatures a {
993 display: inline-block;
994 padding-left: 46px;
995 color: #ff5906;
996 text-decoration: none;
997 font-size: 10pt;
998}
999div.activeFeatures .keepTogether a {
1000 padding-left: 0px;
1001}
1002div.activeFeatures a span.payoff {
1003 display: block;
1004 font-size: 13pt;
1005 font-weight: lighter;
1006 color: #9b9689;
1007 margin: 0px;
1008 padding: 0px;
1009}
1010// body.ext-gecko div.activeFeatures a {
1011 //display: -moz-inline-box;
1012// }
1013div.activeFeatures a:hover span.payoff {
1014 color: #666666;
1015}
1016div.activeFeatures a:hover span.link {
1017 //font-weight: bold;
1018}
1019div.activeFeatures div.keepTogether div {
1020 display: inline-block;
1021 padding-right: 15px;
1022}
1023// body.ext-gecko div.activeFeatures div.keepTogether div {
1024 //display: -moz-inline-box;
1025// }
1026div.activeFeatures div.createAccountLink {
1027 display: inline-block;
1028 width: 282;
1029 height: 65px;
1030 //background-image: url(../images/old/home/register.png);
1031
1032 margin-right: 20px;
1033}
1034// body.ext-gecko div.activeFeatures div.createAccountLink {
1035 //display: -moz-inline-box;
1036// }
1037div.activeFeatures a.createAccountLink {
1038 position: relative;
1039 top: -92px;
1040 left: 5px;
1041}
1042div.activeFeatures div.createAccountLink a.createAccountLink span.payoff {
1043 margin-top: 23px;
1044 margin-left: 40px;
1045 font-size: 17pt;
1046 color: #64626c;
1047}
1048div.activeFeatures div.createAccountLink a.createAccountLink span.link {
1049 padding-left: 40px;
1050 padding-right: 50px;
1051 padding-bottom: 10px;
1052 font-size: 12pt;
1053}
1054div.activeFeatures div.createAccountLink:hover {
1055 //background-image: url(../images/old/home/register_selected.png);
1056
1057}
1058div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff {
1059 color: #54535a;
1060}
1061div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link {
1062 color: white;
1063}
1064// div.activeFeatures div.screenshotLink {
1065 // background: url(../images/old/home/look.png) no-repeat 0 -3px;
1066// }
1067//
1068// div.activeFeatures div.offlineLink {
1069 // background: url(../images/old/home/download.png) no-repeat 10px -4px;
1070// }
1071
1072div.createAccountLink canvas {
1073 width: 282px;
1074 height: 93px;
1075}
1076div.activeFeatures .keepTogether canvas {
1077 width: 46px;
1078 height: 46px;
1079 vertical-align: bottom;
1080}
1081
1082div.pageHeaderAndBody {
1083 height: 100%;
1084}
1085body > div.pageHeaderAndBody {
1086 height: auto;
1087 min-height: 100%;
1088}
1089div#pageBody {
1090 min-width: 1013px;
1091 padding-bottom: 90px;
1092}
1093div.pageFooter {
1094 margin-top: -90px;
1095 height: 90px;
1096 clear: both;
1097}
1098div.footerWrapper {
1099 clear: both;
1100 padding-top: 10px;
1101}
1102div.footerContent {
1103 background-color: #eaebe6;
1104 padding: 20px;
1105 font-size: 8pt;
1106}
1107// div.pageFooter div.footerContent div.footerStarIcon {
1108div.pageFooter div.footerContent canvas.footerStarIcon {
1109 //background-image: url(../images/old/footer/star.png);
1110
1111 width: 40px;
1112 height: 40px;
1113 float: left;
1114}
1115div.pageFooter div.footerContent span.copyright {
1116 padding-left: 10px;
1117 color: #a0a0a0;
1118}
1119div.pageFooter div.footerContent a {
1120 padding-left: 50px;
1121 display: block;
1122 color: #888888;
1123 font-weight: bold;
1124 text-decoration: none;
1125}
1126div.pageFooter div.footerContent span.applicationVersion {
1127 padding: 8px;
1128 color: #888888;
1129 background-color: #d2d2d2;
1130 position: relative;
1131 top: -40px;
1132 float: right;
1133}
1134
1135div#javaScriptAlert div.mask {
1136 position: fixed;
1137 top: 0px;
1138 left: 0px;
1139 right: 0px;
1140 bottom: 0px;
1141 background-color: black;
1142 z-index: 1001;
1143 -moz-opacity: 0.7;
1144 opacity: .70;
1145 filter: alpha(opacity=70);
1146}
1147div#javaScriptAlert div.header {
1148 height: 34px;
1149 width: 468;
1150 background-image: url(../images/old/alert/header.png);
1151}
1152div#javaScriptAlert div.body {
1153 background-image: url(../images/old/alert/body.png);
1154 padding: 0px 20px 10px 20px;
1155}
1156// div#javaScriptAlert div.body div.alert {
1157 // padding-left: 100px;
1158 // background: url(../images/old/alert/alert.png) no-repeat;
1159// }
1160// div#javaScriptAlert div.body img.alert {
1161div#javaScriptAlert div.body div.alertLogo {
1162 float: left;
1163 background-image: url(../images/old/alert/alert.png);
1164 width: 88px;
1165 height: 88px;
1166}
1167div#javaScriptAlert div.body div.alert {
1168 padding-left: 100px;
1169}
1170div#javaScriptAlert div.footer {
1171 height: 34px;
1172 width: 468;
1173 background-image: url(../images/old/alert/footer.png);
1174}
1175div#javaScriptAlert div.message {
1176 position: relative;
1177 top: -150px;
1178 z-index: 1002;
1179 //left: 100px;
1180 //right: 100px;
1181
1182 margin-left: auto;
1183 margin-right: auto;
1184 max-width: 468px;
1185}
1186div#javaScriptAlert div.message h1 {
1187 font-size: 16pt;
1188 margin: 0px;
1189 color: #ff5930;
1190}
1191div#javaScriptAlert div.message p {
1192 margin-top: 0px;
1193 color: #999999;
1194}
1195div#javaScriptAlert div.message h3 {
1196 font-size: 12pt;
1197 margin-bottom: 0px;
1198 color: #ff5930;
1199}
1200div#javaScriptAlert div.message h5 {
1201 margin: 0px;
1202 color: #999999;
1203}
1204
1205div.LoginProgress {
1206 position: relative;
1207 left: -190px;
1208 top: -100px;
1209 width: 380px;
1210 height: 200px;
1211 //background: url(../images/old/loginProgress/background.png);
1212
1213 background-color: #d7d7c0;
1214 -webkit-border-radius: 20px;
1215 -moz-border-radius: 20px;
1216 border-radius: 20px;
1217 -webkit-box-shadow: 5px 5px 7px rgba(0, 0, 0, 0.6);
1218 -moz-box-shadow: 5px 5px 7px rgba(0, 0, 0, 0.6);
1219 box-shadow: 5px 5px 7px rgba(0, 0, 0, 0.6);
1220}
1221div.LoginProgress div.header {
1222 height: 40px;
1223}
1224div.LoginProgress div.header h3 {
1225 font-size: 12pt;
1226 font-weight: normal;
1227 margin: 0px;
1228 color: #777777;
1229 padding-top: 13px;
1230 padding-left: 18px;
1231}
1232div.LoginProgress div.body {
1233 height: 120px;
1234 overflow: auto;
1235 padding-left: 20px;
1236 padding-right: 20px;
1237 background-color: #f1f1e9;
1238 //margin-left: 19px;
1239 //margin-right: 18px;
1240}
1241div.LoginProgress div.body div.img {
1242 margin: 10px;
1243 width: 50px;
1244 height: 50px;
1245 float: left;
1246}
1247div.LoginProgress div.body div.img.ALERT {
1248 //background-image: url(../images/old/simpleMessageBox/Alert.png);
1249
1250 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1, #333333));
1251 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9955);
1252 -webkit-border-radius: 25px;
1253 -moz-border-radius: 25px;
1254 border-radius: 25px;
1255}
1256div.LoginProgress div.body div.img.ALERT canvas {
1257 width: 50px;
1258 height: 50px;
1259 //background-image: url(../images/old/simpleMessageBox/excalmationPoint.png);
1260
1261}
1262div.LoginProgress div.body div.loadingBar {
1263 position: relative;
1264 top: 51px;
1265 left: 60px;
1266}
1267div.LoginProgress div.body div.errorBox p {
1268 color: #787872;
1269 padding-top: 20px;
1270 padding-left: 80px;
1271}
1272div.LoginProgress div.footer {
1273 margin-left: 19px;
1274 margin-right: 18px;
1275}
1276div.LoginProgress div.footer a {
1277 text-decoration: none;
1278 text-align: center;
1279 color: #787872;
1280 display: block;
1281 font-weight: bold;
1282 font-size: 11pt;
1283 width: 100px;
1284 margin-top: 11px;
1285 margin-left: auto;
1286 margin-right: auto;
1287}
1288div.LoginProgress div.footer div.button.default {
1289 text-decoration: underline;
1290}
1291div.LoginProgress div.buttonArea {
1292 text-align: center;
1293}
1294div.LoginProgress div.button {
1295 display: inline-block;
1296}
1297div.LoginProgress div.footer a:hover {
1298 color: #515247;
1299}
1300
1301div.SimpleMessagePanel {
1302 position: relative;
1303 left: -225px;
1304 top: -70px;
1305 width: 450px;
1306 height: 140px;
1307 //background: url(../images/old/loginProgress/background.png);
1308}
1309div.SimpleMessagePanel div.header {
1310 height: 17px;
1311 background: url(../images/old/simpleMessageBox/background_header.png) no-repeat;
1312}
1313div.SimpleMessagePanel div.body {
1314 //height: 120px;
1315 //overflow: auto;
1316 //margin-left: 19px;
1317 //margin-right: 18px;
1318
1319 background: url(../images/old/simpleMessageBox/background_body.png) repeat-y;
1320 padding-left: 25px;
1321 padding-right: 25px;
1322 padding-top: 10px;
1323}
1324div.SimpleMessagePanel div.body h3 {
1325 font-size: 14pt;
1326 font-weight: normal;
1327 margin: 0px;
1328 padding-top: 4px;
1329 color: #787872;
1330}
1331div.SimpleMessagePanel div.body div.img {
1332 width: 66px;
1333 height: 60px;
1334 float: left;
1335}
1336div.SimpleMessagePanel div.body p {
1337 margin: 0;
1338 font-size: 10pt;
1339 font-weight: normal;
1340 color: #787872;
1341 padding-top: 10px;
1342 padding-bottom: 5px;
1343 line-height: 1.3;
1344}
1345div.SimpleMessagePanel div.body div.img.ALERT {
1346 background: url(../images/old/simpleMessageBox/Alert.png) no-repeat;
1347}
1348div.SimpleMessagePanel div.body div.img.INFO {
1349 background: url(../images/old/simpleMessageBox/Info.png) no-repeat;
1350}
1351div.SimpleMessagePanel div.body div.buttonArea {
1352 height: 40px;
1353 clear: both;
1354}
1355div.SimpleMessagePanel div.body div.buttonArea > div {
1356 float: right;
1357 margin-left: 15px;
1358 margin-top: 10px;
1359}
1360div.SimpleMessagePanel div.footer {
1361 height: 25px;
1362 background: url(../images/old/simpleMessageBox/background_footer.png) no-repeat;
1363}
1364div.SimpleMessagePanel div.passphrase {
1365 padding-left: 65px;
1366}
1367div.SimpleMessagePanel div.passphrase input {
1368 width: 250px;
1369 font-size: 14pt;
1370 border: 1px solid #bb4924;
1371 color: #333366;
1372 background-color: white;
1373 padding: 2px 5px;
1374 height: 28px;
1375}
1376div.SimpleMessagePanel div.progressBarWrapper {
1377 margin-left: 80px;
1378} 1810}
1379 1811body {
1380div.button_wrapper { 1812 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
1381 height: 32px; 1813 margin: 0px;
1382 background: url(../images/old/button/default_left.png) no-repeat;
1383 cursor: pointer;
1384} 1814}
1385div.button_wrapper.hover { 1815div.modalDialogMask.userInfoBoxMask {
1386 background: url(../images/old/button/hover_left.png) no-repeat; 1816 -moz-opacity: 0.0;
1817 opacity: .0;
1818 filter: alpha(opacity=0);
1819 z-index: 19000;
1387} 1820}
1388div.button_wrapper.clicked { 1821.reset-margin {
1389 background: url(../images/old/button/clicked_left.png) no-repeat; 1822 margin: 0px;
1823 padding: 0px;
1824 border: 0px;
1390} 1825}
1391div.button_bodyWrapper { 1826.clear {
1392 height: 32px; 1827 clear: both;
1393 margin-left: 6px;
1394 padding-right: 6px;
1395 background: url(../images/old/button/default_main.png) repeat-x right 0;
1396} 1828}
1397div.button_wrapper.hover div.button_bodyWrapper { 1829.hidden_none {
1398 background: url(../images/old/button/hover_main.png) repeat-x right 0; 1830 display: none;
1831 visibility: hidden;
1399} 1832}
1400div.button_wrapper.clicked div.button_bodyWrapper { 1833.keepTogether {
1401 background: url(../images/old/button/clicked_main.png) repeat-x right 0; 1834 display: inline-block;
1835 white-space: nowrap;
1402} 1836}
1403div.button_body { 1837#mainDiv {
1404 text-align: center; 1838 margin: 0 auto;
1405 min-width: 60px;
1406 padding: 0px 7px;
1407 padding-top: 8px;
1408} 1839}
1409div.button_body span { 1840div.userInfoBox {
1410 font-size: 11pt; 1841 position: absolute;
1411 color: white; 1842 width: 160px;
1843 height: 120px;
1844 top: 100px;
1845 left: 15px;
1846 color: white;
1847 background-color: #ff9955;
1848 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
1849 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
1850 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
1851 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
1852 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
1853 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
1854 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
1855 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
1856 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
1857 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
1858 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
1859 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
1860 border-radius: 10px;
1861 -moz-border-radius: 10px;
1862 -webkit-border-radius: 10px;
1863 border-radius: 10px;
1864 -moz-border-radius: 10px;
1865 -webkit-border-radius: 10px;
1866 border-radius: 10px;
1867 -moz-border-radius: 10px;
1868 -webkit-border-radius: 10px;
1869 border-radius: 10px;
1870 -moz-border-radius: 10px;
1871 -webkit-border-radius: 10px;
1872 border-radius: 10px;
1873 -moz-border-radius: 10px;
1874 -webkit-border-radius: 10px;
1875 border-radius: 10px;
1876 -moz-border-radius: 10px;
1877 -webkit-border-radius: 10px;
1878 -webkit-box-shadow: 2px 2px 9px #333333;
1879 -moz-box-shadow: 2px 2px 9px #333333;
1880 box-shadow: 2px 2px 9px #333333;
1881 -webkit-box-shadow: 2px 2px 9px #333333;
1882 -moz-box-shadow: 2px 2px 9px #333333;
1883 box-shadow: 2px 2px 9px #333333;
1884 -webkit-box-shadow: 2px 2px 9px #333333;
1885 -moz-box-shadow: 2px 2px 9px #333333;
1886 box-shadow: 2px 2px 9px #333333;
1887 -webkit-box-shadow: 2px 2px 9px #333333;
1888 -moz-box-shadow: 2px 2px 9px #333333;
1889 box-shadow: 2px 2px 9px #333333;
1890 -webkit-box-shadow: 2px 2px 9px #333333;
1891 -moz-box-shadow: 2px 2px 9px #333333;
1892 box-shadow: 2px 2px 9px #333333;
1893 -webkit-box-shadow: 2px 2px 9px #333333;
1894 -moz-box-shadow: 2px 2px 9px #333333;
1895 box-shadow: 2px 2px 9px #333333;
1412} 1896}
1413div.button_wrapper.default div.button_body span { 1897div.userInfoBox.locked {
1414 font-weight: bold; 1898 z-index: 19001;
1415} 1899}
1416 1900div.userInfoBox.locked div.header a.lockButton {
1417// div.button_footer { 1901 background: url(../images/old/lock/locked.png) no-repeat -5px -2px;
1418 // margin: 0px;
1419 // height: 31px;
1420 // width: 6px;
1421 // background: green url(../images/old/button/default_right.png) no-repeat;
1422// }
1423
1424input.entropyLevelIndicator {
1425 background: url(../images/old/passwordField/background.png) no-repeat 0 26px;
1426}
1427div.passwordEntropyWrapper {
1428 padding: 0px;
1429 border: 1px solid #bb4924;
1430 border-top: 0px;
1431 margin-bottom: 4px;
1432 background-color: white;
1433 margin-right: 3px;
1434 margin-top: -2;
1435}
1436div.passwordEntropy {
1437 height: 4px;
1438 font-size: 1pt;
1439 background: url(../images/old/entropyBackground.gif) repeat-x 0 0;
1440 line-height: 3px;
1441} 1902}
1442 1903div.userInfoBox.locked div.header a.lockButton:hover {
1443div.userInfoBox { 1904 background: url(../images/old/lock/locked_hover.png) no-repeat -5px -2px;
1444 position: absolute;
1445 width: 160px;
1446 height: 120px;
1447 top: 100px;
1448 left: 15px;
1449 //background-image: url(../images/old/main/userInfoBackground.png);
1450
1451 background-color: #ff9955;
1452 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723), color-stop(1, #333333));
1453 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
1454 -webkit-border-radius: 10px;
1455 -moz-border-radius: 10px;
1456 border-radius: 10px;
1457 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
1458 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
1459 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
1460 color: white;
1461} 1905}
1462div.userInfoBox div.body { 1906div.userInfoBox.locked div.body a {
1463 padding: 0px 12px; 1907 display: none;
1464} 1908}
1465div.userInfoBox div.header { 1909div.userInfoBox div.header {
1466 height: 30px; 1910 height: 30px;
1467} 1911}
1468div.userInfoBox div.header h1 { 1912div.userInfoBox div.header h1 {
1469 font-size: 8pt; 1913 font-size: 8pt;
1470 font-weight: normal; 1914 font-weight: normal;
1471 margin: 0px; 1915 margin: 0px;
1472 padding-top: 12px; 1916 padding-top: 12px;
1473 padding-left: 12px; 1917 padding-left: 12px;
1474} 1918}
1475div.userInfoBox div.header a.lockButton { 1919div.userInfoBox div.header a.lockButton {
1476 position: absolute; 1920 position: absolute;
1477 top: 8px; 1921 top: 8px;
1478 right: 12px; 1922 right: 12px;
1479 display: block; 1923 display: block;
1480 width: 15px; 1924 width: 15px;
1481 height: 20px; 1925 height: 20px;
1482 text-decoration: none; 1926 text-decoration: none;
1483 background: url(../images/old/lock/unlocked.png) no-repeat -5px -2px; 1927 background: url(../images/old/lock/unlocked.png) no-repeat -5px -2px;
1484} 1928}
1485div.userInfoBox div.header a.lockButton:hover { 1929div.userInfoBox div.header a.lockButton:hover {
1486 background: url(../images/old/lock/unlocked_hover.png) no-repeat -5px -2px; 1930 background: url(../images/old/lock/unlocked_hover.png) no-repeat -5px -2px;
1487}
1488div.userInfoBox.locked {
1489 z-index: 19001;
1490} 1931}
1491div.modalDialogMask.userInfoBoxMask { 1932div.userInfoBox div.body {
1492 -moz-opacity: 0.0; 1933 padding: 0px 12px;
1493 opacity: .0;
1494 filter: alpha(opacity=0);
1495 z-index: 19000;
1496}
1497div.userInfoBox.locked div.header a.lockButton {
1498 background: url(../images/old/lock/locked.png) no-repeat -5px -2px;
1499}
1500div.userInfoBox.locked div.header a.lockButton:hover {
1501 background: url(../images/old/lock/locked_hover.png) no-repeat -5px -2px;
1502} 1934}
1503div.userInfoBox div.body h3 { 1935div.userInfoBox div.body h3 {
1504 font-size: 11pt; 1936 font-size: 11pt;
1505 font-weight: bold; 1937 font-weight: bold;
1506 margin: 0px; 1938 margin: 0px;
1507} 1939}
1508div.userInfoBox div.body ul { 1940div.userInfoBox div.body ul {
1509 list-style-image: url(../images/old/main/userInfoBullet.png); 1941 font-size: 8pt;
1510 font-size: 8pt; 1942 padding: 0px;
1511 padding: 0px; 1943 margin: 4px 0px;
1512 margin: 4px 0px; 1944 list-style-position: inside;
1513 list-style-position: inside; 1945 text-shadow: #000000 0 0 0;
1514 text-shadow: #000000 0 0 0;
1515} 1946}
1516div.userInfoBox div.body ul li span.number { 1947div.userInfoBox div.body ul li span.number {
1517 font-weight: bold; 1948 font-weight: bold;
1518 padding-right: 3px; 1949 padding-right: 3px;
1519} 1950}
1520div.userInfoBox div.body a { 1951div.userInfoBox div.body a {
1521 display: block; 1952 display: block;
1522 margin-top: 8 1953 margin-top: 8px;
1523 px; 1954 border-top: 1px solid white;
1524 border-top: 1px solid white; 1955 padding-top: 6px;
1525 padding-top: 6px; 1956 font-size: 10pt;
1526 font-size: 10pt; 1957 font-weight: bold;
1527 font-weight: bold; 1958 color: #d15a22;
1528 color: #d15a22; 1959 border-color: #fe9a5f;
1529 text-decoration: none; 1960 text-decoration: none;
1530 border-color: #fe9a5f;
1531} 1961}
1532div.userInfoBox div.body a:hover { 1962div.userInfoBox div.body a:hover {
1533 color: #8c3b15; 1963 color: #8c3b15;
1534}
1535div.userInfoBox.locked div.body a {
1536 display: none;
1537} 1964}
1538
1539div.messageBox {
1540 position: absolute;
1541 width: 409px;
1542 height: 29px;
1543 top: 23px;
1544 left: 204px;
1545 background: url(../images/old/main/messageBoxBackground.png);
1546}
1547div.messageBox h3 {
1548 display: inline-block;
1549 color: #342f6b;
1550 font-weight: bold;
1551 margin: 7px 2px 0px 12px;
1552 font-size: 10pt;
1553}
1554body.ext-gecko div.messageBox h3 {
1555 display: -moz-inline-box;
1556}
1557div.messageBox h1 {
1558 color: #342f6b;
1559 display: inline;
1560 font-weight: normal;
1561 margin: 0px 1px;
1562 font-size: 9pt;
1563}
1564div.messageBox a {
1565 display: block;
1566 width: 20px;
1567 height: 20px;
1568 float: right;
1569 position: absolute;
1570 right: 5px;
1571 top: 4px;
1572 background-image: url(../images/old/main/messageBoxCloseButton.png);
1573}
1574div.messageBox a:hover {
1575 background-image: url(../images/old/main/messageBoxCloseButtonActive.png);
1576}
1577
1578div.sidePanels { 1965div.sidePanels {
1579 //position: relative; 1966 float: left;
1580 //top: 110px; 1967 margin-top: 106px;
1581 1968 margin-left: 20px;
1582 float: left; 1969 width: 160px;
1583 margin-top: 106px;
1584 margin-left: 20px;
1585 width: 160px;
1586}
1587
1588div.tabSidePanel {
1589 margin-right: -10px;
1590 //position: absolute;
1591 //width: 250px;
1592 //height: 250px;
1593 //top: 250px;
1594 //left: 10px;
1595}
1596div.tabSidePanel ul {
1597 margin: 0px;
1598 padding-left: 0px;
1599 list-style-type: none;
1600 color: #f78b46;
1601}
1602
1603div.tabSidePanel ul.mainTabs {
1604 margin: 0px;
1605}
1606div.tabSidePanel ul.mainTabs li {
1607 //margin-bottom: 6px;
1608
1609}
1610div.tabSidePanel ul.mainTabs li a {
1611 display: block;
1612 line-height: 30px;
1613 height: 43px;
1614 padding-left: 40px;
1615 color: #ff6621;
1616 margin: 0px;
1617 font-weight: normal;
1618 font-size: 13pt;
1619 text-decoration: none;
1620}
1621div.tabSidePanel ul.mainTabs li div.selectionHighlighter {
1622 display: none;
1623}
1624div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter {
1625 display: block;
1626 position: absolute;
1627 left: 154px;
1628 margin-top: -43px;
1629}
1630
1631// div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter div.selectionHighlighterIcon {
1632 // background-image: url(../images/main/tabs/selectionHighligher.png);
1633 // width: 50px;
1634 // height: 34px;
1635 // float: left;
1636 // z-index: 35000;
1637 // border: 1px solid red;
1638// }
1639
1640div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add {
1641 font-size: 14pt;
1642 font-weight: bold;
1643 position: relative;
1644 top: -34px;
1645 right: 16px;
1646 background: none;
1647 color: #c0531b;
1648 padding-left: 15px;
1649}
1650div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add:hover {
1651 color: white;
1652}
1653div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add span {
1654 font-size: 8pt;
1655 vertical-align: middle;
1656}
1657div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add h3 {
1658 display: inline;
1659 padding-left: 5px;
1660}
1661div.tabSidePanel ul.mainTabs li.cards.selected a {
1662 margin-left: -10px;
1663 padding-left: 50px;
1664 color: white;
1665 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px;
1666}
1667div.tabSidePanel ul.mainTabs li.cards.selected a:hover {
1668 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px;
1669}
1670div.tabSidePanel ul.mainTabs li.cards a {
1671 background: url(../images/old/main/tabs/cardsBackground.png) -19px -63px;
1672}
1673div.tabSidePanel ul.mainTabs li.cards a:hover {
1674 background: url(../images/old/main/tabs/cardsBackground.png) -19px -110px;
1675}
1676div.tabSidePanel ul.mainTabs li.directLogins.selected a {
1677 margin-left: -10px;
1678 padding-left: 50px;
1679 color: white;
1680 //background: url(../images/old/main/tabs/directLoginBackground.png) 0 -1px;
1681 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
1682}
1683div.tabSidePanel ul.mainTabs li.directLogins.selected a:hover {
1684 color: white;
1685 //background: url(../images/old/main/tabs/directLoginBackground.png) 0 -1px;
1686 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
1687}
1688div.tabSidePanel ul.mainTabs li.directLogins a {
1689 //background: url(../images/old/main/tabs/directLoginBackground.png) 0 -34px;
1690 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -63px;
1691}
1692div.tabSidePanel ul.mainTabs li.directLogins a:hover {
1693 //background: url(../images/old/main/tabs/directLoginBackground.png) 0 -67px;
1694 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -110px;
1695}
1696
1697div.tabSidePanel ul.otherTabs {
1698 margin: 10px 0px;
1699}
1700div.tabSidePanel ul.otherTabs li {
1701 margin-top: -4px;
1702}
1703div.tabSidePanel ul.otherTabs li div.selectionHighlighter {
1704 display: none;
1705}
1706div.tabSidePanel ul.otherTabs li.selected div.selectionHighlighter {
1707 display: block;
1708 position: absolute;
1709 left: 154px;
1710 margin-top: -42px;
1711}
1712div.tabSidePanel ul.otherTabs a {
1713 display: block;
1714 line-height: 36px;
1715 height: 43px;
1716 padding-left: 40px;
1717 color: #ff6621;
1718 text-decoration: none;
1719 //background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px;
1720}
1721div.tabSidePanel ul.otherTabs li.selected a {
1722 //background: url(../images/old/main/tabs/itemsBackground.png) 0 -1px;
1723 //background: url(../images/old/main/tabs/itemsBackground.png) 0 -67px;
1724
1725 margin-left: -10px;
1726 padding-left: 50px;
1727 background: url(../images/old/main/tabs/itemsBackground.png) 1px -96px;
1728 color: white;
1729}
1730div.tabSidePanel ul.otherTabs a:hover {
1731 //background: url(../images/old/main/tabs/itemsBackground.png) 0 -34px;
1732
1733 background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px;
1734}
1735
1736div.tagSidePanel {
1737 //position: relative;
1738 //width: 250px;
1739 //min-height: 100px;
1740 //left: 10px;
1741
1742 margin-right: -8px;
1743}
1744div.tagSidePanel div.header {
1745 height: 50px;
1746 background-image: url(../images/old/main/tabs/tagsBackground.png);
1747}
1748div.tagSidePanel div.header h1 {
1749 padding-left: 52px;
1750 padding-top: 14px;
1751 font-size: 14pt;
1752 font-weight: normal;
1753 color: #888888;
1754}
1755div.tagSidePanel div.body {
1756 background: url(../images/old/main/tabs/tagsBackground.png) -255px;
1757}
1758div.tagSidePanel div.footer {
1759 height: 10px;
1760 background: url(../images/old/main/tabs/tagsBackground.png) -510px -40px;
1761}
1762div.tagSidePanel ul.tags {
1763 margin: 0px;
1764 list-style-type: none;
1765 padding: 0px;
1766}
1767div.tagSidePanel ul.tags li a {
1768 display: block;
1769 font-size: 9pt;
1770 text-decoration: none;
1771 color: #ff6621;
1772 padding: 0px 4px 0px 15px;
1773 line-height: 20px;
1774}
1775div.tagSidePanel ul.tags li a:hover {
1776 background-color: #dddddd;
1777}
1778div.tagSidePanel ul.tags li span.tagCardinality {
1779 float: right;
1780 font-size: 8pt;
1781 color: #999999;
1782 margin-right: 15px;
1783 margin-top: -17px;
1784}
1785div.tagSidePanel ul.tags li.selected a {
1786 background-color: #d4d5cf;
1787}
1788div.tagSidePanel ul.tags li.selected a:hover {
1789 background-color: #d4d5cf;
1790}
1791div.tagSidePanel ul.tags li.selected a {
1792 font-weight: bold;
1793}
1794
1795div.groupSidePanel {
1796 margin-right: -10px;
1797 //position: relative;
1798 //width: 250px;
1799 //min-height: 100px;
1800 //left: 10px;
1801}
1802div.groupSidePanel div.header {
1803 height: 50px;
1804 background-image: url(../images/old/main/tabs/groupsBackground.png);
1805}
1806div.groupSidePanel div.header h1 {
1807 padding-left: 52px;
1808 padding-top: 14px;
1809 font-size: 14pt;
1810 font-weight: normal;
1811 color: white;
1812}
1813div.groupSidePanel div.header a {
1814 float: right;
1815 margin-top: -30px;
1816 margin-right: 20px;
1817 text-decoration: none;
1818 color: #666666;
1819 font-size: 9pt;
1820 line-height: 18px;
1821}
1822div.groupSidePanel div.header a:hover {
1823 color: #444444;
1824}
1825div.groupSidePanel div.body {
1826 background: url(../images/old/main/tabs/groupsBackground.png) -255px;
1827}
1828div.groupSidePanel div.footer {
1829 height: 10px;
1830 background: url(../images/old/main/tabs/groupsBackground.png) -510px -39px;
1831}
1832div.groupSidePanel ul.groups {
1833 margin: 0px;
1834 list-style-type: none;
1835 padding: 0px;
1836}
1837div.groupSidePanel ul.groups li a {
1838 display: block;
1839 font-size: 9pt;
1840 text-decoration: none;
1841 color: white;
1842 padding: 0px 4px 0px 15px;
1843 line-height: 20px;
1844}
1845div.groupSidePanel ul.groups li a:hover {
1846 background-color: #aaaaaa;
1847}
1848div.groupSidePanel ul.groups li span.groupCardinality {
1849 float: right;
1850 font-size: 8pt;
1851 color: #dddddd;
1852 margin-right: 15px;
1853 margin-top: -17px;
1854}
1855div.groupSidePanel ul.groups li.selected a {
1856 background-color: #bbbbbb;
1857}
1858div.groupSidePanel ul.groups li.selected a:hover {
1859 background-color: #bbbbbb;
1860}
1861div.groupSidePanel ul.groups li.selected a {
1862 font-weight: bold;
1863}
1864
1865div.mainPanels {
1866 float: left;
1867 width: 833px;
1868 margin-top: -38px;
1869 //position: relative;
1870 //width: 100%;
1871 //min-height: 600px;
1872 //top: -40px;
1873 //left: 250px;
1874}
1875div.mainFooter {
1876 clear: both;
1877}
1878// div.body div.rows table.rows tbody tr td.delete
1879div.delete, div.new {
1880 padding-left: 5px;
1881 height: 19px;
1882}
1883div.new span, div.delete span {
1884 margin: 0px;
1885 padding: 0px;
1886 border: 0px;
1887 display: inline-block;
1888 height: 19px;
1889 padding-right: 6px;
1890}
1891div.new span a, div.delete span a {
1892 white-space: nowrap;
1893}
1894div.delete:hover {
1895 background: url(../images/old/delete_background_left.png) no-repeat 0;
1896}
1897div.delete:hover span {
1898 background: url(../images/old/delete_background.png) no-repeat right 0;
1899}
1900div.new:hover {
1901 background: url(../images/old/new_background_left.png) no-repeat 0;
1902}
1903div.new:hover span {
1904 background: url(../images/old/new_background.png) no-repeat right 0;
1905}
1906
1907// tr.selected div.delete {
1908 // background: url(../images/old/delete_background_left.png) no-repeat 0;
1909// }
1910// tr.selected div.delete span {
1911 // background: url(../images/old/delete_background.png) no-repeat right 0;
1912// }
1913
1914div.body div.rows table.rows tbody tr td.delete div.delete span a {
1915 visibility: hidden;
1916 font-size: 8pt;
1917 vertical-align: -13px;
1918 color: black;
1919}
1920div.body div.rows table.rows tbody tr.selected td.delete div.delete span a {
1921 visibility: visible;
1922}
1923div.body div.rows table.rows tbody tr:hover td.delete div.delete span a {
1924 visibility: visible;
1925}
1926div.body div.rows table.rows tbody tr:hover td.delete div.delete:hover span a {
1927 color: white;
1928}
1929
1930// div.body div.rows table.rows tbody tr.selected td.delete div.delete span a {
1931 // color: white;
1932// }
1933
1934div.gridComponent table.rows thead tr th {
1935 text-align: left;
1936 height: 30px;
1937 vertical-align: bottom;
1938}
1939div.gridComponent table.rows thead tr th.sortable span {
1940 cursor: pointer;
1941}
1942div.gridComponent table.rows thead tr th.sortable span a {
1943 margin-left: 5px;
1944 padding-left: 10px;
1945}
1946div.gridComponent table.rows thead tr th.directLoginTH {
1947 width: 420px;
1948}
1949div.gridComponent table.rows thead tr th.latestUpdateTH {
1950 width: 100px;
1951}
1952div.gridComponent table.rows thead tr th.commandsTH {
1953 width: 150px;
1954}
1955div.gridComponent table.rows thead a {
1956 text-decoration: none;
1957}
1958div.gridComponent table.rows thead span {
1959 font-weight: normal;
1960 font-size: 9pt;
1961 line-height: 20px;
1962}
1963div.gridComponent div.header div.headerSlot {
1964 float: right;
1965}
1966
1967div.mainPanels div.gridComponent div.body table.rows td.favicon {
1968 padding-left: 25px;
1969}
1970div.mainPanels div.gridComponent div.body table.rows td.favicon img {
1971 width: 16px;
1972 height: 16px;
1973 border: 0px;
1974}
1975
1976div.gridComponent th.directLoginTH span {
1977 margin-left: 7px;
1978}
1979td.card_directLogins div {
1980 display: inline-table;
1981}
1982td.card_directLogins span {
1983 display: inline-block;
1984}
1985
1986// td.card_directLogins a {
1987 // display: inline-table;
1988 // height: 19px;
1989//
1990 // padding-right: 7px;
1991// }
1992//
1993// td.card_directLogins a:hover {
1994 // background: url(../images/old/directLink_background.png) right 0;
1995// }
1996
1997div.card_directLogin {
1998 display: inline-block;
1999 height: 19px;
2000 padding-left: 7px;
2001}
2002div.card_directLogin_ellipses span {
2003 padding-bottom: 2px;
2004}
2005div.card_directLogin div.card_directLogin_body {
2006 display: inline-block;
2007 height: 19px;
2008 padding-right: 8px;
2009 background-position: left;
2010}
2011div.card_directLogin div.card_directLogin_body a {
2012 vertical-align: -14px;
2013}
2014// div.card_directLogin:hover {
2015div.card_directLogin:hover {
2016 background: url(../images/old/directLink_background_left.png) no-repeat 0 0;
2017}
2018// div.card_directLogin:hover div {
2019div.card_directLogin:hover div.card_directLogin_body {
2020 background: url(../images/old/directLink_background.png) right 0;
2021}
2022
2023div.DirectLoginListPopup {
2024 position: absolute;
2025 width: 184px;
2026}
2027div.DirectLoginListPopup div.DirectLoginListPopup_body {
2028 background-image: url(../images/old/directLogins_background.png);
2029 padding-top: 8px;
2030}
2031div.DirectLoginListPopup div.DirectLoginListPopup_footer {
2032 height: 8px;
2033 background-image: url(../images/old/directLogins_background_bottom.png);
2034}
2035div.DirectLoginListPopup div.DirectLoginListPopup_body ul {
2036 margin: 0px;
2037 padding-left: 13px;
2038 list-style: none;
2039}
2040div.DirectLoginListPopup div.DirectLoginListPopup_body ul li {
2041 padding-top: 4px;
2042 height: 20px;
2043 padding-right: 10px;
2044 white-space: nowrap;
2045}
2046div.DirectLoginListPopup div.DirectLoginListPopup_body ul li div {
2047 padding-right: 10px;
2048 overflow: hidden;
2049}
2050div.DirectLoginListPopup div.DirectLoginListPopup_body ul li img.favicon {
2051 padding-left: 9px;
2052 padding-right: 5px;
2053}
2054div.DirectLoginListPopup div.DirectLoginListPopup_body ul li a {
2055 text-decoration: none;
2056 color: white;
2057 font-weight: normal;
2058 font-size: 10pt;
2059 vertical-align: 3px;
2060 white-space: nowrap;
2061 padding-right: 8px;
2062}
2063div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover {
2064 //background-color: #a5a696;
2065 //background-color: #7b7d70;
2066 background-color: rgba(123, 125, 112, 0.5);
2067}
2068div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover a {
2069 background: url(../images/old/directLink_no_background.png) right;
2070}
2071
2072div.mainPanels div.gridComponent div.header {
2073 //height: 90px;
2074 //background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat;
2075
2076 background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat;
2077 padding-left: 40px;
2078 padding-right: 40px;
2079 padding-top: 20px;
2080 padding-bottom: 10px;
2081}
2082div.mainPanels div.gridComponent div.header form.search {
2083 height: 32px;
2084 margin: 0px;
2085}
2086div.mainPanels div.gridComponent div.header form.search div.clearSearchButton {
2087 position: absolute;
2088 margin-left: 192px;
2089 width: 22px;
2090 height: 22px;
2091 margin-top: 6px;
2092 background: url(../images/old/filter/clearFilter_notSelected.png) no-repeat;
2093}
2094div.mainPanels div.gridComponent div.header form.search div.clearSearchButton:hover {
2095 background: url(../images/old/filter/clearFilter_selected.png) no-repeat;
2096 cursor: pointer;
2097}
2098div.mainPanels div.gridComponent div.header form.search div.search {
2099 display: block;
2100 float: left;
2101 width: 217px;
2102}
2103div.mainPanels div.gridComponent div.header form.search input.search {
2104 border: 1px solid #76786a;
2105 color: #666666;
2106 font-size: 12pt;
2107 width: 100%;
2108 padding: 4px;
2109 padding-left: 24px;
2110 padding-right: 26px;
2111 background: #e8ecde url(../images/old/main/grid/search.png) no-repeat 2px 4px;
2112}
2113div.mainPanels div.gridComponent div.header form.search input.search.disabled {
2114 disabled: disabled;
2115}
2116div.mainPanels div.gridComponent div.header form.search input.search.running {
2117 background: #e8ecde url(../images/old/main/grid/running_search.gif) no-repeat 4px 5px;
2118}
2119div.mainPanels div.gridComponent div.body {
2120 clear: both;
2121 background: url(../images/old/main/blocks/cardGridBackground.png) repeat-y -836px;
2122}
2123div.mainPanels div.gridComponent div.footer {
2124 background: url(../images/old/main/blocks/cardGridBackground.png) 834px -28px;
2125 height: 35px;
2126}
2127div.mainPanels div.gridComponent div.body h1 {
2128 margin: 0px;
2129}
2130div.mainPanels div.gridComponent div.body div.rows {
2131 margin-left: 9px;
2132 margin-right: 6px;
2133 min-height: 582px;
2134 background: url(../images/old/main/blocks/cardGridStripes.png) 0 7px;
2135}
2136div.mainPanels div.gridComponent.noRows div.body table.rows thead, div.mainPanels div.gridComponent.empty div.body table.rows thead {
2137 visibility: hidden;
2138}
2139div.mainPanels div.gridComponent.empty div.body div.rows {
2140 background: #eaebe6 url(../images/old/lock/background_star.png) no-repeat center center;
2141}
2142div.mainPanels div.gridComponent.noRows div.body div.rows {
2143 background: #eaebe6;
2144}
2145div.mainPanels div.gridComponent div.body table.rows {
2146 display: block;
2147 width: 100%;
2148}
2149div.mainPanels div.gridComponent div.body table.rows tbody tr.odd.selected {
2150 background-color: #a5a696;
2151}
2152div.mainPanels div.gridComponent div.body table.rows tbody tr.even.selected {
2153 background-color: #a5a696;
2154}
2155div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td a {
2156 color: #f3f4eb;
2157}
2158div.mainPanels div.gridComponent div.body table.rows tbody tr.odd {
2159 background-color: #d4d5cf;
2160}
2161div.mainPanels div.gridComponent div.body table.rows tbody tr.even {
2162 background-color: #eaebe6;
2163}
2164div.mainPanels div.gridComponent div.body table.rows tbody tr.odd:hover {
2165 background-color: #a5a696;
2166}
2167div.mainPanels div.gridComponent div.body table.rows tbody tr.even:hover {
2168 background-color: #a5a696;
2169}
2170div.mainPanels div.gridComponent div.body table.rows tbody tr td {
2171 height: 23px;
2172 max-height: 23px;
2173 //white-space: nowrap;
2174 //overflow: hidden;
2175}
2176div.mainPanels div.gridComponent div.body table.rows tbody tr td span {
2177 color: #828479;
2178 font-size: 10pt;
2179}
2180div.mainPanels div.gridComponent div.body table.rows tbody tr td a {
2181 color: #828479;
2182 font-size: 10pt;
2183 text-decoration: none;
2184}
2185div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td span {
2186 color: #f3f4eb;
2187}
2188div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td span {
2189 color: #f3f4eb;
2190}
2191div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td a {
2192 color: #f3f4eb;
2193}
2194div.mainPanels div.gridComponent div.body table.rows tbody tr td.title a {
2195 font-weight: bold;
2196}
2197div.mainPanels div.gridComponent div.body table.rows tbody tr td img.favicon {
2198 float: right;
2199 padding-right: 6px;
2200}
2201div.gridComponent table.rows thead img {
2202 padding-left: 10px;
2203 vertical-align: middle;
2204}
2205div.gridComponent table.rows thead tr th {
2206 background-color: #eaebe6;
2207 border-bottom: 1px solid #b3b4af;
2208}
2209div.gridComponent table.rows thead span {
2210 color: #8c8f7e;
2211}
2212div.gridComponent table.rows thead tr th.unsorted span.sortable a {
2213 background-image: url(../images/old/main/grid/unsorted.png);
2214}
2215div.gridComponent table.rows thead tr th.descending span.sortable a {
2216 background-image: url(../images/old/main/grid/descending.png);
2217}
2218div.gridComponent table.rows thead tr th.ascending span.sortable a {
2219 background-image: url(../images/old/main/grid/ascending.png);
2220}
2221div.gridComponent table.rows thead tr th.faviconTH {
2222 width: 53px;
2223}
2224div.gridComponent table.rows thead tr th.titleTH {
2225 width: 200px;
2226 max-width: 200px;
2227}
2228div.gridComponent table.rows thead tr th.deleteTH {
2229 width: 50px;
2230}
2231
2232
2233div.mainPanels div.directLoginGrid div.header form.search {
2234 background: url(../images/old/main/blocks/directLoginGridBackground.png) no-repeat;
2235 padding-left: 40px;
2236 padding-top: 20px;
2237 padding-bottom: 10px;
2238 margin: 0px;
2239}
2240
2241div.mainPanels div.directLoginGrid div.header form.search input.search {
2242 border: 1px solid #76786a;
2243 color: #666666;
2244 font-size: 12pt;
2245 padding: 4px;
2246 background-color: #e8ecde;
2247}
2248
2249div.mainPanels div.directLoginGrid div.header form.search input.searchButton {
2250 background-color: #858877;
2251 border: 0px;
2252 color: white;
2253 font-size: 10pt;
2254}
2255
2256div.mainPanels div.directLoginGrid div.body {
2257 background: url(../images/old/main/blocks/directLoginGridBackground.png) repeat-y -836px;
2258}
2259
2260div.mainPanels div.directLoginGrid div.footer {
2261 background: url(../images/old/main/blocks/directLoginGridBackground.png) 834px -28px;
2262 height: 35px;
2263}
2264
2265div.mainPanels div.directLoginGrid div.body h1 {
2266 margin: 0px;
2267}
2268
2269div.mainPanels div.directLoginGrid div.body div.rows {
2270 margin-left: 9px;
2271 margin-right: 6px;
2272 min-height: 582px;
2273 background: url(../images/old/main/blocks/directLoginGridStripes.png) 0 7px;
2274}
2275
2276div.mainPanels div.directLoginGrid div.body table.rows {
2277 display: block;
2278 width: 100%;
2279}
2280
2281div.mainPanels div.directLoginGrid div.body table.rows img {
2282 border: 0px;
2283}
2284
2285div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even {
2286 background-color: #787666;
2287}
2288
2289div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd {
2290 background-color: #646351;
2291}
2292
2293div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd:hover {
2294 background-color: #d1d4c6;
2295}
2296
2297div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even:hover {
2298 background-color: #d1d4c6;
2299}
2300
2301div.mainPanels div.directLoginGrid div.body table.rows tbody tr td {
2302 height: 23px;
2303 color: #e1e0d6;
2304 font-size: 10pt;
2305}
2306
2307div.mainPanels div.directLoginGrid div.body table.rows tbody tr:hover td {
2308 color: #777867;
2309}
2310
2311div.mainPanels div.directLoginGrid div.body table.rows tbody tr td.title {
2312 font-weight: bold;
2313}
2314
2315div.directLoginGrid div.body table.rows tbody tr a {
2316 color: #e1e0d6;
2317 text-decoration: none;
2318}
2319
2320div.directLoginGrid div.body table.rows tbody tr:hover a {
2321 color: #777867;
2322}
2323
2324div.directLogin_directLogin {
2325 display: inline-block;
2326 height: 19px;
2327 padding-left: 7px;
2328}
2329div.directLogin_directLogin div.directLogin_directLogin_body {
2330 display: inline-block;
2331 height: 19px;
2332 padding-right: 8px;
2333 background-position: left;
2334}
2335div.directLogin_directLogin div.directLogin_directLogin_body a {
2336 vertical-align: -14px;
2337}
2338div.directLogin_directLogin:hover {
2339 background: url(../images/old/directLink_background_left.png) no-repeat 0 0;
2340}
2341div.directLogin_directLogin:hover div.directLogin_directLogin_body {
2342 background: url(../images/old/directLink_background.png) right 0;
2343}
2344table.rows tbody tr td div.directLogin_directLogin:hover div.directLogin_directLogin_body a {
2345 color: #f3f4eb;
2346}
2347
2348div.directLoginGrid table.rows thead span {
2349 color: #e1e0d6;
2350}
2351div.directLoginGrid table.rows thead tr th {
2352 background-color: #787762;
2353 border-bottom: 1px solid #999883;
2354}
2355div.directLoginGrid table.rows thead tr th.faviconTH {
2356 min-width: 53px;
2357 width: 53px;
2358}
2359div.directLoginGrid table.rows thead tr th.titleTH {
2360 min-width: 250px;
2361 width: 250px;
2362}
2363div.directLoginGrid table.rows thead tr th.titleTH span {
2364 margin-left: 7px;
2365}
2366div.directLoginGrid table.rows thead tr th.strengthTH {
2367 width: 100px;
2368}
2369div.directLoginGrid table.rows thead tr th.cardTitleTH {
2370 width: 400px;
2371}
2372div.directLoginGrid table.rows thead tr th.bookmarkableLinkTH {
2373 width: 64px;
2374}
2375div.directLoginGrid table.rows thead tr th.deleteTH {
2376 width: 50px;
2377}
2378div.directLoginGrid table.rows thead tr th.latestAccessTH {
2379 width: 100px;
2380}
2381div.directLoginGrid table.rows thead tr th.commandsTH {
2382 width: 100px;
2383}
2384
2385div.directLoginGrid table.rows thead img {
2386 padding-left: 10px;
2387 vertical-align: middle;
2388}
2389div.directLoginGrid table.rows thead tr th.unsorted span.sortable a {
2390 background: url(../images/old/main/grid/directLogins/unsorted.png) no-repeat;
2391}
2392div.directLoginGrid table.rows thead tr th.descending span.sortable a {
2393 background: url(../images/old/main/grid/directLogins/descending.png) no-repeat;
2394}
2395div.directLoginGrid table.rows thead tr th.ascending span.sortable a {
2396 background: url(../images/old/main/grid/directLogins/ascending.png) no-repeat;
2397}
2398
2399div.subPanelTabs ul {
2400 margin: 0px;
2401 margin-right: 7px;
2402 padding: 0px;
2403}
2404div.subPanelTabs ul li {
2405 display: inline-block;
2406 vertical-align: middle;
2407 //width: 130px;
2408
2409 height: 50px;
2410 //border-right: 1px solid #a5a79c;
2411 //border-bottom: 1px solid #a5a79c;
2412
2413 border-right: 1px solid #eef0e3;
2414 border-bottom: 1px solid #d5d5bc;
2415}
2416div.subPanelTabs ul li.first:hover {
2417 //background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px;
2418}
2419div.subPanelTabs ul li:hover {
2420 //background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px;
2421
2422 border-right: 1px solid #d5d5bc;
2423 background-color: #eef0e3;
2424}
2425div.subPanelTabs ul li a {
2426 color: #787872;
2427 text-decoration: none;
2428 display: block;
2429 text-align: center;
2430 padding-top: 15px;
2431 padding-left: 20px;
2432 padding-right: 20px;
2433 font-size: 13pt;
2434}
2435div.subPanelTabs ul li.first {
2436 //background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px;
2437
2438 -webkit-border-top-left-radius: 20px;
2439 -moz-border-radius-topleft: 20px;
2440 border-top-left-radius: 20px;
2441}
2442div.subPanelTabs ul li.selected {
2443 //background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px;
2444
2445 background-color: #eef0e3;
2446 border-bottom: 1px solid #eef0e3;
2447 border-right: 1px solid #d5d5bc;
2448}
2449div.subPanelTabs ul li.selected:hover {
2450 border-right: 1px solid #d5d5bc;
2451}
2452div.subPanelTabs ul li.selected a {
2453 color: #444440;
2454}
2455div.subPanelContent {
2456 padding-top: 20px;
2457 padding-left: 30px;
2458 padding-right: 30px;
2459 min-height: 280px;
2460 color: #787872;
2461 margin: 0px 6px 0 9px;
2462}
2463div.subPanelContent ul {
2464 margin: 0px;
2465 padding: 0px;
2466 list-style-type: none;
2467}
2468div.subPanelContent ul li.selected {
2469 display: block;
2470}
2471div.subPanelContent ul li {
2472 display: none;
2473}
2474div.subPanelContent h3 {
2475 margin: 0px;
2476 border: 0px;
2477 padding: 0px;
2478}
2479
2480div.mainPanels div.otherPanel {
2481 margin: 5px 10px;
2482 background-color: #eef0e3;
2483 -webkit-border-radius: 20px;
2484 -moz-border-radius: 20px;
2485 border-radius: 20px;
2486 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2487 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2488 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2489}
2490div.mainPanels div.otherPanel div.header {
2491 //background: url(../images/old/main/blocks/otherPanelBackground.png) no-repeat;
2492 //height: 90px;
2493 background-color: #d5d5bc;
2494 //padding-left: 9px;
2495 //padding-top: 5px;
2496
2497 margin: 0px;
2498 margin-bottom: 0px;
2499 -webkit-border-top-left-radius: 20px;
2500 -webkit-border-top-right-radius: 20px;
2501 -moz-border-radius-topleft: 20px;
2502 -moz-border-radius-topright: 20px;
2503 border-top-left-radius: 20px;
2504 border-top-right-radius: 20px;
2505}
2506div.mainPanels div.otherPanel div.body {
2507 //background: url(../images/old/main/blocks/otherPanelBackground.png) repeat-y -836px;
2508
2509 margin: 0px;
2510 border: 0px;
2511 padding: 0px;
2512}
2513div.mainPanels div.otherPanel div.footer {
2514 //background: url(../images/old/main/blocks/otherPanelBackground.png) 834px -18px;
2515
2516 height: 45px;
2517}
2518div.mainPanels div.otherPanel div.body h1 {
2519 margin: 0px;
2520}
2521
2522form.changePassphrase div.currentCredentials, form.changePassphrase div.newPassphrase {
2523 float: left;
2524 padding: 10px 20px;
2525}
2526form.changePassphrase label {
2527 display: inline-block;
2528 width: 150px;
2529}
2530form.changePassphrase div.confirm {
2531 clear: both;
2532 padding: 10px 20px;
2533}
2534form.changePassphrase div.confirm label {
2535 width: 500px;
2536}
2537div.accountPanel h3.manageOTP {
2538 margin-top: 20px;
2539 margin-left: -20px;
2540 padding-top: 10px;
2541 padding-left: 20px;
2542 border-top: 1px solid #aaaaaa;
2543}
2544
2545div#modalDialogMask, div.modalDialogMask {
2546 z-index: 20000;
2547 //position: absolute;
2548
2549 position: fixed;
2550 top: 0;
2551 left: 0;
2552 -moz-opacity: 0.5;
2553 opacity: .50;
2554 filter: alpha(opacity=50);
2555 //background-color: #cccccc;
2556
2557 background-color: #000000;
2558 width: 100%;
2559 height: 100%;
2560 zoom: 1;
2561}
2562div#modalDialogFrame, div.modalDialogFrame {
2563 position: absolute;
2564 //border: 1px solid white;
2565
2566 -moz-opacity: 0.5;
2567 opacity: .50;
2568 filter: alpha(opacity=50);
2569 background-color: #333333;
2570 z-index: 20001;
2571 -webkit-border-radius: 20px;
2572 -moz-border-radius: 20px;
2573 border-radius: 20px;
2574}
2575div#modalDialog, div.modalDialog {
2576 z-index: 20001;
2577}
2578// div#modalDialog.scrollable,
2579div.modalDialog.scrollable {
2580 position: absolute;
2581 top: 0;
2582 left: 50%;
2583}
2584// div#modalDialog.fixed,
2585div.modalDialog.fixed {
2586 position: fixed;
2587 top: 40%;
2588 left: 50%;
2589}
2590div#modalDialog div, div.modalDialog div {
2591 z-index: 20002;
2592 list-style-type: circle;
2593}
2594div.modalDialogMask.simpleMessagePanelMask {
2595 z-index: 20010;
2596}
2597div.modalDialogFrame.simpleMessagePanelMask {
2598 z-index: 20011;
2599}
2600div.modalDialog.simpleMessagePanelMask {
2601 z-index: 20011;
2602}
2603div.modalDialog.simpleMessagePanelMask div {
2604 z-index: 20012;
2605}
2606
2607div.bookmarklet div.bookmarklet_link {
2608 //padding-top: 5px;
2609 //padding-left: 4px;
2610 //padding-right: 3px;
2611
2612 //float: right;
2613 //margin-top: 12px;
2614 //margin-right: 13px;
2615
2616 height: 34px;
2617}
2618div.bookmarklet div.bookmarklet_link a {
2619 color: #838975;
2620 text-decoration: none;
2621 font-weight: bold;
2622 font-size: 10pt;
2623
2624 //display: block;
2625 //text-align: right;
2626 //padding-top: 7px;
2627 //padding-right: 11px;
2628 //padding-bottom: 6px;
2629}
2630div.bookmarklet div.bookmarklet_link a div.icon {
2631 background: url(../images/old/bookmarklet/placeholder_icon.png) no-repeat 0 0;
2632 float: left;
2633 width: 34px;
2634 height: 34px;
2635}
2636div.bookmarklet div.bookmarklet_link a:hover div.icon {
2637 background: url(../images/old/bookmarklet/placeholder_selected_icon.png) no-repeat 0 0;
2638}
2639div.bookmarklet div.bookmarklet_link a div.text {
2640 display: block;
2641 float: right;
2642 background: url(../images/old/bookmarklet/placeholder.png) no-repeat right 0;
2643 white-space: nowrap;
2644 height: 34px;
2645}
2646div.bookmarklet div.bookmarklet_link a:hover div.text {
2647 background: url(../images/old/bookmarklet/placeholder_selected.png) no-repeat right 0;
2648}
2649div.bookmarklet div.bookmarklet_link a div.text span {
2650 display: block;
2651 padding-top: 10px;
2652 padding-right: 10px;
2653 padding-left: 6px;
2654 clear: both;
2655}
2656
2657div.tooltip {
2658 position: absolute;
2659 z-index: 30001;
2660}
2661div.tooltip div.tooltip_body {
2662 position: absolute;
2663}
2664div.tooltip div.tooltip_arrow {
2665 position: absolute;
2666}
2667div.tooltip.BELOW div.tooltip_arrow {
2668 background: url(../images/old/tooltips/top_arrow.png) no-repeat;
2669}
2670div.tooltip.ABOVE div.tooltip_arrow {
2671 background: url(../images/old/tooltips/bottom_arrow.png) no-repeat;
2672}
2673div.tooltip.LEFT div.tooltip_arrow {
2674 background: url(../images/old/tooltips/right_arrow.png) no-repeat;
2675}
2676div.tooltip.RIGHT div.tooltip_arrow {
2677 //margin-top: 7px;
2678
2679 background: url(../images/old/tooltips/left_arrow.png) no-repeat;
2680}
2681div.tooltip.RIGHT div.tooltip_body {
2682 //padding-left: 13px;
2683
2684}
2685div.tooltip div.tooltip_body div.tooltip_text {
2686 width: 171px;
2687 background: url(../images/old/tooltips/body.png) no-repeat center top;
2688}
2689div.tooltip.LEFT div.tooltip_body div.tooltip_text, div.tooltip.RIGHT div.tooltip_body div.tooltip_text {
2690 min-height: 45px;
2691}
2692div.tooltip div.tooltip_body span {
2693 display: block;
2694 padding: 10px;
2695 padding-bottom: 4px;
2696 font-size: 10pt;
2697 color: white;
2698}
2699div.tooltip div.tooltip_footer {
2700 height: 7px;
2701 background: url(../images/old/tooltips/body_bottom.png) no-repeat;
2702}
2703
2704// ---------------------------------------
2705
2706
2707div.mainDialog {
2708 position: relative;
2709 left: -263px;
2710 width: 525px;
2711 height: 325px;
2712}
2713div.scrollable div.mainDialog {
2714 top: 0px;
2715}
2716div.fixed div.mainDialog {
2717 top: -118px;
2718}
2719div.mainDialog div.header {
2720 height: 55px;
2721 background: url(../images/old/cardDialog/background_header.png) no-repeat;
2722}
2723div.mainDialog div.header div.title {
2724 padding-top: 16px;
2725 padding-left: 20px;
2726 padding-right: 20px;
2727}
2728div.mainDialog div.header div.title input {
2729 width: 100%;
2730 display: block;
2731 font-size: 16pt;
2732 margin: 0px;
2733 border: 0px;
2734 padding: 3px 10px;
2735 color: #787872;
2736 border: 1px solid #cccec0;
2737 background-color: #cccec0;
2738}
2739div.mainDialog div.header div.title h3 {
2740 display: block;
2741 font-size: 16pt;
2742 color: #787872;
2743 margin: 0px;
2744 border: 0px;
2745 padding: 3px 10px;
2746}
2747div.mainDialog div.header div.title.selectedField input, div.mainDialog div.header div.title:hover input {
2748 border: 1px solid #515247;
2749 background-color: #b5b7ab;
2750}
2751div.mainDialog div.header div.title.disabled:hover input {
2752 border: 1px solid #cccec0;
2753 background-color: #cccec0;
2754}
2755div.mainDialog div.body {
2756 padding-top: 0px;
2757 padding-left: 10px;
2758 padding-right: 9px;
2759 min-height: 200px;
2760 background: url(../images/old/cardDialog/background_body.png) repeat-y;
2761}
2762div.mainDialog div.body div.mask {
2763 display: none;
2764}
2765div.mainDialog.loading div.body div.mask {
2766 display: block;
2767 position: absolute;
2768 top: 55px;
2769 left: 10px;
2770 right: 9px;
2771 bottom: 70px;
2772 z-index: 1001;
2773 background-color: white;
2774 padding-left: 146px;
2775 padding-right: 146px;
2776 padding-top: 70px;
2777}
2778div.mainDialog.loading div.body .tabPanels {
2779 display: none;
2780}
2781div.mainDialog.loading div.body div.mask h3.progressDescription {
2782 margin: 0px;
2783 text-align: center;
2784 padding-bottom: 10px;
2785 color: #cccec0;
2786 font-size: 14pt;
2787 font-weight: normal;
2788}
2789div.loadingBar {
2790 height: 22px;
2791 width: 214px;
2792 background: url(../images/old/loading/loadingBar.gif) no-repeat center top;
2793}
2794div.loadingBar div.loadingBarProgressBox {
2795 padding: 2px;
2796}
2797div.loadingBar div.loadingBarProgress {
2798 height: 18px;
2799 width: 0%;
2800 //background-repeat: no-repeat;
2801
2802 background-color: rgba(248, 79, 0, 0.6);
2803 -webkit-border-radius: 9px;
2804 -moz-border-radius: 9px;
2805 border-radius: 9px;
2806}
2807
2808div.mainDialog div.body div ul {
2809 padding: 0px;
2810 clear: both;
2811 margin: 0px;
2812 list-style-type: none;
2813}
2814div.mainDialog div.body div.tabs {
2815 height: 20px;
2816}
2817div.mainDialog div.body div.tabs ul.tabs {
2818 height: 33px;
2819 //border-bottom: 1px solid #515247;
2820 //background: #cccec0 url(../images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px;
2821
2822 background: url(../images/old/cardDialog/tabs_background.png) repeat-x;
2823}
2824div.mainDialog div.body div.tabs ul.tabs li {
2825 //width: 150px;
2826
2827 height: 32px;
2828 font-size: 11pt;
2829 text-align: center;
2830 border-right: 1px solid #515247;
2831 float: left;
2832 color: #787872;
2833 border-bottom: 1px solid #515247;
2834 background: #cccec0 url(../images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px;
2835 cursor: pointer;
2836}
2837div.mainDialog div.body div.tabs ul.tabs li div {
2838 display: none;
2839}
2840div.mainDialog div.body div.tabs ul.tabs li span {
2841 display: block;
2842 padding-top: 9px;
2843 padding-bottom: 6px;
2844 padding-left: 40px;
2845 padding-right: 40px;
2846}
2847div.mainDialog div.body div.tabs ul.tabs li:hover {
2848 color: #515247;
2849}
2850div.mainDialog div.body div.tabs ul.tabs li.disabled:hover {
2851 color: #787872;
2852 cursor: default;
2853}
2854div.mainDialog div.body div.tabs ul.tabs li.selected {
2855 color: #515247;
2856 background-color: #f1f2e9;
2857 border-bottom: 1px solid #f1f2e9;
2858 cursor: default;
2859}
2860div.mainDialog div.body div.tabs ul.tabs li.selected.disabled:hover {
2861 color: #515247;
2862}
2863div.mainDialog div.body div.tabs ul.tabs li.selected div.backToDirectLoginList {
2864 position: absolute;
2865 display: block;
2866 top: 63px;
2867 left: 140;
2868 width: 20px;
2869}
2870div.mainDialog div.body div.tabs ul.tabs li.selected div.addDirectLoginButton {
2871 position: absolute;
2872 display: block;
2873 top: 63px;
2874 left: 265px;
2875 width: 20px;
2876}
2877div.mainDialog div.body div.tabs ul.tabs li.selected div span {
2878 padding: 0px;
2879 margin: 0px;
2880}
2881div.mainDialog div.body div.tabs ul.tabs li.selected div:hover {
2882 cursor: pointer;
2883}
2884div.mainDialog div.body .tabPanels {
2885 clear: both;
2886}
2887div.mainDialog div.body ul.tabPanels li.tabPanel {
2888 display: none;
2889}
2890div.mainDialog div.body ul.tabPanels li.tabPanel.selected {
2891 display: block;
2892}
2893div.mainDialog div.body ul.tabPanels li.tabPanel.selected h2 {
2894 margin: 0px;
2895 text-align: center;
2896 padding-top: 50px;
2897 color: #787872;
2898}
2899div.mainDialog div.body ul.tabPanels li.tabPanel.selected div.wizardStepDescription {
2900 margin: 0px 20px 10px;
2901 font-size: 10pt;
2902 color: b0b0b0;
2903 font-style: italic;
2904 text-align: center;
2905}
2906div.mainDialog div.footer {
2907 height: 70px;
2908 background: url(../images/old/cardDialog/background_footer.png) no-repeat 0 -14px;
2909}
2910div.mainDialog div.footer div.buttonArea {
2911 padding-left: 40px;
2912 padding-right: 40px;
2913 padding-top: 15px;
2914}
2915div.mainDialog div.footer div.buttonArea div {
2916 padding-left: 20px;
2917 padding-right: 20px;
2918 float: left;
2919 font-weight: bold;
2920 color: #787872;
2921}
2922div.mainDialog div.footer div.buttonArea div.disabled {
2923 color: #b1b1a8;
2924}
2925div.mainDialog div.footer div.buttonArea div.disabled:hover {
2926 color: #b1b1a8;
2927 cursor: default;
2928}
2929div.mainDialog div.footer div.buttonArea div:hover {
2930 color: #515247;
2931 cursor: pointer;
2932}
2933div.mainDialog div.footer div.buttonArea div.save {
2934 float: right;
2935}
2936
2937div.addDirectLoginButton {
2938 height: 20px;
2939 width: 20px;
2940 background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat -9px -9px;
2941 color: white;
2942 font-weight: bold;
2943}
2944div.addDirectLoginButton span {
2945 display: block;
2946 height: 20px;
2947 width: 20px;
2948}
2949div.addDirectLoginButton:hover {
2950 background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat -9px -9px;
2951}
2952
2953div.directLoginsComponentContainer {
2954 overflow: hidden;
2955 //background-color: green;
2956
2957}
2958div.CardDialog div.directLogins {
2959 //background-color: yellow;
2960
2961 padding-top: 2px;
2962}
2963div.CardDialog div.addNewDirectLoginSplash {
2964 margin: 0px 80px;
2965}
2966div.CardDialog div.addNewDirectLoginSplash h3 {
2967 color: #aaaaaa;
2968 text-align: center;
2969 font-weight: normal;
2970 font-size: 11pt;
2971}
2972div.CardDialog div.addNewDirectLoginSplash a {
2973 display: block;
2974 text-decoration: none;
2975 margin-left: auto;
2976 margin-right: auto;
2977 width: 190px;
2978 //color: #787878;
2979
2980 color: rgba(255, 98, 6, 0.75);
2981 text-transform: uppercase;
2982 background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat right;
2983}
2984div.CardDialog div.addNewDirectLoginSplash a span {
2985 text-align: center;
2986}
2987div.CardDialog div.addNewDirectLoginSplash a:hover {
2988 color: #ff6206;
2989 background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat right;
2990}
2991div.CardDialog div.directLoginItem {
2992 clear: both;
2993 min-height: 32px;
2994 padding-left: 10px;
2995 padding-top: 4px;
2996 padding-bottom: 2px;
2997 //width: 100px;
2998
2999 max-height: 32px;
3000 overflow: hidden;
3001}
3002div.CardDialog div.directLoginItem:hover {
3003 background-color: #cccec0;
3004}
3005div.CardDialog div.addDirectLoginListItem {
3006 min-height: 32px;
3007 padding-left: 10px;
3008 padding-top: 4px;
3009 padding-bottom: 2px;
3010 max-height: 32px;
3011 overflow: hidden;
3012 background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat 22px 0;
3013}
3014div.CardDialog div.addDirectLoginListItem a {
3015 display: block;
3016 font-size: 11pt;
3017 padding-top: 6px;
3018 padding-left: 50px;
3019 color: rgba(255, 98, 6, 0.75);
3020 text-decoration: none;
3021 text-transform: uppercase;
3022}
3023div.CardDialog div.addDirectLoginListItem:hover {
3024 background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat 22px 0;
3025 color: #ff6206;
3026 background-color: #cccec0;
3027}
3028div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_favicon img.favicon {
3029 width: 32px;
3030 height: 32px;
3031 float: left;
3032}
3033div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_label input {
3034 float: left;
3035 font-size: 11pt;
3036 border: 0px;
3037 padding: 5px;
3038 color: #787872;
3039 border: 1px solid #ededeb;
3040 background-color: #ededeb;
3041 height: 30px;
3042 margin-left: 10px;
3043 width: 68%;
3044 margin-right: 5px;
3045}
3046div.CardDialog div.directLoginItem:hover div.cardDialogRecordDirectLoginComponent_label input {
3047 border: 1px solid #515247;
3048 background-color: #b5b7ab;
3049}
3050div.CardDialog div.directLoginItem > div.open {
3051 float: left;
3052 margin-top: 5px;
3053 margin-right: 2px;
3054 padding-left: 5px;
3055 visibility: hidden;
3056}
3057div.CardDialog div.directLoginItem > div.edit, div.CardDialog div.directLoginItem > div.delete {
3058 float: left;
3059 margin-top: 5px;
3060 margin-left: 3px;
3061 padding-left: 5px;
3062 visibility: hidden;
3063}
3064div.CardDialog div.directLoginItem > div.open a {
3065 display: block;
3066 width: 22px;
3067 height: 22px;
3068 background: url(../images/old/cardDialog/openDirectLogin.png) no-repeat 0 -2px;
3069}
3070div.CardDialog div.directLoginItem > div.open a:hover {
3071 background: url(../images/old/cardDialog/openDirectLogin_selected.png) no-repeat 0 -2px;
3072}
3073div.CardDialog div.directLoginItem:hover > div.open, div.CardDialog div.directLoginItem:hover > div.edit, div.CardDialog div.directLoginItem:hover > div.delete {
3074 visibility: visible;
3075}
3076div.CardDialog div.directLoginItem div.edit span {
3077 padding-right: 6px;
3078 display: block;
3079}
3080div.CardDialog div.directLoginItem div.open span a, div.CardDialog div.directLoginItem div.edit span a, div.CardDialog div.directLoginItem div.delete span a {
3081 font-size: 8pt;
3082 color: #666666;
3083 text-decoration: none;
3084 line-height: 19px;
3085}
3086div.CardDialog div.directLoginItem div.edit:hover {
3087 background: url(../images/old/new_background_left.png) no-repeat;
3088}
3089div.CardDialog div.directLoginItem div:hover span a {
3090 color: white;
3091}
3092div.CardDialog div.directLoginItem div.edit:hover span {
3093 background: url(../images/old/new_background.png) no-repeat right center;
3094}
3095div.CardDialog div.directLoginItem div.delete:hover {
3096 background: url(../images/old/delete_background_left.png) no-repeat;
3097}
3098div.CardDialog div.directLoginItem div.delete:hover span {
3099 background: url(../images/old/delete_background.png) right;
3100}
3101div.CardDialog div.directLoginEditDetail {
3102 position: relative;
3103 //background-color: red;
3104
3105}
3106
3107form.directLoginEditingForm div.title, form.directLoginEditingForm div.favicon {
3108 padding: 5px 10px;
3109}
3110form.directLoginEditingForm div.title.disabled:hover {
3111 background-color: #f1f2e9;
3112}
3113form.directLoginEditingForm div.title:hover, form.directLoginEditingForm div.favicon:hover {
3114 background-color: #cccec0;
3115}
3116form.directLoginEditingForm div.title input {
3117 //width: 100%;
3118
3119 margin: 0px;
3120 margin-left: 10px;
3121 width: 440px;
3122}
3123form.directLoginEditingForm div.favicon {
3124 padding-left: 10px;
3125}
3126// form.directLoginEditingForm div.favicon img.favicon {
3127form.directLoginEditingForm img.favicon {
3128 float: left;
3129 width: 32px;
3130 height: 32px;
3131}
3132form.directLoginEditingForm div.favicon input {
3133 margin-top: 1px;
3134 width: 465px;
3135}
3136form.directLoginEditingForm div.disabled:hover input, form.directLoginEditingForm div input {
3137 font-size: 11pt;
3138 border: 0px;
3139 padding: 5px;
3140 color: #787872;
3141 border: 1px solid #ededeb;
3142 background-color: #ededeb;
3143 height: 30px;
3144}
3145form.directLoginEditingForm div:hover input {
3146 border: 1px solid #515247;
3147 background-color: #b5b7ab;
3148}
3149
3150div.bindings div.binding > span.formFieldName {
3151 display: inline-block;
3152 width: 140px;
3153 overflow: hidden;
3154 margin-right: 10px;
3155 color: #6b5147;
3156 text-overflow: ellipsis;
3157}
3158div.bindings div.binding {
3159 padding-bottom: 3px;
3160}
3161div.bindings div.binding > input {
3162 margin-right: 10px;
3163 background: #cccec0;
3164 width: 150px;
3165 border: 1px solid #cccec0;
3166}
3167div.bindings div.binding:hover > input {
3168 border: 1px solid #cccec0;
3169}
3170div.bindings div.binding > select {
3171 font-size: 13pt;
3172}
3173div.bindings div.binding span.fieldLock {
3174 display: inline-block;
3175 width: 20px;
3176 height: 20px;
3177 margin-right: 3px;
3178}
3179div.bindings div.binding.showLocked input {
3180 background: url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3181 //color: black;
3182
3183 overflow: hidden;
3184 background: #cccec0 url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3185 color: rgba(237, 237, 235, 0.1);
3186}
3187div.bindings div.binding span.fieldLock a {
3188 display: none;
3189}
3190div.bindings div.binding.locked span.fieldLock a {
3191 display: block;
3192 width: 20px;
3193 height: 20px;
3194 text-decoration: none;
3195 background-image: url(../images/old/cardDialog/lock_open.png);
3196} 1970}
3197div.bindings div.binding.locked.showLocked span.fieldLock a { 1971div.sidePanels div.tabSidePanel {
3198 background-image: url(../images/old/cardDialog/lock_closed.png); 1972 margin-right: -10px;
3199 text-decoration: none;
3200} 1973}
3201 1974div.sidePanels div.tabSidePanel ul {
3202div.formValues { 1975 margin: 0px;
3203 padding-top: 15px; 1976 padding-left: 0px;
1977 list-style-type: none;
1978 color: #f78b46;
3204} 1979}
3205div.formValues div.formValue div { 1980div.sidePanels div.tabSidePanel ul.mainTabs {
3206 margin: 0px; 1981 margin: 0px;
3207 display: inline-block;
3208} 1982}
3209div.formValues div.formValue > span.formFieldName { 1983div.sidePanels div.tabSidePanel ul.mainTabs li a {
3210 display: inline-table; 1984 display: block;
3211 width: 160px; 1985 line-height: 30px;
3212 overflow: hidden; 1986 height: 43px;
3213 margin-right: 10px; 1987 padding-left: 40px;
3214 color: #6b5147; 1988 color: #ff6621;
1989 margin: 0px;
1990 font-weight: normal;
1991 font-size: 13pt;
1992 text-decoration: none;
3215} 1993}
3216 1994div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter {
3217div.directLoginEditing { 1995 display: none;
3218 padding-top: 2px;
3219} 1996}
3220div.directLoginEditing div.tabContainer { 1997div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add {
3221 min-height: 150px; 1998 font-size: 14pt;
3222 height: 200px; 1999 font-weight: bold;
2000 position: relative;
2001 top: -34px;
2002 right: 16px;
2003 background: none;
2004 color: #c0531b;
2005 padding-left: 15px;
3223} 2006}
3224div.directLoginEditing div.tabContainer > ul.tabs { 2007div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add:hover {
3225 display: none; 2008 color: white;
3226} 2009}
3227 2010div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add span {
3228div.directLoginEditing li { 2011 font-size: 8pt;
3229 padding: 10px; 2012 vertical-align: middle;
3230} 2013}
3231div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper > textarea { 2014div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add h3 {
3232 float: left; 2015 display: inline;
3233 width: 320px; 2016 padding-left: 5px;
3234 height: 125px;
3235 font-family: monospace;
3236 font-weight: normal;
3237 font-size: 8pt;
3238 border: 1px solid #ccc;
3239} 2017}
3240div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper .bookmarkletComponent { 2018div.sidePanels div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter {
3241 float: right; 2019 display: block;
2020 position: absolute;
2021 left: 154px;
2022 margin-top: -43px;
3242} 2023}
3243div.directLoginEditing li.configuration > textarea.error { 2024div.sidePanels div.tabSidePanel ul.mainTabs li.cards a {
3244 border: 1px solid red; 2025 background: url(../images/old/main/tabs/cardsBackground.png) -19px -63px;
3245 background-color: rgba(255, 0, 0, 0.1);
3246} 2026}
3247 2027div.sidePanels div.tabSidePanel ul.mainTabs li.cards a:hover {
3248div.CardDialog div.body { 2028 background: url(../images/old/main/tabs/cardsBackground.png) -19px -110px;
3249 padding-bottom: 1px;
3250} 2029}
3251div.CardDialog div.body table.fields { 2030div.sidePanels div.tabSidePanel ul.mainTabs li.cards.selected a {
3252 width: 100%; 2031 margin-left: -10px;
3253 padding-top: 8px; 2032 padding-left: 50px;
3254 padding-bottom: 1px; 2033 color: white;
2034 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px;
3255} 2035}
3256div.CardDialog div.body table.fields thead { 2036div.sidePanels div.tabSidePanel ul.mainTabs li.cards.selected a:hover {
3257 background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 15px; 2037 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px;
3258} 2038}
3259div.CardDialog div.body table.fields tfoot { 2039div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins a {
3260 background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 bottom; 2040 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -63px;
3261} 2041}
3262div.CardDialog div.body table.fields thead th { 2042div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins a:hover {
3263 text-align: left; 2043 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -110px;
3264 font-weight: normal;
3265 font-size: 9pt;
3266 color: #787872;
3267 padding-left: 10px;
3268 padding-bottom: 3px;
3269 //border-bottom: 1px dotted;
3270} 2044}
3271div.CardDialog div.body table.fields thead th.fieldStateTH { 2045div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins.selected a {
3272 width: 10px; 2046 margin-left: -10px;
2047 padding-left: 50px;
2048 color: white;
2049 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
3273} 2050}
3274div.CardDialog div.body table.fields tbody td.fieldLabel input { 2051div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins.selected a:hover {
3275 width: 130px; 2052 color: white;
2053 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
3276} 2054}
3277div.CardDialog div.body table.fields thead th.fieldLockTH { 2055div.sidePanels div.tabSidePanel ul.otherTabs {
3278 width: 10px; 2056 margin: 10px 0px;
3279} 2057}
3280div.CardDialog div.body table.fields tbody td.fieldValue input { 2058div.sidePanels div.tabSidePanel ul.otherTabs li {
3281 width: 280px; 2059 margin-top: -4px;
3282} 2060}
3283div.CardDialog div.body table.fields thead th.fieldActionTH { 2061div.sidePanels div.tabSidePanel ul.otherTabs li div.selectionHighlighter {
3284 width: 30px; 2062 display: none;
3285} 2063}
3286div.CardDialog div.body table.fields thead th.fieldDeleteTH { 2064div.sidePanels div.tabSidePanel ul.otherTabs li a {
3287 width: 40px; 2065 display: block;
2066 line-height: 36px;
2067 height: 43px;
2068 padding-left: 40px;
2069 color: #ff6621;
2070 text-decoration: none;
3288} 2071}
3289div.CardDialog div.body table.fields tbody tr:hover, div.CardDialog div.body table.fields tbody tr.selectedField { 2072div.sidePanels div.tabSidePanel ul.otherTabs li a:hover {
3290 background-color: #cccec0; 2073 background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px;
3291} 2074}
3292div.CardDialog div.body table.fields tbody tr td { 2075div.sidePanels div.tabSidePanel ul.otherTabs li.selected a {
3293 font-size: 11pt; 2076 margin-left: -10px;
3294 color: #787872; 2077 padding-left: 50px;
3295 height: 35px; 2078 background: url(../images/old/main/tabs/itemsBackground.png) 1px -96px;
2079 color: white;
3296} 2080}
3297div.CardDialog div.body table.fields tbody tr td input { 2081div.sidePanels div.tabSidePanel ul.otherTabs li.selected div.selectionHighlighter {
3298 font-size: 11pt; 2082 display: block;
3299 border: 0px; 2083 position: absolute;
3300 padding: 5px; 2084 left: 154px;
3301 color: #787872; 2085 margin-top: -42px;
3302 border: 1px solid #ededeb;
3303 background-color: #ededeb;
3304 height: 30px;
3305} 2086}
2087div.tagSidePanel {
2088 /*
2089 margin-right: -8px;
3306 2090
3307div.CardDialog div.body table.fields tbody tr td.fieldValue div.locked input { 2091 div.tagSidePanel div.header {
3308 background: #ededeb url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px; 2092 height: 50px;
3309 color: #ededeb; 2093 background-image: url(../images/old/main/tabs/tagsBackground.png);
3310 color: rgba(237, 237, 235, 0.1); 2094 }
3311 //color: black; 2095 div.tagSidePanel div.header h1 {
3312 //line-height: 100px; 2096 padding-left: 52px;
3313 2097 padding-top: 14px;
3314 overflow: hidden; 2098 font-size: 14pt;
3315} 2099 font-weight: normal;
3316div.locked input.value::-moz-selection { 2100 color: #888888;
3317 background: #ff0000; 2101 }
3318} 2102 div.tagSidePanel div.body {
3319div.locked input.value::selection { 2103 background: url(../images/old/main/tabs/tagsBackground.png) -255px;
3320 background: #ff0000; 2104 }
3321} 2105 div.tagSidePanel div.footer {
3322div.CardDialog div.body table.fields tbody tr.new.selectedField td input, 2106 height: 10px;
3323div.CardDialog div.body table.fields tbody tr.new:hover td input, 2107 background: url(../images/old/main/tabs/tagsBackground.png) -510px -40px;
3324div.CardDialog div.body table.fields tbody tr:hover td input, 2108 }
3325div.CardDialog div.body table.fields tbody tr.selectedField td input { 2109 div.tagSidePanel ul.tags {
3326 border: 1px solid #515247; 2110 margin: 0px;
3327 background-color: #b5b7ab; 2111 list-style-type: none;
3328} 2112 padding: 0px;
3329div.CardDialog div.body table.fields tbody tr:hover td.fieldValue div.locked input, div.CardDialog div.body table.fields tbody tr.selectedField td.fieldValue div.locked input { 2113 }
3330 background: #b5b7ab url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px; 2114 div.tagSidePanel ul.tags li a {
3331 color: #b5b7ab; 2115 display: block;
3332 color: rgba(237, 237, 235, 0.1); 2116 font-size: 9pt;
3333} 2117 text-decoration: none;
3334div.CardDialog div.body table.fields tbody td.fieldLock div { 2118 color: #ff6621;
3335 width: 20px; 2119 padding: 0px 4px 0px 15px;
3336 height: 19px; 2120 line-height: 20px;
3337 cursor: pointer; 2121 }
3338} 2122 div.tagSidePanel ul.tags li a:hover {
3339div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.locked { 2123 background-color: #dddddd;
3340 background-image: url(../images/old/cardDialog/lock_closed.png); 2124 }
3341} 2125 div.tagSidePanel ul.tags li span.tagCardinality {
3342div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.unlocked { 2126 float: right;
3343 background-image: url(../images/old/cardDialog/lock_open.png); 2127 font-size: 8pt;
3344} 2128 color: #999999;
3345div.CardDialog div.body table.fields tbody tr td.fieldAddDelete div span a { 2129 margin-right: 15px;
3346 text-decoration: none; 2130 margin-top: -17px;
3347 visibility: hidden; 2131 }
3348 font-size: 8pt; 2132 div.tagSidePanel ul.tags li.selected a {
3349 vertical-align: -13px; 2133 background-color: #d4d5cf;
3350 color: black; 2134 }
3351} 2135 div.tagSidePanel ul.tags li.selected a:hover {
3352div.CardDialog div.body table.fields tbody tr.selectedField td.fieldAddDelete div span a { 2136 background-color: #d4d5cf;
3353 visibility: visible; 2137 }
3354} 2138 div.tagSidePanel ul.tags li.selected a {
3355div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div span a { 2139 font-weight: bold;
3356 visibility: visible; 2140 }
3357} 2141*/
3358div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div:hover span a {
3359 color: white;
3360}
3361div.CardDialog div.body div.notes {
3362 background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 0;
3363 padding-top: 2px;
3364}
3365div.CardDialog div.body div.notes div {
3366 padding-left: 20px;
3367 padding-right: 20px;
3368 padding-top: 4px;
3369 padding-bottom: 4px;
3370}
3371div.CardDialog div.body div.notes div:hover, div.CardDialog div.body div.notes.selectedField div {
3372 background-color: #cccec0;
3373}
3374div.CardDialog.loading div.body div.notes div textarea {
3375 display: none;
3376}
3377div.CardDialog div.body div.notes div textarea {
3378 border: 0;
3379 width: 470px;
3380 //width: 100%;
3381 //height: 100px;
3382 // min-height: 400px;
3383 //overflow: hidden;
3384
3385 color: #787872;
3386 border: 1px solid #ededeb;
3387 background-color: #ededeb;
3388 display: block;
3389 line-height: 12pt;
3390 min-height: 50px;
3391}
3392div.CardDialog div.body div.notes div:hover textarea, div.CardDialog div.body div.notes.selectedField div textarea {
3393 border: 1px solid #515247;
3394 background-color: #b5b7ab;
3395}
3396div.CardDialog div.body table.fields tbody tr td.fieldAction {
3397 //background-color: red;
3398
3399 padding-left: 4px;
3400}
3401div.CardDialog div.body table.fields tbody tr td.fieldAction a {
3402 display: inline-block;
3403 text-decoration: none;
3404 text-align: center;
3405 width: 16px;
3406 height: 16px;
3407}
3408div.CardDialog div.body table.fields tbody tr td.fieldAction a.email {
3409 background: url(../images/old/cardDialog/fieldTypes/email.png) no-repeat 0 0;
3410}
3411div.CardDialog div.body table.fields tbody tr td.fieldAction a.email:hover {
3412 background: url(../images/old/cardDialog/fieldTypes/email_selected.png) no-repeat 0 0;
3413}
3414div.CardDialog div.body table.fields tbody tr td.fieldAction a.url {
3415 background: url(../images/old/cardDialog/fieldTypes/url.png) no-repeat 0 0;
3416}
3417div.CardDialog div.body table.fields tbody tr td.fieldAction a.url:hover {
3418 background: url(../images/old/cardDialog/fieldTypes/url_selected.png) no-repeat 0 0;
3419}
3420div.CardDialog div.body table.fields tbody tr td.fieldAction a.password {
3421 background: url(../images/old/cardDialog/fieldTypes/password.png) no-repeat 0 0;
3422}
3423div.CardDialog div.body table.fields tbody tr td.fieldAction a.password:hover {
3424 background: url(../images/old/cardDialog/fieldTypes/password_selected.png) no-repeat 0 0;
3425}
3426div#disabledZone {
3427 display: block;
3428 visibility: visible;
3429}
3430div#messageZone {
3431 display: block;
3432 visibility: visible;
3433}
3434div.CardDialog div.error div.img {
3435 margin: 10px;
3436 width: 50px;
3437 height: 50px;
3438 float: left;
3439 background-image: url(../images/old/simpleMessageBox/Alert.png);
3440}
3441div.rulerWrapper {
3442 left: -1000px;
3443 margin-top: -30px;
3444 margin-left: 50%;
3445 z-index: 25000;
3446}
3447div.rulerWrapper.fixed {
3448 position: fixed;
3449}
3450div.rulerWrapper.scrollable {
3451 position: absolute;
3452} 2142}
3453div.ruler { 2143div.groupSidePanel {
3454 //position: absolute; 2144 /*
3455 2145 margin-right: -10px;
3456 width: 541px;
3457 height: 96px;
3458 margin-left: -270px;
3459 background: url(../images/old/ruler/ruler.png) no-repeat;
3460}
3461div.ruler a {
3462 position: absolute;
3463 display: block;
3464 width: 15px;
3465 height: 15px;
3466 top: 3px;
3467 text-decoration: none;
3468}
3469div.ruler a.exit {
3470 margin-left: 2px;
3471 background: url(../images/old/ruler/exit.png) no-repeat;
3472}
3473div.ruler a.exit:hover {
3474 background: url(../images/old/ruler/exit_selected.png) no-repeat;
3475}
3476div.ruler a.smallButton.previous {
3477 right: 16px;
3478 background: url(../images/old/ruler/small_previous.png) no-repeat;
3479}
3480div.ruler a.smallButton.previous:hover {
3481 cursor: pointer;
3482 background: url(../images/old/ruler/small_previous_selected.png) no-repeat;
3483}
3484div.ruler a.smallButton.previous.disabled, div.ruler a.smallButton.previous.disabled:hover {
3485 cursor: default;
3486 background: url(../images/old/ruler/small_previous_disabled.png) no-repeat;
3487}
3488div.ruler a.smallButton.next {
3489 right: 3px;
3490 background: url(../images/old/ruler/small_next.png) no-repeat;
3491}
3492div.ruler a.smallButton.next:hover {
3493 cursor: pointer;
3494 background: url(../images/old/ruler/small_next_selected.png) no-repeat;
3495}
3496div.ruler a.smallButton.next.disabled, div.ruler a.smallButton.next.disabled:hover {
3497 cursor: default;
3498 background: url(../images/old/ruler/small_next_disabled.png) no-repeat;
3499}
3500div.ruler div.steps, div.ruler div.dots {
3501 position: absolute;
3502 background-color: rgba(255, 255, 255, 0);
3503 margin-left: 30px;
3504 margin-right: 30px;
3505}
3506div.ruler div.steps {
3507 top: 25px;
3508 height: 30px;
3509}
3510div.ruler div.dots {
3511 top: 58px;
3512 height: 25px;
3513}
3514div.ruler div ul {
3515 list-style-type: none;
3516 margin: 0px;
3517 padding: 0px;
3518}
3519div.ruler div ul li {
3520 display: inline-block;
3521 vertical-align: top;
3522}
3523div.ruler > div.steps > ul > li:first-child, div.ruler > div.dots > ul > li:first-child {
3524 margin-left: 0px;
3525}
3526div.ruler div.steps_3 ul li {
3527 margin-left: 135px;
3528}
3529div.ruler div.steps_4 ul li {
3530 margin-left: 67px;
3531}
3532div.ruler div.steps_5 ul li {
3533 margin-left: 32px;
3534}
3535div.ruler div.steps_6 ul li {
3536 margin-left: 12px;
3537}
3538div.ruler div ul li span {
3539 font-weight: bold;
3540 text-align: center;
3541 width: 70px;
3542 display: block;
3543 font-size: 8pt;
3544 overflow: hidden;
3545 color: rgba(0, 0, 0, 0.3);
3546}
3547div.ruler div ul li.selected span {
3548 color: black;
3549}
3550div.ruler div.dots ul li span {
3551 //text-align: center;
3552 //width: 26px;
3553 //margin-left: 22px;
3554 //margin-right: 22px;
3555 //height: 25px;
3556 //background-color: #e57218;
3557 2146
3558 font-size: 40pt; 2147 div.groupSidePanel div.header {
3559 line-height: 47px; 2148 height: 50px;
3560} 2149 background-image: url(../images/old/main/tabs/groupsBackground.png);
3561div.ruler div.marker { 2150 }
3562 position: absolute; 2151 div.groupSidePanel div.header h1 {
3563 top: -3px; 2152 padding-left: 52px;
3564 //left: -246px; 2153 padding-top: 14px;
3565} 2154 font-size: 14pt;
3566div.ruler div.marker div.markerBody { 2155 font-weight: normal;
3567 width: 77px; 2156 color: white;
3568 height: 97px; 2157 }
3569 background: url(../images/old/ruler/marker.png) no-repeat; 2158 div.groupSidePanel div.header a {
3570} 2159 float: right;
3571div.ruler div.marker div.next { 2160 margin-top: -30px;
3572 position: absolute; 2161 margin-right: 20px;
3573 top: 25px; 2162 text-decoration: none;
3574 left: 76px; 2163 color: #666666;
3575 width: 27px; 2164 font-size: 9pt;
3576 height: 65px; 2165 line-height: 18px;
3577 background: url(../images/old/ruler/next.png) no-repeat -13px; 2166 }
3578 z-index: 26000; 2167 div.groupSidePanel div.header a:hover {
3579} 2168 color: #444444;
3580div.ruler div.marker div.next:hover { 2169 }
3581 cursor: pointer; 2170 div.groupSidePanel div.body {
3582 background: url(../images/old/ruler/next.png) no-repeat -2px; 2171 background: url(../images/old/main/tabs/groupsBackground.png) -255px;
3583} 2172 }
3584div.ruler div.marker div.disabled { 2173 div.groupSidePanel div.footer {
3585 display: none; 2174 height: 10px;
3586} 2175 background: url(../images/old/main/tabs/groupsBackground.png) -510px -39px;
3587div.ruler div.marker div.previous { 2176 }
3588 position: absolute; 2177 div.groupSidePanel ul.groups {
3589 top: 25px; 2178 margin: 0px;
3590 left: -24px; 2179 list-style-type: none;
3591 width: 27px; 2180 padding: 0px;
3592 height: 65px; 2181 }
3593 //background: url(../images/old/ruler/previous.png) no-repeat 13px 1px; 2182 div.groupSidePanel ul.groups li a {
3594 background: url(../images/old/ruler/previous.png) no-repeat 18px 1px; 2183 display: block;
3595 z-index: 26000; 2184 font-size: 9pt;
3596} 2185 text-decoration: none;
3597div.ruler div.marker div.previous:hover { 2186 color: white;
3598 cursor: pointer; 2187 padding: 0px 4px 0px 15px;
3599 //background: url(../images/old/ruler/previous.png) no-repeat 2px 1px; 2188 line-height: 20px;
3600 background: url(../images/old/ruler/previous.png) no-repeat 7px 1px; 2189 }
2190 div.groupSidePanel ul.groups li a:hover {
2191 background-color: #aaaaaa;
2192 }
2193 div.groupSidePanel ul.groups li span.groupCardinality {
2194 float: right;
2195 font-size: 8pt;
2196 color: #dddddd;
2197 margin-right: 15px;
2198 margin-top: -17px;
2199 }
2200 div.groupSidePanel ul.groups li.selected a {
2201 background-color: #bbbbbb;
2202 }
2203 div.groupSidePanel ul.groups li.selected a:hover {
2204 background-color: #bbbbbb;
2205 }
2206 div.groupSidePanel ul.groups li.selected a {
2207 font-weight: bold;
2208 }
2209*/
3601} 2210}
3602
3603div.createNewCardSplash {
3604 margin-top: -450px;
3605 margin-left: 250px;
3606 width: 354px;
3607 float: left;
3608 height: 186px;
3609 text-align: center;
3610 background: url(../images/old/main/grid/createNewCardSplash.png) no-repeat;
3611}
3612div.createNewCardSplash:hover {
3613 cursor: pointer;
3614 background: url(../images/old/main/grid/createNewCardSplash_selected.png) no-repeat;
3615}
3616div.createNewCardSplash span {
3617 display: block;
3618 padding-top: 130px;
3619 font-size: 14pt;
3620 color: #9a9586;
3621}
3622div.createNewCardSplash:hover span {
3623 color: #605c4e;
3624}
3625//=============================================
3626div.NewUserCreation div.tabContainer {
3627 min-height: 150px;
3628 height: 200px;
3629}
3630div.NewUserCreation div.tabContainer > ul.tabs {
3631 display: none;
3632}
3633ul.createUserStates li.creating {
3634 background: url(../images/old/creatingUser.gif) no-repeat center center;
3635}
3636ul.createUserStates li {
3637 height: 100px;
3638}
3639ul.createUserStates li span {
3640 display: block;
3641 width: 100%;
3642 text-align: center;
3643 color: #999;
3644 font-style: italic;
3645}
3646div.NewUserCreation form.newUserCreationForm ul.tabPanels {
3647 padding-top: 10px;
3648}
3649div.NewUserCreation form.newUserCreationForm ul ul {
3650 margin-left: auto;
3651 margin-right: auto;
3652 width: 400px;
3653}
3654div.NewUserCreation form.newUserCreationForm ul.credentials li {
3655 height: 45px;
3656}
3657div.NewUserCreation form.newUserCreationForm ul.credentials span.label {
3658 text-align: right;
3659 display: inline-block;
3660 font-size: 12pt;
3661 color: #787872;
3662 width: 110px;
3663 vertical-align: baseline;
3664}
3665div.NewUserCreation form.newUserCreationForm ul.credentials input {
3666 font-size: 13pt;
3667 color: #787872;
3668 height: 35px;
3669 margin-left: 15px;
3670 padding-left: 5px;
3671}
3672div.NewUserCreation form.newUserCreationForm ul.termsOfService li {
3673 padding: 0 0 15 0;
3674}
3675div.NewUserCreation form.newUserCreationForm ul.termsOfService input {
3676 display: inline-block;
3677}
3678div.NewUserCreation form.newUserCreationForm ul.termsOfService .label {
3679 display: inline-block;
3680 text-align: left;
3681 font-size: 12pt;
3682 color: #787872;
3683 width: 350px;
3684 vertical-align: top;
3685 padding-left: 10px;
3686}
3687div.NewUserCreation form.newUserCreationForm ul.termsOfService a {
3688 font-weight: bold;
3689 color: #787872;
3690 text-decoration: none;
3691}
3692div.NewUserCreation form.newUserCreationForm ul.termsOfService a:hover {
3693 color: #444;
3694}
3695div.NewUserCreation form.newUserCreationForm ul.createUserStates li.done span {
3696 font-size: 16pt;
3697 color: green;
3698}
3699div.NewUserCreation form.newUserCreationForm ul.createUserStates li.fail span {
3700 font-size: 16pt;
3701 color: red;
3702}
3703*/ \ No newline at end of file
diff --git a/frontend/gamma/html/exitPage_template.html b/frontend/gamma/html/exitPage_template.html
index b46f9f6..e17bee0 100644
--- a/frontend/gamma/html/exitPage_template.html
+++ b/frontend/gamma/html/exitPage_template.html
@@ -1,89 +1,64 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please
8refer to http://www.clipperz.com.
9
10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version.
14
15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details.
19
20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>.
23
24-->
25
26<html> 1<html>
27<head> 2<head>
28 <title>clipperz</title> 3 <title>clipperz</title>
29 <link rel="stylesheet" type="text/css" href="./static.css" /> 4 <link rel="stylesheet" type="text/css" href="./static.css" />
30 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
31</head> 6</head>
32<body> 7<body>
33 8
34<!-- h1>clipper<span class="logo_z">z</span></h1 --> 9<!-- h1>clipper<span class="logo_z">z</span></h1 -->
35<div class="header"> 10<div class="header">
36 <div id="logo"></div> 11 <div id="logo"></div>
37 <h5 class="clipperzPayoff">keep it to yourself!</h5> 12 <h5 class="clipperzPayoff">keep it to yourself!</h5>
38</div> 13</div>
39 14
40 15
41<div class="contentWrapper"> 16<div class="contentWrapper">
42 <div class="block1"> 17 <div class="block1">
43 <div class="languageBlock en-us"> 18 <div class="languageBlock en-us">
44 <div class="flags"></div> 19 <div class="flags"></div>
45 <div class="content"> 20 <div class="content">
46 <h3>Goodbye! Thanks for using Clipperz.</h3> 21 <h3>Goodbye! Thanks for using Clipperz.</h3>
47 22
48 <p>You just logged out from your Clipperz account. We hope to see you again soon!</p> 23 <p>You just logged out from your Clipperz account. We hope to see you again soon!</p>
49 </div> 24 </div>
50 </div> 25 </div>
51 26
52 27
53 <div class="languageBlock zh-cn"> 28 <div class="languageBlock zh-cn">
54 <div class="flags"></div> 29 <div class="flags"></div>
55 <div class="content"> 30 <div class="content">
56 <h3>下次再见!感谢您使用 Clipperz。</h3> 31 <h3>下次再见!感谢您使用 Clipperz。</h3>
57 32
58 <p>您仅仅是从您的 Clipperz 账户登出,我们希望很快再次见到您!</p> 33 <p>您仅仅是从您的 Clipperz 账户登出,我们希望很快再次见到您!</p>
59 </div> 34 </div>
60 </div> 35 </div>
61 36
62 37
63 <!-- 38 <!--
64 <div class="languageBlock fr-fr"> 39 <div class="languageBlock fr-fr">
65 <div class="flags"></div> 40 <div class="flags"></div>
66 <div class="content"> 41 <div class="content">
67 <h3></h3> 42 <h3></h3>
68 43
69 <p></p> 44 <p></p>
70 </div> 45 </div>
71 </div> 46 </div>
72 --> 47 -->
73 48
74 49
75 <div class="languageBlock it-it"> 50 <div class="languageBlock it-it">
76 <div class="flags"></div> 51 <div class="flags"></div>
77 <div class="content"> 52 <div class="content">
78 <h3>Arrivederci! Grazie per aver scelto Clipperz.</h3> 53 <h3>Arrivederci! Grazie per aver scelto Clipperz.</h3>
79 54
80 <p>Sei uscito da Clipperz. Speriamo di rivederti presto.</p> 55 <p>Sei uscito da Clipperz. Speriamo di rivederti presto.</p>
81 </div> 56 </div>
82 </div> 57 </div>
83 58
84 59
85 <div class="languageBlock ja-jp"> 60 <div class="languageBlock ja-jp">
86 <div class="flags"></div> 61 <div class="flags"></div>
87 <div class="content"> 62 <div class="content">
88 <h3>Clipperz をご利用いただきありがとうございました。</h3> 63 <h3>Clipperz をご利用いただきありがとうございました。</h3>
89 64
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy.js b/frontend/gamma/js/Clipperz/PM/Proxy.js
index 9817eac..190bffd 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy.js
@@ -81,89 +81,89 @@ Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
81 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay')); 81 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay'));
82 deferredResult.addCallback(function(aToll) { 82 deferredResult.addCallback(function(aToll) {
83 var result; 83 var result;
84 84
85 result = { 85 result = {
86 parameters: someParameters, 86 parameters: someParameters,
87 toll: aToll 87 toll: aToll
88 } 88 }
89 89
90 return result; 90 return result;
91 }); 91 });
92 92
93 deferredResult.callback(); 93 deferredResult.callback();
94 } else { 94 } else {
95 deferredResult = MochiKit.Async.succeed({parameters:someParameters}); 95 deferredResult = MochiKit.Async.succeed({parameters:someParameters});
96 } 96 }
97//console.log("<<< Proxy.payToll"); 97//console.log("<<< Proxy.payToll");
98 98
99 return deferredResult; 99 return deferredResult;
100 }, 100 },
101 101
102 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
103 103
104 'addToll': function(aToll) { 104 'addToll': function(aToll) {
105//console.log(">>> Proxy.addToll", aToll); 105//console.log(">>> Proxy.addToll", aToll);
106 this.tolls()[aToll.requestType()].push(aToll); 106 this.tolls()[aToll.requestType()].push(aToll);
107//console.log("<<< Proxy.addToll"); 107//console.log("<<< Proxy.addToll");
108 }, 108 },
109 109
110 //========================================================================= 110 //=========================================================================
111 111
112 'setTollCallback': function(someParameters) { 112 'setTollCallback': function(someParameters) {
113//console.log(">>> Proxy.setTollCallback", someParameters); 113//console.log(">>> Proxy.setTollCallback", someParameters);
114 if (typeof(someParameters['toll']) != 'undefined') { 114 if (typeof(someParameters['toll']) != 'undefined') {
115//console.log("added a new toll", someParameters['toll']); 115//console.log("added a new toll", someParameters['toll']);
116 this.addToll(new Clipperz.PM.Toll(someParameters['toll'])); 116 this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
117 } 117 }
118//console.log("<<< Proxy.setTallCallback", someParameters['result']); 118//console.log("<<< Proxy.setTallCallback", someParameters['result']);
119 return someParameters['result']; 119 return someParameters['result'];
120 }, 120 },
121 121
122 //========================================================================= 122 //=========================================================================
123 123
124 'registration': function (someParameters) { 124 'registration': function (someParameters) {
125 return this.processMessage('registration', someParameters, 'REGISTER'); 125 return this.processMessage('registration', someParameters, 'REGISTER');
126 }, 126 },
127 127
128 'handshake': function (someParameters) { 128 'handshake': function (someParameters) {
129 return this.processMessage('handshake', someParameters, 'CONNECT'); 129 return this.processMessage('handshake', someParameters, 'CONNECT');
130 }, 130 },
131 131
132 'message': function (someParameters) { 132 'message': function (someParameters) {
133 return this.processMessage('message', someParameters, 'MESSAGE'); 133 return this.processMessage('message', someParameters, 'MESSAGE');
134 }, 134 },
135 135
136 'logout': function (someParameters) { 136 'logout': function (someParameters) {
137 return this.processMessage('logout', someParameters, 'MESSAGE'); 137 return this.processMessage('logout', someParameters, 'MESSAGE');
138 }, 138 },
139 139
140 //========================================================================= 140 //=========================================================================
141 141
142 'processMessage': function (aFunctionName, someParameters, aRequestType) { 142 'processMessage': function (aFunctionName, someParameters, aRequestType) {
143 vardeferredResult; 143 vardeferredResult;
144 144
145 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:true}); 145 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false});
146 deferredResult.addMethod(this, 'payToll', aRequestType); 146 deferredResult.addMethod(this, 'payToll', aRequestType);
147 deferredResult.addMethod(this, 'sendMessage', aFunctionName); 147 deferredResult.addMethod(this, 'sendMessage', aFunctionName);
148 deferredResult.addMethod(this, 'setTollCallback'); 148 deferredResult.addMethod(this, 'setTollCallback');
149 deferredResult.callback(someParameters); 149 deferredResult.callback(someParameters);
150 150
151 return deferredResult; 151 return deferredResult;
152 }, 152 },
153 153
154 //========================================================================= 154 //=========================================================================
155 155
156 'sendMessage': function () { 156 'sendMessage': function () {
157 throw Clipperz.Base.exception.AbstractMethod; 157 throw Clipperz.Base.exception.AbstractMethod;
158 }, 158 },
159 159
160 //========================================================================= 160 //=========================================================================
161 161
162 'isReadOnly': function () { 162 'isReadOnly': function () {
163 return false; 163 return false;
164 }, 164 },
165 165
166 //========================================================================= 166 //=========================================================================
167 __syntaxFix__: "syntax fix" 167 __syntaxFix__: "syntax fix"
168 168
169}); 169});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
index 095e8ed..8df7e0e 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
@@ -41,173 +41,174 @@ Clipperz.PM.UI.Common.Components.Tooltip = function(args) {
41 this.renderSelf(); 41 this.renderSelf();
42 42
43 return this; 43 return this;
44} 44}
45 45
46//============================================================================= 46//=============================================================================
47 47
48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, { 48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
49 49
50 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
51 51
52 'toString': function () { 52 'toString': function () {
53 return "Clipperz.PM.UI.Common.Components.Tooltip component"; 53 return "Clipperz.PM.UI.Common.Components.Tooltip component";
54 }, 54 },
55 55
56 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
57 57
58 'text': function () { 58 'text': function () {
59 return this._text; 59 return this._text;
60 }, 60 },
61 61
62 'setText': function (aValue) { 62 'setText': function (aValue) {
63 this._text = aValue; 63 this._text = aValue;
64 }, 64 },
65 65
66 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
67 67
68 'position': function () { 68 'position': function () {
69 return this._position; 69 return this._position;
70 }, 70 },
71 71
72 'setPosition': function (aValue) { 72 'setPosition': function (aValue) {
73 this._position = aValue; 73 this._position = aValue;
74 }, 74 },
75 75
76 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
77 77
78 'enabled': function () { 78 'enabled': function () {
79 return this._enabled; 79 return this._enabled;
80 }, 80 },
81 81
82 'setIsEnabled': function (aValue) { 82 'setIsEnabled': function (aValue) {
83 this._enabled = aValue; 83 this._enabled = aValue;
84 }, 84 },
85 85
86 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
87 87
88 'isVisible': function () { 88 'isVisible': function () {
89 return this._isVisible; 89 return this._isVisible;
90 }, 90 },
91 91
92 'setIsVisible': function (aValue) { 92 'setIsVisible': function (aValue) {
93 this._isVisible = aValue; 93 this._isVisible = aValue;
94 }, 94 },
95 95
96 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
97 97
98 'renderSelf': function() { 98 'renderSelf': function() {
99 // this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 99 // this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
100 // this.append(MochiKit.DOM.currentDocument().body, {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 100 // this.append(MochiKit.DOM.currentDocument().body, {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
101 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 101 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
102 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[ 102 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
103 {tag:'div', cls:'tooltip_text', children:[ 103 {tag:'div', cls:'tooltip_text', children:[
104 {tag:'span', html:this.text()} 104 {tag:'span', html:this.text()}
105 ]}, 105 ]}//,
106 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'} 106 // {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
107 ]}, 107 ]},
108 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'} 108 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
109 ]}); 109 ]});
110 110
111 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 111 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
112 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 112 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
113 113
114 MochiKit.Style.hideElement(this.displayElement()); 114 MochiKit.Style.hideElement(this.displayElement());
115 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 115 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
116 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 116 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
117 }, 117 },
118 118
119 //----------------------------------------------------- 119 //-----------------------------------------------------
120 120
121 'displayElement': function() { 121 'displayElement': function() {
122 return this.getElement('tooltip'); 122 return this.getElement('tooltip');
123 }, 123 },
124 124
125 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
126 126
127 'boxDimensions': function () { 127 'boxDimensions': function () {
128 return this._boxDimensions; 128 return this._boxDimensions;
129 }, 129 },
130 130
131 //------------------------------------------------------------------------- 131 //-------------------------------------------------------------------------
132 132
133 'show': function () { 133 'show': function () {
134 var elementSizeAndPosition; 134 var elementSizeAndPosition;
135 var arrowPosition; 135 var arrowPosition;
136 var bodyPosition; 136 var bodyPosition;
137 137
138 if (this.isVisible() == false) { 138 if (this.isVisible() == false) {
139 arrowPosition = {}; 139 arrowPosition = {};
140 bodyPosition = {}; 140 bodyPosition = {};
141 141
142 this.setIsVisible(true); 142 this.setIsVisible(true);
143 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element()); 143 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
144//console.log("ELEMENT SIZE AND POSITION", Clipperz.Base.serializeJSON(elementSizeAndPosition)); 144//console.log("ELEMENT SIZE AND POSITION", Clipperz.Base.serializeJSON(elementSizeAndPosition));
145//console.log("BOX DIMENSIONS", Clipperz.Base.serializeJSON(this.boxDimensions())); 145//console.log("BOX DIMENSIONS", Clipperz.Base.serializeJSON(this.boxDimensions()));
146 switch (this.position()) { 146 switch (this.position()) {
147 case 'ABOVE': 147 case 'ABOVE':
148//console.log("ABOVE"); 148//console.log("ABOVE");
149 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 149 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
150 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 150 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
151 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13; 151 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
152 152
153 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 153 // arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
154 arrowPosition.y = elementSizeAndPosition.position.y - 13; 154 // arrowPosition.y = elementSizeAndPosition.position.y - 13;
155 break; 155 break;
156 case 'BELOW': 156 case 'BELOW':
157//console.log("BELOW"); 157//console.log("BELOW");
158 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 158 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
159 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 159 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
160 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13; 160 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
161 161
162 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 162 // arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
163 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h; 163 // arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
164 break; 164 break;
165 case 'LEFT': 165 case 'LEFT':
166//console.log("LEFT"); 166//console.log("LEFT");
167 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 167 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
168 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13; 168 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
169 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2); 169 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
170 170
171 arrowPosition.x = elementSizeAndPosition.position.x -13; 171 // arrowPosition.x = elementSizeAndPosition.position.x -13;
172 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2); 172 // arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
173 break; 173 break;
174 case 'RIGHT': 174 case 'RIGHT':
175//console.log("RIGHT"); 175//console.log("RIGHT");
176 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 176 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
177 bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13; 177 bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13;
178 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2); 178 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
179 179
180 arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w; 180 // arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w;
181 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2); 181 // arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
182 break; 182 break;
183 } 183 }
184//console.log("X: " + bodyPosition.x + ", Y: " + bodyPosition.y); 184//console.log("X: " + bodyPosition.x + ", Y: " + bodyPosition.y);
185 185
186 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition); 186 MochiKit.Style.setElementPosition(this.getId('tooltip'), bodyPosition);
187 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition); 187 // MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
188 // MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
188 MochiKit.Visual.appear(this.displayElement(), {duration:0.4}); 189 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
189 } 190 }
190 }, 191 },
191 192
192 'hide': function () { 193 'hide': function () {
193 if (this.isVisible() == true) { 194 if (this.isVisible() == true) {
194 MochiKit.Visual.fade(this.displayElement(), {duration:0.4}); 195 MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
195 this.setIsVisible(false); 196 this.setIsVisible(false);
196 } 197 }
197 }, 198 },
198 199
199 //------------------------------------------------------------------------- 200 //-------------------------------------------------------------------------
200/* 201/*
201 'shouldRemoveElementWhenClearningUp': function () { 202 'shouldRemoveElementWhenClearningUp': function () {
202 return false; 203 return false;
203 }, 204 },
204*/ 205*/
205 //------------------------------------------------------------------------- 206 //-------------------------------------------------------------------------
206 __syntaxFix__: "syntax fix" 207 __syntaxFix__: "syntax fix"
207}); 208});
208 209
209Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () { 210Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () {
210 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'}); 211 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'});
211} 212}
212 213
213MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.Tooltip.initTooltips); 214MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.Tooltip.initTooltips);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
index 389d876..a10ba4f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
@@ -4,197 +4,175 @@ Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24*/ 24*/
25 25
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 27
28Clipperz.PM.UI.Web.Components.LoginForm = function(args) { 28Clipperz.PM.UI.Web.Components.LoginForm = function(args) {
29 args = args || {}; 29 args = args || {};
30 30
31 this._autocomplete = args.autocomplete || 'off'; 31 this._autocomplete = args.autocomplete || 'off';
32 32
33 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments); 33 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments);
34 34
35 this._slots = { 35 this._slots = {
36 'passphraseEntropy':this.getId('passphraseEntropy') 36 'passphraseEntropy':this.getId('passphraseEntropy')
37 }; 37 };
38 38
39 return this; 39 return this;
40} 40}
41 41
42//============================================================================= 42//=============================================================================
43 43
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 45
46 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
47 47
48 'toString': function () { 48 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.LoginForm component"; 49 return "Clipperz.PM.UI.Web.Components.LoginForm component";
50 }, 50 },
51 51
52 'autocomplete': function () { 52 'autocomplete': function () {
53 return this._autocomplete; 53 return this._autocomplete;
54 }, 54 },
55 55
56 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
57 57
58 'renderSelf': function() { 58 'renderSelf': function() {
59 this.append(this.element(), {tag:'div', id:'loginBox', children:[ 59 this.append(this.element(), {tag:'div', id:'loginBox', children:[
60 {tag:'div', cls:'header'}, 60 {tag:'div', cls:'header'},
61 {tag:'div', cls:'body', id:this.getId('body'), children:[ 61 {tag:'div', cls:'body', id:this.getId('body'), children:[
62 {tag:'div', id:this.getId('loginForm'), children:[ 62 {tag:'div', id:this.getId('loginForm'), children:[
63 {tag:'div', children:[ 63 {tag:'div', children:[
64 {tag:'h4', html:'Login'}, 64 {tag:'h4', html:'Login'},
65 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[ 65 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[
66 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[ 66 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[
67 {tag:'label', html:'username', 'for':this.getId('usernameField')}, 67 {tag:'label', html:'username', 'for':this.getId('usernameField')},
68 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'/*, value:'joe'*/}, 68 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'},
69 {tag:'ul', id:this.getId('passwordOptions'), children:[ 69 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')},
70 {tag:'li', id:this.getId('passphraseOption'), children:[ 70 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'},
71 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')},
72 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'/*, value:'clipperz'*/}
73 ]} //,
74/*
75 {tag:'li', id:this.getId('otpOption'), children:[
76 {tag:'label', html:'one-time password', 'for':this.getId('otpField_1')},
77 {tag:'input', id:this.getId('otpField_1'), type:'text', cls:'otp', value:'abcd-efgh'},
78 {tag:'input', id:this.getId('otpField_2'), type:'text', cls:'otp', value:'abcd-efgh'},
79 {tag:'input', id:this.getId('otpField_3'), type:'text', cls:'otp', value:'abcd-efgh'},
80 {tag:'input', id:this.getId('otpField_4'), type:'text', cls:'otp', value:'abcd-efgh'}
81 ]}
82*/
83 ]},
84 // {tag:'input', id:this.getId('otpCheckbox'), type:'checkbox', cls:'checkbox'},
85 // {tag:'label', html:'use a one-time passphrase', 'for':this.getId('otpCheckbox'), cls:'checkbox'},
86 71
87 {tag:'div', cls:'translations', children:[ 72 {tag:'div', cls:'translations', children:[
88 {tag:'h4', html:'choose your language'}, 73 {tag:'h4', html:'choose your language'},
89 {tag:'ul', children:[ 74 {tag:'ul', children:[
90 {tag:'li', cls:'selected', html:'english'}, 75 {tag:'li', cls:'selected', html:'english'},
91 {tag:'li', html:'italiano'}, 76 {tag:'li', html:'italiano'},
92 {tag:'li', html:'dutch'}, 77 {tag:'li', html:'dutch'},
93 {tag:'li', html:'french'}, 78 {tag:'li', html:'french'},
94 {tag:'li', html:'spanish'}, 79 {tag:'li', html:'spanish'},
95 {tag:'li', html:'chinese'}, 80 {tag:'li', html:'chinese'},
96 {tag:'li', html:'japanese'}, 81 {tag:'li', html:'japanese'},
97 {tag:'li', html:'portugal'}, 82 {tag:'li', html:'portugal'},
98 {tag:'li', html:'arabic'} 83 {tag:'li', html:'arabic'}
99 ]} 84 ]}
100 ]}, 85 ]},
101 86
102 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'} 87 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'}
103 ]} 88 ]}
104 ]} 89 ]}
105 ]} 90 ]}
106 ]}, 91 ]},
107 {tag:'div', cls:'footer'} 92 {tag:'div', cls:'footer'}
108 ]}); 93 ]});
109 94
110 if (this.autocomplete() == 'off') { 95 if (this.autocomplete() == 'off') {
111 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'}); 96 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'});
112 } 97 }
113 98
114 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"}) 99 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"})
115 100
116 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField'))); 101 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField')));
117 102
118 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields'); 103 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields');
119 // this.showPassphraseField(); 104 // this.showPassphraseField();
120 105
121 this.getElement('usernameField').focus(); 106 this.getElement('usernameField').focus();
122 107
123 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler'); 108 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler');
124 }, 109 },
125 110
126 //----------------------------------------------------------------------------- 111 //-----------------------------------------------------------------------------
127/* 112/*
128 'togglePasswordFields': function(anEvent) { 113 'togglePasswordFields': function(anEvent) {
129 var shouldUseOTP; 114 var shouldUseOTP;
130 115
131 shouldUseOTP = this.getElement('otpCheckbox').checked; 116 shouldUseOTP = this.getElement('otpCheckbox').checked;
132 117
133 if (shouldUseOTP == false) { 118 if (shouldUseOTP == false) {
134 this.showPassphraseField(); 119 this.showPassphraseField();
135 } else { 120 } else {
136 this.showOTPFields(); 121 this.showOTPFields();
137 } 122 }
138 }, 123 },
139*/ 124*/
140 //----------------------------------------------------------------------------- 125 //-----------------------------------------------------------------------------
141/* 126/*
142 'showPassphraseField': function() { 127 'showPassphraseField': function() {
143 this.showElement('passphraseOption'); 128 this.showElement('passphraseOption');
144 this.hideElement('otpOption'); 129 this.hideElement('otpOption');
145 }, 130 },
146*/ 131*/
147 //----------------------------------------------------------------------------- 132 //-----------------------------------------------------------------------------
148 133
149 'focusOnPassphraseField': function () { 134 'focusOnPassphraseField': function () {
150 this.getElement('passphraseField').focus(); 135 this.getElement('passphraseField').focus();
151 this.getElement('passphraseField').select(); 136 this.getElement('passphraseField').select();
152 }, 137 },
153 138
154 //----------------------------------------------------------------------------- 139 //-----------------------------------------------------------------------------
155/* 140/*
156 'showOTPFields': function() { 141 'showOTPFields': function() {
157 this.hideElement('passphraseOption'); 142 this.hideElement('passphraseOption');
158 this.showElement('otpOption'); 143 this.showElement('otpOption');
159 }, 144 },
160*/ 145*/
161 //------------------------------------------------------------------------- 146 //-------------------------------------------------------------------------
162 147
163 'loginEventHandler': function(anEvent) { 148 'loginEventHandler': function(anEvent) {
164 varusername; 149 // varusername;
165 var passphrase; 150 // var passphrase;
166 // var shouldUseOTP;
167 // var otp;
168 var signalArguments; 151 var signalArguments;
169 152
170 anEvent.preventDefault(); 153 anEvent.preventDefault();
171 154
172 username = this.getElement('usernameField').value; 155 // username = this.getElement('usernameField').value;
173 passphrase = this.getElement('passphraseField').value; 156 // passphrase = this.getElement('passphraseField').value;
174 // otp =this.getElement('otpField_1').value + 157
175 // this.getElement('otpField_2').value + 158 // signalArguments = {username:username};
176 // this.getElement('otpField_3').value + 159 // signalArguments.passphrase = passphrase;
177 // this.getElement('otpField_4').value; 160
178 // shouldUseOTP = this.getElement('otpCheckbox').checked; 161 signalArguments = {
179 162 'username': this.getElement('usernameField').value,
180 signalArguments = {username:username}; 163 'passphrase':this.getElement('passphraseField').value
181 164 };
182 // if (shouldUseOTP) {
183 // signalArguments.otp = otp;
184 // } else {
185 signalArguments.passphrase = passphrase;
186 // }
187 165
188 MochiKit.Signal.signal(this, 'doLogin', signalArguments); 166 MochiKit.Signal.signal(this, 'doLogin', signalArguments);
189 }, 167 },
190 168
191 //------------------------------------------------------------------------- 169 //-------------------------------------------------------------------------
192 170
193 'submitButtonElement': function() { 171 'submitButtonElement': function() {
194 return this.getElement('submitButton'); 172 return this.getElement('submitButton');
195 }, 173 },
196 174
197 //------------------------------------------------------------------------- 175 //-------------------------------------------------------------------------
198 176
199 __syntaxFix__: "syntax fix" 177 __syntaxFix__: "syntax fix"
200}); 178});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
index d0b378c..a57152d 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
@@ -20,151 +20,145 @@ refer to http://www.clipperz.com.
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24*/ 24*/
25 25
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 27
28Clipperz.PM.UI.Web.Controllers.LoginController = function(args) { 28Clipperz.PM.UI.Web.Controllers.LoginController = function(args) {
29 this._args = args || {}; 29 this._args = args || {};
30 30
31 this._loginPage = null; 31 this._loginPage = null;
32 32
33 this._newUserWizardController = null; 33 this._newUserWizardController = null;
34 this._newUserCreationComponent = null; 34 this._newUserCreationComponent = null;
35 35
36 return this; 36 return this;
37} 37}
38 38
39MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, { 39MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, {
40 40
41 'toString': function() { 41 'toString': function() {
42 return "Clipperz.PM.UI.Web.Controllers.LoginController"; 42 return "Clipperz.PM.UI.Web.Controllers.LoginController";
43 }, 43 },
44 44
45 'args': function () { 45 'args': function () {
46 return this._args; 46 return this._args;
47 }, 47 },
48 48
49 //----------------------------------------------------------------------------- 49 //-----------------------------------------------------------------------------
50 50
51 'loginPage': function() { 51 'loginPage': function() {
52 if (this._loginPage == null) { 52 if (this._loginPage == null) {
53 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage(); 53 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage();
54 54
55 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick') 55 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick')
56 } 56 }
57 57
58 return this._loginPage; 58 return this._loginPage;
59 }, 59 },
60 60
61 //----------------------------------------------------------------------------- 61 //-----------------------------------------------------------------------------
62 62
63 'run': function(args) { 63 'run': function(args) {
64 varslot; 64 varslot;
65 varloginPage; 65 varloginPage;
66 varloginForm; 66 varloginForm;
67 67
68 slot = args.slot; 68 slot = args.slot;
69 69
70 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']}); 70 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']});
71 71
72 slot.setContent(this.loginPage()); 72 slot.setContent(this.loginPage());
73 this.loginPage().slotNamed('loginForm').setContent(loginForm); 73 this.loginPage().slotNamed('loginForm').setContent(loginForm);
74 74
75 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 75 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
76 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 76 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
77 }, 77 },
78 78
79 //----------------------------------------------------------------------------- 79 //-----------------------------------------------------------------------------
80 80
81 'doLogin': function(aLoginForm, anEvent) { 81 'doLogin': function(aLoginForm, anEvent) {
82 var deferredResult; 82 var deferredResult;
83 varparameters; 83 varparameters;
84 // varshouldUseOTP;
85 var loginProgress; 84 var loginProgress;
86 varuser; 85 varuser;
87 var getPassphraseDelegate; 86 var getPassphraseDelegate;
88 87
89 parameters = anEvent; 88 parameters = anEvent;
90 // shouldUseOTP = (typeof(parameters.passphrase) == 'undefined');
91 89
92 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase); 90 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
93 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')}); 91 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')});
94 92
95 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress(); 93 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress();
96 94
97 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false}); 95 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false});
98 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4}); 96 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
99 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate); 97 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate);
100 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()}); 98 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()});
101 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); 99 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
102 // if (shouldUseOTP == false) { 100 deferredResult.addMethod(user, 'login');
103 deferredResult.addMethod(user, 'login');
104 // } else {
105 // deferredResult.addMethod(user, 'loginUsingOTP', parameters.username, parameters.otp);
106 // }
107 deferredResult.addCallback(function(aLoginProgress, res) { 101 deferredResult.addCallback(function(aLoginProgress, res) {
108 aLoginProgress.disableCancel(); 102 aLoginProgress.disableCancel();
109 return res; 103 return res;
110 }, loginProgress); 104 }, loginProgress);
111 deferredResult.addCallback(function () { 105 deferredResult.addCallback(function () {
112 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body})); 106 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body}));
113 }) 107 })
114 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm); 108 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm);
115 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress)); 109 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress));
116 110
117 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()})); 111 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()}));
118 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField')); 112 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField'));
119 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate)); 113 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate));
120 deferredResult.callback(); 114 deferredResult.callback();
121 115
122 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel'); 116 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel');
123 117
124 return deferredResult; 118 return deferredResult;
125 }, 119 },
126 120
127 //----------------------------------------------------------------------------- 121 //-----------------------------------------------------------------------------
128 122
129 'userLoggedIn': function(aUser) { 123 'userLoggedIn': function(aUser) {
130//Clipperz.log(">>> LoginController.userLoggedIn"); 124//Clipperz.log(">>> LoginController.userLoggedIn");
131 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser}); 125 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser});
132//Clipperz.log("<<< LoginController.userLoggedIn"); 126//Clipperz.log("<<< LoginController.userLoggedIn");
133 }, 127 },
134 128
135 //========================================================================= 129 //=========================================================================
136 130
137 'handleCreateNewAccountClick': function (aComponent) { 131 'handleCreateNewAccountClick': function (aComponent) {
138 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user"); 132 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user");
139 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [ 133 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [
140 //' MochiKit.Base.method(this, 'newUserCreationComponent'), 134 //' MochiKit.Base.method(this, 'newUserCreationComponent'),
141 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}), 135 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}),
142 // MochiKit.Base.method(this.newUserWizardController(), 'run') 136 // MochiKit.Base.method(this.newUserWizardController(), 'run')
143 137
144 138
145 MochiKit.Base.method(this, 'newUserCreationComponent'), 139 MochiKit.Base.method(this, 'newUserCreationComponent'),
146 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [ 140 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [
147 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}), 141 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}),
148 MochiKit.Base.method(this.newUserWizardController(), 'run') 142 MochiKit.Base.method(this.newUserWizardController(), 'run')
149 ], {trace:false}), 143 ], {trace:false}),
150 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField') 144 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField')
151 ], {trace:false}); 145 ], {trace:false});
152 }, 146 },
153 147
154 //----------------------------------------------------------------------------- 148 //-----------------------------------------------------------------------------
155 149
156 'newUserWizardController': function () { 150 'newUserWizardController': function () {
157 if (this._newUserWizardController == null) { 151 if (this._newUserWizardController == null) {
158 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({ 152 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({
159 'newUserCreationComponent': this.newUserCreationComponent() 153 'newUserCreationComponent': this.newUserCreationComponent()
160 }) 154 })
161 155
162 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent'); 156 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent');
163 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent'); 157 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent');
164 } 158 }
165 159
166 return this._newUserWizardController; 160 return this._newUserWizardController;
167 }, 161 },
168 162
169 //------------------------------------------------------------------------- 163 //-------------------------------------------------------------------------
170 164
diff --git a/frontend/gamma/js/MochiKit/Async.js b/frontend/gamma/js/MochiKit/Async.js
index c7408e7..cc43835 100644
--- a/frontend/gamma/js/MochiKit/Async.js
+++ b/frontend/gamma/js/MochiKit/Async.js
@@ -1,576 +1,642 @@
1/*** 1/***
2 2
3MochiKit.Async 1.5 3MochiKit.Async 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Async', '1.5', ['Base']); 11MochiKit.Base.module(MochiKit, 'Async', '1.5', ['Base']);
12 12
13/** @id MochiKit.Async.Deferred */ 13/** @id MochiKit.Async.Deferred */
14MochiKit.Async.Deferred = function (/* optional */ canceller) { 14MochiKit.Async.Deferred = function (/* optional */ canceller) {
15 this.chain = []; 15 this.chain = [];
16 this.id = this._nextId(); 16 this.id = this._nextId();
17 this.fired = -1; 17 this.fired = -1;
18 this.paused = 0; 18 this.paused = 0;
19 this.results = [null, null]; 19 this.results = [null, null];
20 this.canceller = canceller; 20 this.canceller = canceller;
21 this.silentlyCancelled = false; 21 this.silentlyCancelled = false;
22 this.chained = false; 22 this.chained = false;
23 this.finalized = false;
23}; 24};
24 25
25MochiKit.Async.Deferred.prototype = { 26MochiKit.Async.Deferred.prototype = {
26 /** @id MochiKit.Async.Deferred.prototype.repr */ 27 /** @id MochiKit.Async.Deferred.prototype.repr */
27 repr: function () { 28 repr: function () {
28 var state; 29 return 'Deferred(' + this.id + ', ' + this.state() + ')';
29 if (this.fired == -1) {
30 state = 'unfired';
31 } else if (this.fired === 0) {
32 state = 'success';
33 } else {
34 state = 'error';
35 }
36 return 'Deferred(' + this.id + ', ' + state + ')';
37 }, 30 },
38 31
39 toString: MochiKit.Base.forwardCall("repr"), 32 toString: MochiKit.Base.forwardCall("repr"),
40 33
41 _nextId: MochiKit.Base.counter(), 34 _nextId: MochiKit.Base.counter(),
42 35
36 /** @id MochiKit.Async.Deferred.prototype.state */
37 state: function () {
38 if (this.fired == -1) {
39 return 'unfired';
40 } else if (this.fired === 0) {
41 return 'success';
42 } else {
43 return 'error';
44 }
45 },
46
43 /** @id MochiKit.Async.Deferred.prototype.cancel */ 47 /** @id MochiKit.Async.Deferred.prototype.cancel */
44 cancel: function () { 48 cancel: function (e) {
45 var self = MochiKit.Async; 49 var self = MochiKit.Async;
46 if (this.fired == -1) { 50 if (this.fired == -1) {
47 if (this.canceller) { 51 if (this.canceller) {
48 this.canceller(this); 52 this.canceller(this);
49 } else { 53 } else {
50 this.silentlyCancelled = true; 54 this.silentlyCancelled = true;
51 } 55 }
52 if (this.fired == -1) { 56 if (this.fired == -1) {
53 this.errback(new self.CancelledError(this)); 57 if (typeof(e) === 'string') {
58 e = new self.GenericError(e);
59 } else if (!(e instanceof Error)) {
60 e = new self.CancelledError(this);
61 }
62 this.errback(e);
54 } 63 }
55 } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) { 64 } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) {
56 this.results[0].cancel(); 65 this.results[0].cancel(e);
57 } 66 }
58 }, 67 },
59 68
60 _resback: function (res) { 69 _resback: function (res) {
61 /*** 70 /***
62 71
63 The primitive that means either callback or errback 72 The primitive that means either callback or errback
64 73
65 ***/ 74 ***/
66 this.fired = ((res instanceof Error) ? 1 : 0); 75 this.fired = ((res instanceof Error) ? 1 : 0);
67 this.results[this.fired] = res; 76 this.results[this.fired] = res;
68 this._fire(); 77 if (this.paused === 0) {
78 this._fire();
79 }
69 }, 80 },
70 81
71 _check: function () { 82 _check: function () {
72 if (this.fired != -1) { 83 if (this.fired != -1) {
73 if (!this.silentlyCancelled) { 84 if (!this.silentlyCancelled) {
74 throw new MochiKit.Async.AlreadyCalledError(this); 85 throw new MochiKit.Async.AlreadyCalledError(this);
75 } 86 }
76 this.silentlyCancelled = false; 87 this.silentlyCancelled = false;
77 return; 88 return;
78 } 89 }
79 }, 90 },
80 91
81 /** @id MochiKit.Async.Deferred.prototype.callback */ 92 /** @id MochiKit.Async.Deferred.prototype.callback */
82 callback: function (res) { 93 callback: function (res) {
83 this._check(); 94 this._check();
84 if (res instanceof MochiKit.Async.Deferred) { 95 if (res instanceof MochiKit.Async.Deferred) {
85 throw new Error("Deferred instances can only be chained if they are the result of a callback"); 96 throw new Error("Deferred instances can only be chained if they are the result of a callback");
86 } 97 }
87 this._resback(res); 98 this._resback(res);
88 }, 99 },
89 100
90 /** @id MochiKit.Async.Deferred.prototype.errback */ 101 /** @id MochiKit.Async.Deferred.prototype.errback */
91 errback: function (res) { 102 errback: function (res) {
92 this._check(); 103 this._check();
93 var self = MochiKit.Async; 104 var self = MochiKit.Async;
94 if (res instanceof self.Deferred) { 105 if (res instanceof self.Deferred) {
95 throw new Error("Deferred instances can only be chained if they are the result of a callback"); 106 throw new Error("Deferred instances can only be chained if they are the result of a callback");
96 } 107 }
97 if (!(res instanceof Error)) { 108 if (!(res instanceof Error)) {
98 res = new self.GenericError(res); 109 res = new self.GenericError(res);
99 } 110 }
100 this._resback(res); 111 this._resback(res);
101 }, 112 },
102 113
103 /** @id MochiKit.Async.Deferred.prototype.addBoth */ 114 /** @id MochiKit.Async.Deferred.prototype.addBoth */
104 addBoth: function (fn) { 115 addBoth: function (fn) {
105 if (arguments.length > 1) { 116 if (arguments.length > 1) {
106 fn = MochiKit.Base.partial.apply(null, arguments); 117 fn = MochiKit.Base.partial.apply(null, arguments);
107 } 118 }
108 return this.addCallbacks(fn, fn); 119 return this.addCallbacks(fn, fn);
109 }, 120 },
110 121
111 /** @id MochiKit.Async.Deferred.prototype.addCallback */ 122 /** @id MochiKit.Async.Deferred.prototype.addCallback */
112 addCallback: function (fn) { 123 addCallback: function (fn) {
113 if (arguments.length > 1) { 124 if (arguments.length > 1) {
114 fn = MochiKit.Base.partial.apply(null, arguments); 125 fn = MochiKit.Base.partial.apply(null, arguments);
115 } 126 }
116 return this.addCallbacks(fn, null); 127 return this.addCallbacks(fn, null);
117 }, 128 },
118 129
119 /** @id MochiKit.Async.Deferred.prototype.addErrback */ 130 /** @id MochiKit.Async.Deferred.prototype.addErrback */
120 addErrback: function (fn) { 131 addErrback: function (fn) {
121 if (arguments.length > 1) { 132 if (arguments.length > 1) {
122 fn = MochiKit.Base.partial.apply(null, arguments); 133 fn = MochiKit.Base.partial.apply(null, arguments);
123 } 134 }
124 return this.addCallbacks(null, fn); 135 return this.addCallbacks(null, fn);
125 }, 136 },
126 137
127 /** @id MochiKit.Async.Deferred.prototype.addCallbacks */ 138 /** @id MochiKit.Async.Deferred.prototype.addCallbacks */
128 addCallbacks: function (cb, eb) { 139 addCallbacks: function (cb, eb) {
129 if (this.chained) { 140 if (this.chained) {
130 throw new Error("Chained Deferreds can not be re-used"); 141 throw new Error("Chained Deferreds can not be re-used");
131 } 142 }
143 if (this.finalized) {
144 throw new Error("Finalized Deferreds can not be re-used");
145 }
132 this.chain.push([cb, eb]); 146 this.chain.push([cb, eb]);
133 if (this.fired >= 0) { 147 if (this.fired >= 0) {
134 this._fire(); 148 this._fire();
135 } 149 }
136 return this; 150 return this;
137 }, 151 },
138 152
153 /** @id MochiKit.Async.Deferred.prototype.setFinalizer */
154 setFinalizer: function (fn) {
155 if (this.chained) {
156 throw new Error("Chained Deferreds can not be re-used");
157 }
158 if (this.finalized) {
159 throw new Error("Finalized Deferreds can not be re-used");
160 }
161 if (arguments.length > 1) {
162 fn = MochiKit.Base.partial.apply(null, arguments);
163 }
164 this._finalizer = fn;
165 if (this.fired >= 0) {
166 this._fire();
167 }
168 return this;
169 },
170
139 _fire: function () { 171 _fire: function () {
140 /*** 172 /***
141 173
142 Used internally to exhaust the callback sequence when a result 174 Used internally to exhaust the callback sequence when a result
143 is available. 175 is available.
144 176
145 ***/ 177 ***/
146 var chain = this.chain; 178 var chain = this.chain;
147 var fired = this.fired; 179 var fired = this.fired;
148 var res = this.results[fired]; 180 var res = this.results[fired];
149 var self = this; 181 var self = this;
150 var cb = null; 182 var cb = null;
151 while (chain.length > 0 && this.paused === 0) { 183 while (chain.length > 0 && this.paused === 0) {
152 // Array 184 // Array
153 var pair = chain.shift(); 185 var pair = chain.shift();
154 var f = pair[fired]; 186 var f = pair[fired];
155 if (f === null) { 187 if (f === null) {
156 continue; 188 continue;
157 } 189 }
158 try { 190 try {
159 res = f(res); 191 res = f(res);
160 fired = ((res instanceof Error) ? 1 : 0); 192 fired = ((res instanceof Error) ? 1 : 0);
161 if (res instanceof MochiKit.Async.Deferred) { 193 if (res instanceof MochiKit.Async.Deferred) {
162 cb = function (res) { 194 cb = function (res) {
163 self._resback(res);
164 self.paused--; 195 self.paused--;
165 if ((self.paused === 0) && (self.fired >= 0)) { 196 self._resback(res);
166 self._fire();
167 }
168 }; 197 };
169 this.paused++; 198 this.paused++;
170 } 199 }
171 } catch (err) { 200 } catch (err) {
172 fired = 1; 201 fired = 1;
173 if (!(err instanceof Error)) { 202 if (!(err instanceof Error)) {
174 err = new MochiKit.Async.GenericError(err); 203 err = new MochiKit.Async.GenericError(err);
175 } 204 }
176 res = err; 205 res = err;
177 } 206 }
178 } 207 }
179 this.fired = fired; 208 this.fired = fired;
180 this.results[fired] = res; 209 this.results[fired] = res;
210 if (this.chain.length == 0 && this.paused === 0 && this._finalizer) {
211 this.finalized = true;
212 this._finalizer(res);
213 }
181 if (cb && this.paused) { 214 if (cb && this.paused) {
182 // this is for "tail recursion" in case the dependent deferred 215 // this is for "tail recursion" in case the dependent deferred
183 // is already fired 216 // is already fired
184 res.addBoth(cb); 217 res.addBoth(cb);
185 res.chained = true; 218 res.chained = true;
186 } 219 }
187 } 220 }
188}; 221};
189 222
190MochiKit.Base.update(MochiKit.Async, { 223MochiKit.Base.update(MochiKit.Async, {
191 /** @id MochiKit.Async.evalJSONRequest */ 224 /** @id MochiKit.Async.evalJSONRequest */
192 evalJSONRequest: function (req) { 225 evalJSONRequest: function (req) {
193 return MochiKit.Base.evalJSON(req.responseText); 226 return MochiKit.Base.evalJSON(req.responseText);
194 }, 227 },
195 228
196 /** @id MochiKit.Async.succeed */ 229 /** @id MochiKit.Async.succeed */
197 succeed: function (/* optional */result) { 230 succeed: function (/* optional */result) {
198 var d = new MochiKit.Async.Deferred(); 231 var d = new MochiKit.Async.Deferred();
199 d.callback.apply(d, arguments); 232 d.callback.apply(d, arguments);
200 return d; 233 return d;
201 }, 234 },
202 235
203 /** @id MochiKit.Async.fail */ 236 /** @id MochiKit.Async.fail */
204 fail: function (/* optional */result) { 237 fail: function (/* optional */result) {
205 var d = new MochiKit.Async.Deferred(); 238 var d = new MochiKit.Async.Deferred();
206 d.errback.apply(d, arguments); 239 d.errback.apply(d, arguments);
207 return d; 240 return d;
208 }, 241 },
209 242
210 /** @id MochiKit.Async.getXMLHttpRequest */ 243 /** @id MochiKit.Async.getXMLHttpRequest */
211 getXMLHttpRequest: function () { 244 getXMLHttpRequest: function () {
212 var self = arguments.callee; 245 var self = arguments.callee;
213 if (!self.XMLHttpRequest) { 246 if (!self.XMLHttpRequest) {
214 var tryThese = [ 247 var tryThese = [
215 function () { return new XMLHttpRequest(); }, 248 function () { return new XMLHttpRequest(); },
216 function () { return new ActiveXObject('Msxml2.XMLHTTP'); }, 249 function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
217 function () { return new ActiveXObject('Microsoft.XMLHTTP'); }, 250 function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
218 function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }, 251 function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
219 function () { 252 function () {
220 throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest"); 253 throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest");
221 } 254 }
222 ]; 255 ];
223 for (var i = 0; i < tryThese.length; i++) { 256 for (var i = 0; i < tryThese.length; i++) {
224 var func = tryThese[i]; 257 var func = tryThese[i];
225 try { 258 try {
226 self.XMLHttpRequest = func; 259 self.XMLHttpRequest = func;
227 return func(); 260 return func();
228 } catch (e) { 261 } catch (e) {
229 // pass 262 // pass
230 } 263 }
231 } 264 }
232 } 265 }
233 return self.XMLHttpRequest(); 266 return self.XMLHttpRequest();
234 }, 267 },
235 268
236 _xhr_onreadystatechange: function (d) { 269 _xhr_onreadystatechange: function (d) {
237 // MochiKit.Logging.logDebug('this.readyState', this.readyState); 270 // MochiKit.Logging.logDebug('this.readyState', this.readyState);
238 var m = MochiKit.Base; 271 var m = MochiKit.Base;
239 if (this.readyState == 4) { 272 if (this.readyState == 4) {
240 // IE SUCKS 273 // IE SUCKS
241 try { 274 try {
242 this.onreadystatechange = null; 275 this.onreadystatechange = null;
243 } catch (e) { 276 } catch (e) {
244 try { 277 try {
245 this.onreadystatechange = m.noop; 278 this.onreadystatechange = m.noop;
246 } catch (e) { 279 } catch (e) {
247 } 280 }
248 } 281 }
249 var status = null; 282 var status = null;
250 try { 283 try {
251 status = this.status; 284 status = this.status;
252 if (!status && m.isNotEmpty(this.responseText)) { 285 if (!status && (this.response || m.isNotEmpty(this.responseText))) {
253 // 0 or undefined seems to mean cached or local 286 // 0 or undefined seems to mean cached or local
254 status = 304; 287 status = 304;
255 } 288 }
256 } catch (e) { 289 } catch (e) {
257 // pass 290 // pass
258 // MochiKit.Logging.logDebug('error getting status?', repr(items(e))); 291 // MochiKit.Logging.logDebug('error getting status?', repr(items(e)));
259 } 292 }
260 // 200 is OK, 201 is CREATED, 204 is NO CONTENT 293 // 200 is OK, 201 is CREATED, 204 is NO CONTENT
261 // 304 is NOT MODIFIED, 1223 is apparently a bug in IE 294 // 304 is NOT MODIFIED, 1223 is apparently a bug in IE
262 if (status == 200 || status == 201 || status == 204 || 295 if (status == 200 || status == 201 || status == 204 ||
263 status == 304 || status == 1223) { 296 status == 304 || status == 1223) {
264 d.callback(this); 297 d.callback(this);
265 } else { 298 } else {
266 var err = new MochiKit.Async.XMLHttpRequestError(this, "Request failed"); 299 var err = new MochiKit.Async.XMLHttpRequestError(this, "Request failed");
267 if (err.number) { 300 if (err.number) {
268 // XXX: This seems to happen on page change 301 // XXX: This seems to happen on page change
269 d.errback(err); 302 d.errback(err);
270 } else { 303 } else {
271 // XXX: this seems to happen when the server is unreachable 304 // XXX: this seems to happen when the server is unreachable
272 d.errback(err); 305 d.errback(err);
273 } 306 }
274 } 307 }
275 } 308 }
276 }, 309 },
277 310
278 _xhr_canceller: function (req) { 311 _xhr_canceller: function (req) {
279 // IE SUCKS 312 // IE SUCKS
280 try { 313 try {
281 req.onreadystatechange = null; 314 req.onreadystatechange = null;
282 } catch (e) { 315 } catch (e) {
283 try { 316 try {
284 req.onreadystatechange = MochiKit.Base.noop; 317 req.onreadystatechange = MochiKit.Base.noop;
285 } catch (e) { 318 } catch (e) {
286 } 319 }
287 } 320 }
288 req.abort(); 321 req.abort();
289 }, 322 },
290 323
291 324
292 /** @id MochiKit.Async.sendXMLHttpRequest */ 325 /** @id MochiKit.Async.sendXMLHttpRequest */
293 sendXMLHttpRequest: function (req, /* optional */ sendContent) { 326 sendXMLHttpRequest: function (req, /* optional */ sendContent) {
294 if (typeof(sendContent) == "undefined" || sendContent === null) { 327 if (typeof(sendContent) == "undefined" || sendContent === null) {
295 sendContent = ""; 328 sendContent = "";
296 } 329 }
297 330
298 var m = MochiKit.Base; 331 var m = MochiKit.Base;
299 var self = MochiKit.Async; 332 var self = MochiKit.Async;
300 var d = new self.Deferred(m.partial(self._xhr_canceller, req)); 333 var d = new self.Deferred(m.partial(self._xhr_canceller, req));
301 334
302 try { 335 try {
303 req.onreadystatechange = m.bind(self._xhr_onreadystatechange, 336 req.onreadystatechange = m.bind(self._xhr_onreadystatechange,
304 req, d); 337 req, d);
305 req.send(sendContent); 338 req.send(sendContent);
306 } catch (e) { 339 } catch (e) {
307 try { 340 try {
308 req.onreadystatechange = null; 341 req.onreadystatechange = null;
309 } catch (ignore) { 342 } catch (ignore) {
310 // pass 343 // pass
311 } 344 }
312 d.errback(e); 345 d.errback(e);
313 } 346 }
314 347
315 return d; 348 return d;
316 349
317 }, 350 },
318 351
319 /** @id MochiKit.Async.doXHR */ 352 /** @id MochiKit.Async.doXHR */
320 doXHR: function (url, opts) { 353 doXHR: function (url, opts) {
321 /* 354 /*
322 Work around a Firefox bug by dealing with XHR during 355 Work around a Firefox bug by dealing with XHR during
323 the next event loop iteration. Maybe it's this one: 356 the next event loop iteration. Maybe it's this one:
324 https://bugzilla.mozilla.org/show_bug.cgi?id=249843 357 https://bugzilla.mozilla.org/show_bug.cgi?id=249843
325 */ 358 */
326 var self = MochiKit.Async; 359 var self = MochiKit.Async;
327 return self.callLater(0, self._doXHR, url, opts); 360 return self.callLater(0, self._doXHR, url, opts);
328 }, 361 },
329 362
330 _doXHR: function (url, opts) { 363 _doXHR: function (url, opts) {
331 var m = MochiKit.Base; 364 var m = MochiKit.Base;
332 opts = m.update({ 365 opts = m.update({
333 method: 'GET', 366 method: 'GET',
334 sendContent: '' 367 sendContent: ''
335 /* 368 /*
336 queryString: undefined, 369 queryString: undefined,
337 username: undefined, 370 username: undefined,
338 password: undefined, 371 password: undefined,
339 headers: undefined, 372 headers: undefined,
340 mimeType: undefined 373 mimeType: undefined,
374 responseType: undefined
341 */ 375 */
342 }, opts); 376 }, opts);
343 var self = MochiKit.Async; 377 var self = MochiKit.Async;
344 var req = self.getXMLHttpRequest(); 378 var req = self.getXMLHttpRequest();
345 if (opts.queryString) { 379 if (opts.queryString) {
346 var qs = m.queryString(opts.queryString); 380 var qs = m.queryString(opts.queryString);
347 if (qs) { 381 if (qs) {
348 url += "?" + qs; 382 url += "?" + qs;
349 } 383 }
350 } 384 }
351 // Safari will send undefined:undefined, so we have to check. 385 // Safari will send undefined:undefined, so we have to check.
352 // We can't use apply, since the function is native. 386 // We can't use apply, since the function is native.
353 if ('username' in opts) { 387 if ('username' in opts) {
354 req.open(opts.method, url, true, opts.username, opts.password); 388 req.open(opts.method, url, true, opts.username, opts.password);
355 } else { 389 } else {
356 req.open(opts.method, url, true); 390 req.open(opts.method, url, true);
357 } 391 }
358 if (req.overrideMimeType && opts.mimeType) { 392 if (req.overrideMimeType && opts.mimeType) {
359 req.overrideMimeType(opts.mimeType); 393 req.overrideMimeType(opts.mimeType);
360 } 394 }
361 req.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 395 req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
362 if (opts.headers) { 396 if (opts.headers) {
363 var headers = opts.headers; 397 var headers = opts.headers;
364 if (!m.isArrayLike(headers)) { 398 if (!m.isArrayLike(headers)) {
365 headers = m.items(headers); 399 headers = m.items(headers);
366 } 400 }
367 for (var i = 0; i < headers.length; i++) { 401 for (var i = 0; i < headers.length; i++) {
368 var header = headers[i]; 402 var header = headers[i];
369 var name = header[0]; 403 var name = header[0];
370 var value = header[1]; 404 var value = header[1];
371 req.setRequestHeader(name, value); 405 req.setRequestHeader(name, value);
372 } 406 }
373 } 407 }
408 if ("responseType" in opts && "responseType" in req) {
409 req.responseType = opts.responseType;
410 }
374 return self.sendXMLHttpRequest(req, opts.sendContent); 411 return self.sendXMLHttpRequest(req, opts.sendContent);
375 }, 412 },
376 413
377 _buildURL: function (url/*, ...*/) { 414 _buildURL: function (url/*, ...*/) {
378 if (arguments.length > 1) { 415 if (arguments.length > 1) {
379 var m = MochiKit.Base; 416 var m = MochiKit.Base;
380 var qs = m.queryString.apply(null, m.extend(null, arguments, 1)); 417 var qs = m.queryString.apply(null, m.extend(null, arguments, 1));
381 if (qs) { 418 if (qs) {
382 return url + "?" + qs; 419 return url + "?" + qs;
383 } 420 }
384 } 421 }
385 return url; 422 return url;
386 }, 423 },
387 424
388 /** @id MochiKit.Async.doSimpleXMLHttpRequest */ 425 /** @id MochiKit.Async.doSimpleXMLHttpRequest */
389 doSimpleXMLHttpRequest: function (url/*, ...*/) { 426 doSimpleXMLHttpRequest: function (url/*, ...*/) {
390 var self = MochiKit.Async; 427 var self = MochiKit.Async;
391 url = self._buildURL.apply(self, arguments); 428 url = self._buildURL.apply(self, arguments);
392 return self.doXHR(url); 429 return self.doXHR(url);
393 }, 430 },
394 431
395 /** @id MochiKit.Async.loadJSONDoc */ 432 /** @id MochiKit.Async.loadJSONDoc */
396 loadJSONDoc: function (url/*, ...*/) { 433 loadJSONDoc: function (url/*, ...*/) {
397 var self = MochiKit.Async; 434 var self = MochiKit.Async;
398 url = self._buildURL.apply(self, arguments); 435 url = self._buildURL.apply(self, arguments);
399 var d = self.doXHR(url, { 436 var d = self.doXHR(url, {
400 'mimeType': 'text/plain', 437 'mimeType': 'text/plain',
401 'headers': [['Accept', 'application/json']] 438 'headers': [['Accept', 'application/json']]
402 }); 439 });
403 d = d.addCallback(self.evalJSONRequest); 440 d = d.addCallback(self.evalJSONRequest);
404 return d; 441 return d;
405 }, 442 },
406 443
444 /** @id MochiKit.Async.loadScript */
445 loadScript: function (url) {
446 var d = new MochiKit.Async.Deferred();
447 var script = document.createElement("script");
448 script.type = "text/javascript";
449 script.src = url;
450 script.onload = function () {
451 script.onload = null;
452 script.onerror = null;
453 script.onreadystatechange = null;
454 script = null;
455 d.callback();
456 };
457 script.onerror = function (msg) {
458 script.onload = null;
459 script.onerror = null;
460 script.onreadystatechange = null;
461 script = null;
462 msg = "Failed to load script at " + url + ": " + msg;
463 d.errback(new URIError(msg, url));
464 }
465 script.onreadystatechange = function () {
466 if (script.readyState == "loaded" || script.readyState == "complete") {
467 script.onload();
468 } else {
469 // IE doesn't bother to report errors...
470 MochiKit.Async.callLater(10, script.onerror, "Script loading timed out")
471 }
472 };
473 document.getElementsByTagName("head")[0].appendChild(script);
474 return d;
475 },
476
407 /** @id MochiKit.Async.wait */ 477 /** @id MochiKit.Async.wait */
408 wait: function (seconds, /* optional */value) { 478 wait: function (seconds, /* optional */value) {
409 var d = new MochiKit.Async.Deferred(); 479 var d = new MochiKit.Async.Deferred();
410 var m = MochiKit.Base; 480 var cb = MochiKit.Base.bind("callback", d, value);
411 if (typeof(value) != 'undefined') { 481 var timeout = setTimeout(cb, Math.floor(seconds * 1000));
412 d.addCallback(function () { return value; });
413 }
414 var timeout = setTimeout(
415 m.bind("callback", d),
416 Math.floor(seconds * 1000));
417 d.canceller = function () { 482 d.canceller = function () {
418 try { 483 try {
419 clearTimeout(timeout); 484 clearTimeout(timeout);
420 } catch (e) { 485 } catch (e) {
421 // pass 486 // pass
422 } 487 }
423 }; 488 };
424 return d; 489 return d;
425 }, 490 },
426 491
427 /** @id MochiKit.Async.callLater */ 492 /** @id MochiKit.Async.callLater */
428 callLater: function (seconds, func) { 493 callLater: function (seconds, func) {
429 var m = MochiKit.Base; 494 var m = MochiKit.Base;
430 var pfunc = m.partial.apply(m, m.extend(null, arguments, 1)); 495 var pfunc = m.partial.apply(m, m.extend(null, arguments, 1));
431 return MochiKit.Async.wait(seconds).addCallback( 496 return MochiKit.Async.wait(seconds).addCallback(
432 function (res) { return pfunc(); } 497 function (res) { return pfunc(); }
433 ); 498 );
434 } 499 }
435}); 500});
436 501
437 502
438/** @id MochiKit.Async.DeferredLock */ 503/** @id MochiKit.Async.DeferredLock */
439MochiKit.Async.DeferredLock = function () { 504MochiKit.Async.DeferredLock = function () {
440 this.waiting = []; 505 this.waiting = [];
441 this.locked = false; 506 this.locked = false;
442 this.id = this._nextId(); 507 this.id = this._nextId();
443}; 508};
444 509
445MochiKit.Async.DeferredLock.prototype = { 510MochiKit.Async.DeferredLock.prototype = {
446 __class__: MochiKit.Async.DeferredLock, 511 __class__: MochiKit.Async.DeferredLock,
447 /** @id MochiKit.Async.DeferredLock.prototype.acquire */ 512 /** @id MochiKit.Async.DeferredLock.prototype.acquire */
448 acquire: function () { 513 acquire: function () {
449 var d = new MochiKit.Async.Deferred(); 514 var d = new MochiKit.Async.Deferred();
450 if (this.locked) { 515 if (this.locked) {
451 this.waiting.push(d); 516 this.waiting.push(d);
452 } else { 517 } else {
453 this.locked = true; 518 this.locked = true;
454 d.callback(this); 519 d.callback(this);
455 } 520 }
456 return d; 521 return d;
457 }, 522 },
458 /** @id MochiKit.Async.DeferredLock.prototype.release */ 523 /** @id MochiKit.Async.DeferredLock.prototype.release */
459 release: function () { 524 release: function () {
460 if (!this.locked) { 525 if (!this.locked) {
461 throw TypeError("Tried to release an unlocked DeferredLock"); 526 throw TypeError("Tried to release an unlocked DeferredLock");
462 } 527 }
463 this.locked = false; 528 this.locked = false;
464 if (this.waiting.length > 0) { 529 if (this.waiting.length > 0) {
465 this.locked = true; 530 this.locked = true;
466 this.waiting.shift().callback(this); 531 this.waiting.shift().callback(this);
467 } 532 }
468 }, 533 },
469 _nextId: MochiKit.Base.counter(), 534 _nextId: MochiKit.Base.counter(),
470 repr: function () { 535 repr: function () {
471 var state; 536 var state;
472 if (this.locked) { 537 if (this.locked) {
473 state = 'locked, ' + this.waiting.length + ' waiting'; 538 state = 'locked, ' + this.waiting.length + ' waiting';
474 } else { 539 } else {
475 state = 'unlocked'; 540 state = 'unlocked';
476 } 541 }
477 return 'DeferredLock(' + this.id + ', ' + state + ')'; 542 return 'DeferredLock(' + this.id + ', ' + state + ')';
478 }, 543 },
479 toString: MochiKit.Base.forwardCall("repr") 544 toString: MochiKit.Base.forwardCall("repr")
480 545
481}; 546};
482 547
483/** @id MochiKit.Async.DeferredList */ 548/** @id MochiKit.Async.DeferredList */
484MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) { 549MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) {
485 550
486 // call parent constructor 551 // call parent constructor
487 MochiKit.Async.Deferred.apply(this, [canceller]); 552 MochiKit.Async.Deferred.apply(this, [canceller]);
488 553
489 this.list = list; 554 this.list = list;
490 var resultList = []; 555 var resultList = [];
491 this.resultList = resultList; 556 this.resultList = resultList;
492 557
493 this.finishedCount = 0; 558 this.finishedCount = 0;
494 this.fireOnOneCallback = fireOnOneCallback; 559 this.fireOnOneCallback = fireOnOneCallback;
495 this.fireOnOneErrback = fireOnOneErrback; 560 this.fireOnOneErrback = fireOnOneErrback;
496 this.consumeErrors = consumeErrors; 561 this.consumeErrors = consumeErrors;
497 562
498 var cb = MochiKit.Base.bind(this._cbDeferred, this); 563 var cb = MochiKit.Base.bind(this._cbDeferred, this);
499 for (var i = 0; i < list.length; i++) { 564 for (var i = 0; i < list.length; i++) {
500 var d = list[i]; 565 var d = list[i];
501 resultList.push(undefined); 566 resultList.push(undefined);
502 d.addCallback(cb, i, true); 567 d.addCallback(cb, i, true);
503 d.addErrback(cb, i, false); 568 d.addErrback(cb, i, false);
504 } 569 }
505 570
506 if (list.length === 0 && !fireOnOneCallback) { 571 if (list.length === 0 && !fireOnOneCallback) {
507 this.callback(this.resultList); 572 this.callback(this.resultList);
508 } 573 }
509 574
510}; 575};
511 576
512MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred(); 577MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred();
578MochiKit.Async.DeferredList.prototype.constructor = MochiKit.Async.DeferredList;
513 579
514MochiKit.Async.DeferredList.prototype._cbDeferred = function (index, succeeded, result) { 580MochiKit.Async.DeferredList.prototype._cbDeferred = function (index, succeeded, result) {
515 this.resultList[index] = [succeeded, result]; 581 this.resultList[index] = [succeeded, result];
516 this.finishedCount += 1; 582 this.finishedCount += 1;
517 if (this.fired == -1) { 583 if (this.fired == -1) {
518 if (succeeded && this.fireOnOneCallback) { 584 if (succeeded && this.fireOnOneCallback) {
519 this.callback([index, result]); 585 this.callback([index, result]);
520 } else if (!succeeded && this.fireOnOneErrback) { 586 } else if (!succeeded && this.fireOnOneErrback) {
521 this.errback(result); 587 this.errback(result);
522 } else if (this.finishedCount == this.list.length) { 588 } else if (this.finishedCount == this.list.length) {
523 this.callback(this.resultList); 589 this.callback(this.resultList);
524 } 590 }
525 } 591 }
526 if (!succeeded && this.consumeErrors) { 592 if (!succeeded && this.consumeErrors) {
527 result = null; 593 result = null;
528 } 594 }
529 return result; 595 return result;
530}; 596};
531 597
532/** @id MochiKit.Async.gatherResults */ 598/** @id MochiKit.Async.gatherResults */
533MochiKit.Async.gatherResults = function (deferredList) { 599MochiKit.Async.gatherResults = function (deferredList) {
534 var d = new MochiKit.Async.DeferredList(deferredList, false, true, false); 600 var d = new MochiKit.Async.DeferredList(deferredList, false, true, false);
535 d.addCallback(function (results) { 601 d.addCallback(function (results) {
536 var ret = []; 602 var ret = [];
537 for (var i = 0; i < results.length; i++) { 603 for (var i = 0; i < results.length; i++) {
538 ret.push(results[i][1]); 604 ret.push(results[i][1]);
539 } 605 }
540 return ret; 606 return ret;
541 }); 607 });
542 return d; 608 return d;
543}; 609};
544 610
545/** @id MochiKit.Async.maybeDeferred */ 611/** @id MochiKit.Async.maybeDeferred */
546MochiKit.Async.maybeDeferred = function (func) { 612MochiKit.Async.maybeDeferred = function (func) {
547 var self = MochiKit.Async; 613 var self = MochiKit.Async;
548 var result; 614 var result;
549 try { 615 try {
550 var r = func.apply(null, MochiKit.Base.extend([], arguments, 1)); 616 var r = func.apply(null, MochiKit.Base.extend([], arguments, 1));
551 if (r instanceof self.Deferred) { 617 if (r instanceof self.Deferred) {
552 result = r; 618 result = r;
553 } else if (r instanceof Error) { 619 } else if (r instanceof Error) {
554 result = self.fail(r); 620 result = self.fail(r);
555 } else { 621 } else {
556 result = self.succeed(r); 622 result = self.succeed(r);
557 } 623 }
558 } catch (e) { 624 } catch (e) {
559 result = self.fail(e); 625 result = self.fail(e);
560 } 626 }
561 return result; 627 return result;
562}; 628};
563 629
564 630
565MochiKit.Async.__new__ = function () { 631MochiKit.Async.__new__ = function () {
566 var m = MochiKit.Base; 632 var m = MochiKit.Base;
567 var ne = m.partial(m._newNamedError, this); 633 var ne = m.partial(m._newNamedError, this);
568 634
569 ne("AlreadyCalledError", 635 ne("AlreadyCalledError",
570 /** @id MochiKit.Async.AlreadyCalledError */ 636 /** @id MochiKit.Async.AlreadyCalledError */
571 function (deferred) { 637 function (deferred) {
572 /*** 638 /***
573 639
574 Raised by the Deferred if callback or errback happens 640 Raised by the Deferred if callback or errback happens
575 after it was already fired. 641 after it was already fired.
576 642
diff --git a/frontend/gamma/js/MochiKit/Base.js b/frontend/gamma/js/MochiKit/Base.js
index d33c269..ca1734c 100644
--- a/frontend/gamma/js/MochiKit/Base.js
+++ b/frontend/gamma/js/MochiKit/Base.js
@@ -1,116 +1,127 @@
1/*** 1/***
2 2
3MochiKit.Base 1.5 3MochiKit.Base 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11if (typeof(MochiKit) == 'undefined') { 11
12 MochiKit = {}; 12// MochiKit module (namespace)
13} 13var MochiKit = MochiKit || {};
14if (typeof(MochiKit.__export__) == "undefined") { 14if (typeof(MochiKit.__export__) == "undefined") {
15 MochiKit.__export__ = true; 15 MochiKit.__export__ = true;
16} 16}
17if (typeof(MochiKit.Base) == 'undefined') { 17MochiKit.NAME = "MochiKit";
18 MochiKit.Base = {}; 18MochiKit.VERSION = "1.5";
19} 19MochiKit.__repr__ = function () {
20 return "[" + this.NAME + " " + this.VERSION + "]";
21};
22MochiKit.toString = function () {
23 return this.__repr__();
24};
25
26
27// MochiKit.Base module
28MochiKit.Base = MochiKit.Base || {};
20 29
21/** 30/**
22 * Registers a new MochiKit module. This function will insert a new 31 * Creates a new module in a parent namespace. This function will
23 * property into the "MochiKit" object, making sure that all 32 * create a new empty module object with "NAME", "VERSION",
24 * dependency modules have already been inserted. It will also make 33 * "toString" and "__repr__" properties. This object will be inserted into the parent object
25 * sure that the appropriate properties and default module functions 34 * using the specified name (i.e. parent[name] = module). It will
26 * are defined. 35 * also verify that all the dependency modules are defined in the
36 * parent, or an error will be thrown.
27 * 37 *
38 * @param {Object} parent the parent module (use "this" or "window" for
39 * a global module)
28 * @param {String} name the module name, e.g. "Base" 40 * @param {String} name the module name, e.g. "Base"
29 * @param {String} version the module version, e.g. "1.5" 41 * @param {String} version the module version, e.g. "1.5"
30 * @param {Array} deps the array of module dependencies (as strings) 42 * @param {Array} [deps] the array of module dependencies (as strings)
31 */ 43 */
32MochiKit.Base._module = function (name, version, deps) { 44MochiKit.Base.module = function (parent, name, version, deps) {
33 if (!(name in MochiKit)) { 45 var module = parent[name] = parent[name] || {};
34 MochiKit[name] = {}; 46 var prefix = (parent.NAME ? parent.NAME + "." : "");
35 } 47 module.NAME = prefix + name;
36 var module = MochiKit[name];
37 module.NAME = "MochiKit." + name;
38 module.VERSION = version; 48 module.VERSION = version;
39 module.__repr__ = function () { 49 module.__repr__ = function () {
40 return "[" + this.NAME + " " + this.VERSION + "]"; 50 return "[" + this.NAME + " " + this.VERSION + "]";
41 }; 51 };
42 module.toString = function () { 52 module.toString = function () {
43 return this.__repr__(); 53 return this.__repr__();
44 }; 54 };
45 for (var i = 0; i < deps.length; i++) { 55 for (var i = 0; deps != null && i < deps.length; i++) {
46 if (!(deps[i] in MochiKit)) { 56 if (!(deps[i] in parent)) {
47 throw 'MochiKit.' + name + ' depends on MochiKit.' + deps[i] + '!'; 57 throw module.NAME + ' depends on ' + prefix + deps[i] + '!';
48 } 58 }
49 } 59 }
50} 60 return module;
61};
51 62
52MochiKit.Base._module("Base", "1.5", []); 63MochiKit.Base.module(MochiKit, "Base", "1.5", []);
53 64
54/** @id MochiKit.Base.update */ 65/** @id MochiKit.Base.update */
55MochiKit.Base.update = function (self, obj/*, ... */) { 66MochiKit.Base.update = function (self, obj/*, ... */) {
56 if (self === null || self === undefined) { 67 if (self === null || self === undefined) {
57 self = {}; 68 self = {};
58 } 69 }
59 for (var i = 1; i < arguments.length; i++) { 70 for (var i = 1; i < arguments.length; i++) {
60 var o = arguments[i]; 71 var o = arguments[i];
61 if (typeof(o) != 'undefined' && o !== null) { 72 if (typeof(o) != 'undefined' && o !== null) {
62 for (var k in o) { 73 for (var k in o) {
63 self[k] = o[k]; 74 self[k] = o[k];
64 } 75 }
65 } 76 }
66 } 77 }
67 return self; 78 return self;
68}; 79};
69 80
70MochiKit.Base.update(MochiKit.Base, { 81MochiKit.Base.update(MochiKit.Base, {
71 /** @id MochiKit.Base.camelize */ 82 /** @id MochiKit.Base.camelize */
72 camelize: function (selector) { 83 camelize: function (selector) {
73 /* from dojo.style.toCamelCase */ 84 /* from dojo.style.toCamelCase */
74 var arr = selector.split('-'); 85 var arr = selector.split('-');
75 var cc = arr[0]; 86 var cc = arr[0];
76 for (var i = 1; i < arr.length; i++) { 87 for (var i = 1; i < arr.length; i++) {
77 cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1); 88 cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
78 } 89 }
79 return cc; 90 return cc;
80 }, 91 },
81 92
82 /** @id MochiKit.Base.counter */ 93 /** @id MochiKit.Base.counter */
83 counter: function (n/* = 1 */) { 94 counter: function (n/* = 1 */) {
84 if (arguments.length === 0) { 95 if (arguments.length === 0) {
85 n = 1; 96 n = 1;
86 } 97 }
87 return function () { 98 return function () {
88 return n++; 99 return n++;
89 }; 100 };
90 }, 101 },
91 102
92 /** @id MochiKit.Base.clone */ 103 /** @id MochiKit.Base.clone */
93 clone: function (obj) { 104 clone: function (obj) {
94 var me = arguments.callee; 105 var me = arguments.callee;
95 if (arguments.length == 1) { 106 if (arguments.length == 1) {
96 me.prototype = obj; 107 me.prototype = obj;
97 return new me(); 108 return new me();
98 } 109 }
99 }, 110 },
100 111
101 _flattenArray: function (res, lst) { 112 _flattenArray: function (res, lst) {
102 for (var i = 0; i < lst.length; i++) { 113 for (var i = 0; i < lst.length; i++) {
103 var o = lst[i]; 114 var o = lst[i];
104 if (o instanceof Array) { 115 if (o instanceof Array) {
105 arguments.callee(res, o); 116 arguments.callee(res, o);
106 } else { 117 } else {
107 res.push(o); 118 res.push(o);
108 } 119 }
109 } 120 }
110 return res; 121 return res;
111 }, 122 },
112 123
113 /** @id MochiKit.Base.flattenArray */ 124 /** @id MochiKit.Base.flattenArray */
114 flattenArray: function (lst) { 125 flattenArray: function (lst) {
115 return MochiKit.Base._flattenArray([], lst); 126 return MochiKit.Base._flattenArray([], lst);
116 }, 127 },
@@ -179,240 +190,241 @@ MochiKit.Base.update(MochiKit.Base, {
179 if (typeof(self[k]) == 'object' && typeof(v) == 'object') { 190 if (typeof(self[k]) == 'object' && typeof(v) == 'object') {
180 arguments.callee(self[k], v); 191 arguments.callee(self[k], v);
181 } else { 192 } else {
182 self[k] = v; 193 self[k] = v;
183 } 194 }
184 } 195 }
185 } 196 }
186 } 197 }
187 return self; 198 return self;
188 }, 199 },
189 200
190 /** @id MochiKit.Base.setdefault */ 201 /** @id MochiKit.Base.setdefault */
191 setdefault: function (self, obj/*, ...*/) { 202 setdefault: function (self, obj/*, ...*/) {
192 if (self === null || self === undefined) { 203 if (self === null || self === undefined) {
193 self = {}; 204 self = {};
194 } 205 }
195 for (var i = 1; i < arguments.length; i++) { 206 for (var i = 1; i < arguments.length; i++) {
196 var o = arguments[i]; 207 var o = arguments[i];
197 for (var k in o) { 208 for (var k in o) {
198 if (!(k in self)) { 209 if (!(k in self)) {
199 self[k] = o[k]; 210 self[k] = o[k];
200 } 211 }
201 } 212 }
202 } 213 }
203 return self; 214 return self;
204 }, 215 },
205 216
206 /** @id MochiKit.Base.keys */ 217 /** @id MochiKit.Base.keys */
207 keys: function (obj) { 218 keys: function (obj) {
208 var rval = []; 219 var rval = [];
209 for (var prop in obj) { 220 for (var prop in obj) {
210 rval.push(prop); 221 rval.push(prop);
211 } 222 }
212 return rval; 223 return rval;
213 }, 224 },
214 225
215 /** @id MochiKit.Base.values */ 226 /** @id MochiKit.Base.values */
216 values: function (obj) { 227 values: function (obj) {
217 var rval = []; 228 var rval = [];
218 for (var prop in obj) { 229 for (var prop in obj) {
219 rval.push(obj[prop]); 230 rval.push(obj[prop]);
220 } 231 }
221 return rval; 232 return rval;
222 }, 233 },
223 234
224 /** @id MochiKit.Base.items */ 235 /** @id MochiKit.Base.items */
225 items: function (obj) { 236 items: function (obj) {
226 var rval = []; 237 var rval = [];
227 var e; 238 var e;
228 for (var prop in obj) { 239 for (var prop in obj) {
229 var v; 240 var v;
230 try { 241 try {
231 v = obj[prop]; 242 v = obj[prop];
232 } catch (e) { 243 } catch (e) {
233 continue; 244 continue;
234 } 245 }
235 rval.push([prop, v]); 246 rval.push([prop, v]);
236 } 247 }
237 return rval; 248 return rval;
238 }, 249 },
239 250
240 251
241 _newNamedError: function (module, name, func) { 252 _newNamedError: function (module, name, func) {
242 func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name); 253 func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name);
254 func.prototype.constructor = func;
243 module[name] = func; 255 module[name] = func;
244 }, 256 },
245 257
246 258
247 /** @id MochiKit.Base.operator */ 259 /** @id MochiKit.Base.operator */
248 operator: { 260 operator: {
249 // unary logic operators 261 // unary logic operators
250 /** @id MochiKit.Base.truth */ 262 /** @id MochiKit.Base.truth */
251 truth: function (a) { return !!a; }, 263 truth: function (a) { return !!a; },
252 /** @id MochiKit.Base.lognot */ 264 /** @id MochiKit.Base.lognot */
253 lognot: function (a) { return !a; }, 265 lognot: function (a) { return !a; },
254 /** @id MochiKit.Base.identity */ 266 /** @id MochiKit.Base.identity */
255 identity: function (a) { return a; }, 267 identity: function (a) { return a; },
256 268
257 // bitwise unary operators 269 // bitwise unary operators
258 /** @id MochiKit.Base.not */ 270 /** @id MochiKit.Base.not */
259 not: function (a) { return ~a; }, 271 not: function (a) { return ~a; },
260 /** @id MochiKit.Base.neg */ 272 /** @id MochiKit.Base.neg */
261 neg: function (a) { return -a; }, 273 neg: function (a) { return -a; },
262 274
263 // binary operators 275 // binary operators
264 /** @id MochiKit.Base.add */ 276 /** @id MochiKit.Base.add */
265 add: function (a, b) { return a + b; }, 277 add: function (a, b) { return a + b; },
266 /** @id MochiKit.Base.sub */ 278 /** @id MochiKit.Base.sub */
267 sub: function (a, b) { return a - b; }, 279 sub: function (a, b) { return a - b; },
268 /** @id MochiKit.Base.div */ 280 /** @id MochiKit.Base.div */
269 div: function (a, b) { return a / b; }, 281 div: function (a, b) { return a / b; },
270 /** @id MochiKit.Base.mod */ 282 /** @id MochiKit.Base.mod */
271 mod: function (a, b) { return a % b; }, 283 mod: function (a, b) { return a % b; },
272 /** @id MochiKit.Base.mul */ 284 /** @id MochiKit.Base.mul */
273 mul: function (a, b) { return a * b; }, 285 mul: function (a, b) { return a * b; },
274 286
275 // bitwise binary operators 287 // bitwise binary operators
276 /** @id MochiKit.Base.and */ 288 /** @id MochiKit.Base.and */
277 and: function (a, b) { return a & b; }, 289 and: function (a, b) { return a & b; },
278 /** @id MochiKit.Base.or */ 290 /** @id MochiKit.Base.or */
279 or: function (a, b) { return a | b; }, 291 or: function (a, b) { return a | b; },
280 /** @id MochiKit.Base.xor */ 292 /** @id MochiKit.Base.xor */
281 xor: function (a, b) { return a ^ b; }, 293 xor: function (a, b) { return a ^ b; },
282 /** @id MochiKit.Base.lshift */ 294 /** @id MochiKit.Base.lshift */
283 lshift: function (a, b) { return a << b; }, 295 lshift: function (a, b) { return a << b; },
284 /** @id MochiKit.Base.rshift */ 296 /** @id MochiKit.Base.rshift */
285 rshift: function (a, b) { return a >> b; }, 297 rshift: function (a, b) { return a >> b; },
286 /** @id MochiKit.Base.zrshift */ 298 /** @id MochiKit.Base.zrshift */
287 zrshift: function (a, b) { return a >>> b; }, 299 zrshift: function (a, b) { return a >>> b; },
288 300
289 // near-worthless built-in comparators 301 // near-worthless built-in comparators
290 /** @id MochiKit.Base.eq */ 302 /** @id MochiKit.Base.eq */
291 eq: function (a, b) { return a == b; }, 303 eq: function (a, b) { return a == b; },
292 /** @id MochiKit.Base.ne */ 304 /** @id MochiKit.Base.ne */
293 ne: function (a, b) { return a != b; }, 305 ne: function (a, b) { return a != b; },
294 /** @id MochiKit.Base.gt */ 306 /** @id MochiKit.Base.gt */
295 gt: function (a, b) { return a > b; }, 307 gt: function (a, b) { return a > b; },
296 /** @id MochiKit.Base.ge */ 308 /** @id MochiKit.Base.ge */
297 ge: function (a, b) { return a >= b; }, 309 ge: function (a, b) { return a >= b; },
298 /** @id MochiKit.Base.lt */ 310 /** @id MochiKit.Base.lt */
299 lt: function (a, b) { return a < b; }, 311 lt: function (a, b) { return a < b; },
300 /** @id MochiKit.Base.le */ 312 /** @id MochiKit.Base.le */
301 le: function (a, b) { return a <= b; }, 313 le: function (a, b) { return a <= b; },
302 314
303 // strict built-in comparators 315 // strict built-in comparators
304 seq: function (a, b) { return a === b; }, 316 seq: function (a, b) { return a === b; },
305 sne: function (a, b) { return a !== b; }, 317 sne: function (a, b) { return a !== b; },
306 318
307 // compare comparators 319 // compare comparators
308 /** @id MochiKit.Base.ceq */ 320 /** @id MochiKit.Base.ceq */
309 ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; }, 321 ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; },
310 /** @id MochiKit.Base.cne */ 322 /** @id MochiKit.Base.cne */
311 cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; }, 323 cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; },
312 /** @id MochiKit.Base.cgt */ 324 /** @id MochiKit.Base.cgt */
313 cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; }, 325 cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; },
314 /** @id MochiKit.Base.cge */ 326 /** @id MochiKit.Base.cge */
315 cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; }, 327 cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; },
316 /** @id MochiKit.Base.clt */ 328 /** @id MochiKit.Base.clt */
317 clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; }, 329 clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; },
318 /** @id MochiKit.Base.cle */ 330 /** @id MochiKit.Base.cle */
319 cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; }, 331 cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; },
320 332
321 // binary logical operators 333 // binary logical operators
322 /** @id MochiKit.Base.logand */ 334 /** @id MochiKit.Base.logand */
323 logand: function (a, b) { return a && b; }, 335 logand: function (a, b) { return a && b; },
324 /** @id MochiKit.Base.logor */ 336 /** @id MochiKit.Base.logor */
325 logor: function (a, b) { return a || b; }, 337 logor: function (a, b) { return a || b; },
326 /** @id MochiKit.Base.contains */ 338 /** @id MochiKit.Base.contains */
327 contains: function (a, b) { return b in a; } 339 contains: function (a, b) { return b in a; }
328 }, 340 },
329 341
330 /** @id MochiKit.Base.forwardCall */ 342 /** @id MochiKit.Base.forwardCall */
331 forwardCall: function (func) { 343 forwardCall: function (func) {
332 return function () { 344 return function () {
333 return this[func].apply(this, arguments); 345 return this[func].apply(this, arguments);
334 }; 346 };
335 }, 347 },
336 348
337 /** @id MochiKit.Base.itemgetter */ 349 /** @id MochiKit.Base.itemgetter */
338 itemgetter: function (func) { 350 itemgetter: function (func) {
339 return function (arg) { 351 return function (arg) {
340 return arg[func]; 352 return arg[func];
341 }; 353 };
342 }, 354 },
343 355
344 /** @id MochiKit.Base.bool */ 356 /** @id MochiKit.Base.bool */
345 bool: function (value) { 357 bool: function (value) {
346 if (typeof(value) === "boolean" || value instanceof Boolean) { 358 if (typeof(value) === "boolean" || value instanceof Boolean) {
347 return value.valueOf(); 359 return value.valueOf();
348 } else if (typeof(value) === "string" || value instanceof String) { 360 } else if (typeof(value) === "string" || value instanceof String) {
349 return value.length > 0 && value != "false" && value != "null" && 361 return value.length > 0 && value != "false" && value != "null" &&
350 value != "undefined" && value != "0"; 362 value != "undefined" && value != "0";
351 } else if (typeof(value) === "number" || value instanceof Number) { 363 } else if (typeof(value) === "number" || value instanceof Number) {
352 return !isNaN(value) && value != 0; 364 return !isNaN(value) && value != 0;
353 } else if (value != null && typeof(value.length) === "number") { 365 } else if (value != null && typeof(value.length) === "number") {
354 return value.length !== 0 366 return value.length !== 0;
355 } else { 367 } else {
356 return value != null; 368 return value != null;
357 } 369 }
358 }, 370 },
359 371
360 /** @id MochiKit.Base.typeMatcher */ 372 /** @id MochiKit.Base.typeMatcher */
361 typeMatcher: function (/* typ */) { 373 typeMatcher: function (/* typ */) {
362 var types = {}; 374 var types = {};
363 for (var i = 0; i < arguments.length; i++) { 375 for (var i = 0; i < arguments.length; i++) {
364 var typ = arguments[i]; 376 var typ = arguments[i];
365 types[typ] = typ; 377 types[typ] = typ;
366 } 378 }
367 return function () { 379 return function () {
368 for (var i = 0; i < arguments.length; i++) { 380 for (var i = 0; i < arguments.length; i++) {
369 if (!(typeof(arguments[i]) in types)) { 381 if (!(typeof(arguments[i]) in types)) {
370 return false; 382 return false;
371 } 383 }
372 } 384 }
373 return true; 385 return true;
374 }; 386 };
375 }, 387 },
376 388
377 /** @id MochiKit.Base.isNull */ 389 /** @id MochiKit.Base.isNull */
378 isNull: function (/* ... */) { 390 isNull: function (/* ... */) {
379 for (var i = 0; i < arguments.length; i++) { 391 for (var i = 0; i < arguments.length; i++) {
380 if (arguments[i] !== null) { 392 if (arguments[i] !== null) {
381 return false; 393 return false;
382 } 394 }
383 } 395 }
384 return true; 396 return true;
385 }, 397 },
386 398
387 /** @id MochiKit.Base.isUndefinedOrNull */ 399 /** @id MochiKit.Base.isUndefinedOrNull */
388 isUndefinedOrNull: function (/* ... */) { 400 isUndefinedOrNull: function (/* ... */) {
389 for (var i = 0; i < arguments.length; i++) { 401 for (var i = 0; i < arguments.length; i++) {
390 var o = arguments[i]; 402 var o = arguments[i];
391 if (!(typeof(o) == 'undefined' || o === null)) { 403 if (!(typeof(o) == 'undefined' || o === null)) {
392 return false; 404 return false;
393 } 405 }
394 } 406 }
395 return true; 407 return true;
396 }, 408 },
397 409
398 /** @id MochiKit.Base.isEmpty */ 410 /** @id MochiKit.Base.isEmpty */
399 isEmpty: function (obj) { 411 isEmpty: function (obj) {
400 return !MochiKit.Base.isNotEmpty.apply(this, arguments); 412 return !MochiKit.Base.isNotEmpty.apply(this, arguments);
401 }, 413 },
402 414
403 /** @id MochiKit.Base.isNotEmpty */ 415 /** @id MochiKit.Base.isNotEmpty */
404 isNotEmpty: function (obj) { 416 isNotEmpty: function (obj) {
405 for (var i = 0; i < arguments.length; i++) { 417 for (var i = 0; i < arguments.length; i++) {
406 var o = arguments[i]; 418 var o = arguments[i];
407 if (!(o && o.length)) { 419 if (!(o && o.length)) {
408 return false; 420 return false;
409 } 421 }
410 } 422 }
411 return true; 423 return true;
412 }, 424 },
413 425
414 /** @id MochiKit.Base.isArrayLike */ 426 /** @id MochiKit.Base.isArrayLike */
415 isArrayLike: function () { 427 isArrayLike: function () {
416 for (var i = 0; i < arguments.length; i++) { 428 for (var i = 0; i < arguments.length; i++) {
417 var o = arguments[i]; 429 var o = arguments[i];
418 var typ = typeof(o); 430 var typ = typeof(o);
@@ -614,347 +626,356 @@ MochiKit.Base.update(MochiKit.Base, {
614 compose: function (f1, f2/*, f3, ... fN */) { 626 compose: function (f1, f2/*, f3, ... fN */) {
615 var fnlist = []; 627 var fnlist = [];
616 var m = MochiKit.Base; 628 var m = MochiKit.Base;
617 if (arguments.length === 0) { 629 if (arguments.length === 0) {
618 throw new TypeError("compose() requires at least one argument"); 630 throw new TypeError("compose() requires at least one argument");
619 } 631 }
620 for (var i = 0; i < arguments.length; i++) { 632 for (var i = 0; i < arguments.length; i++) {
621 var fn = arguments[i]; 633 var fn = arguments[i];
622 if (typeof(fn) != "function") { 634 if (typeof(fn) != "function") {
623 throw new TypeError(m.repr(fn) + " is not a function"); 635 throw new TypeError(m.repr(fn) + " is not a function");
624 } 636 }
625 fnlist.push(fn); 637 fnlist.push(fn);
626 } 638 }
627 return function () { 639 return function () {
628 var args = arguments; 640 var args = arguments;
629 for (var i = fnlist.length - 1; i >= 0; i--) { 641 for (var i = fnlist.length - 1; i >= 0; i--) {
630 args = [fnlist[i].apply(this, args)]; 642 args = [fnlist[i].apply(this, args)];
631 } 643 }
632 return args[0]; 644 return args[0];
633 }; 645 };
634 }, 646 },
635 647
636 /** @id MochiKit.Base.bind */ 648 /** @id MochiKit.Base.bind */
637 bind: function (func, self/* args... */) { 649 bind: function (func, self/* args... */) {
638 if (typeof(func) == "string") { 650 if (typeof(func) == "string") {
639 func = self[func]; 651 func = self[func];
640 } 652 }
641 var im_func = func.im_func; 653 var im_func = func.im_func;
642 var im_preargs = func.im_preargs; 654 var im_preargs = func.im_preargs;
643 var im_self = func.im_self; 655 var im_self = func.im_self;
644 var m = MochiKit.Base; 656 var m = MochiKit.Base;
645 if (typeof(func) == "function" && typeof(func.apply) == "undefined") { 657 if (typeof(func) == "function" && typeof(func.apply) == "undefined") {
646 // this is for cases where JavaScript sucks ass and gives you a 658 // this is for cases where JavaScript sucks ass and gives you a
647 // really dumb built-in function like alert() that doesn't have 659 // really dumb built-in function like alert() that doesn't have
648 // an apply 660 // an apply
649 func = m._wrapDumbFunction(func); 661 func = m._wrapDumbFunction(func);
650 } 662 }
651 if (typeof(im_func) != 'function') { 663 if (typeof(im_func) != 'function') {
652 im_func = func; 664 im_func = func;
653 } 665 }
654 if (typeof(self) != 'undefined') { 666 if (typeof(self) != 'undefined') {
655 im_self = self; 667 im_self = self;
656 } 668 }
657 if (typeof(im_preargs) == 'undefined') { 669 if (typeof(im_preargs) == 'undefined') {
658 im_preargs = []; 670 im_preargs = [];
659 } else { 671 } else {
660 im_preargs = im_preargs.slice(); 672 im_preargs = im_preargs.slice();
661 } 673 }
662 m.extend(im_preargs, arguments, 2); 674 m.extend(im_preargs, arguments, 2);
663 var newfunc = function () { 675 var newfunc = function () {
664 var args = arguments; 676 var args = arguments;
665 var me = arguments.callee; 677 var me = arguments.callee;
666 if (me.im_preargs.length > 0) { 678 if (me.im_preargs.length > 0) {
667 args = m.concat(me.im_preargs, args); 679 args = m.concat(me.im_preargs, args);
668 } 680 }
669 var self = me.im_self; 681 var self = me.im_self;
670 if (!self) { 682 if (!self) {
671 self = this; 683 self = this;
672 } 684 }
673 return me.im_func.apply(self, args); 685 return me.im_func.apply(self, args);
674 }; 686 };
675 newfunc.im_self = im_self; 687 newfunc.im_self = im_self;
676 newfunc.im_func = im_func; 688 newfunc.im_func = im_func;
677 newfunc.im_preargs = im_preargs; 689 newfunc.im_preargs = im_preargs;
690 if (typeof(im_func.NAME) == 'string') {
691 newfunc.NAME = "bind(" + im_func.NAME + ",...)";
692 }
678 return newfunc; 693 return newfunc;
679 }, 694 },
680 695
681 /** @id MochiKit.Base.bindLate */ 696 /** @id MochiKit.Base.bindLate */
682 bindLate: function (func, self/* args... */) { 697 bindLate: function (func, self/* args... */) {
683 var m = MochiKit.Base; 698 var m = MochiKit.Base;
684 var args = arguments; 699 var args = arguments;
685 if (typeof(func) === "string") { 700 if (typeof(func) === "string") {
686 args = m.extend([m.forwardCall(func)], arguments, 1); 701 args = m.extend([m.forwardCall(func)], arguments, 1);
687 return m.bind.apply(this, args); 702 return m.bind.apply(this, args);
688 } 703 }
689 return m.bind.apply(this, args); 704 return m.bind.apply(this, args);
690 }, 705 },
691 706
692 /** @id MochiKit.Base.bindMethods */ 707 /** @id MochiKit.Base.bindMethods */
693 bindMethods: function (self) { 708 bindMethods: function (self) {
694 var bind = MochiKit.Base.bind; 709 var bind = MochiKit.Base.bind;
695 for (var k in self) { 710 for (var k in self) {
696 var func = self[k]; 711 var func = self[k];
697 if (typeof(func) == 'function') { 712 if (typeof(func) == 'function') {
698 self[k] = bind(func, self); 713 self[k] = bind(func, self);
699 } 714 }
700 } 715 }
701 }, 716 },
702 717
703 /** @id MochiKit.Base.registerComparator */ 718 /** @id MochiKit.Base.registerComparator */
704 registerComparator: function (name, check, comparator, /* optional */ override) { 719 registerComparator: function (name, check, comparator, /* optional */ override) {
705 MochiKit.Base.comparatorRegistry.register(name, check, comparator, override); 720 MochiKit.Base.comparatorRegistry.register(name, check, comparator, override);
706 }, 721 },
707 722
708 _primitives: {'boolean': true, 'string': true, 'number': true}, 723 _primitives: {'boolean': true, 'string': true, 'number': true},
709 724
710 /** @id MochiKit.Base.compare */ 725 /** @id MochiKit.Base.compare */
711 compare: function (a, b) { 726 compare: function (a, b) {
712 if (a == b) { 727 if (a == b) {
713 return 0; 728 return 0;
714 } 729 }
715 var aIsNull = (typeof(a) == 'undefined' || a === null); 730 var aIsNull = (typeof(a) == 'undefined' || a === null);
716 var bIsNull = (typeof(b) == 'undefined' || b === null); 731 var bIsNull = (typeof(b) == 'undefined' || b === null);
717 if (aIsNull && bIsNull) { 732 if (aIsNull && bIsNull) {
718 return 0; 733 return 0;
719 } else if (aIsNull) { 734 } else if (aIsNull) {
720 return -1; 735 return -1;
721 } else if (bIsNull) { 736 } else if (bIsNull) {
722 return 1; 737 return 1;
723 } 738 }
724 var m = MochiKit.Base; 739 var m = MochiKit.Base;
725 // bool, number, string have meaningful comparisons 740 // bool, number, string have meaningful comparisons
726 var prim = m._primitives; 741 var prim = m._primitives;
727 if (!(typeof(a) in prim && typeof(b) in prim)) { 742 if (!(typeof(a) in prim && typeof(b) in prim)) {
728 try { 743 try {
729 return m.comparatorRegistry.match(a, b); 744 return m.comparatorRegistry.match(a, b);
730 } catch (e) { 745 } catch (e) {
731 if (e != m.NotFound) { 746 if (e != m.NotFound) {
732 throw e; 747 throw e;
733 } 748 }
734 } 749 }
735 } 750 }
736 if (a < b) { 751 if (a < b) {
737 return -1; 752 return -1;
738 } else if (a > b) { 753 } else if (a > b) {
739 return 1; 754 return 1;
740 } 755 }
741 // These types can't be compared 756 // These types can't be compared
742 var repr = m.repr; 757 var repr = m.repr;
743 throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared"); 758 throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared");
744 }, 759 },
745 760
746 /** @id MochiKit.Base.compareDateLike */ 761 /** @id MochiKit.Base.compareDateLike */
747 compareDateLike: function (a, b) { 762 compareDateLike: function (a, b) {
748 return MochiKit.Base.compare(a.getTime(), b.getTime()); 763 return MochiKit.Base.compare(a.getTime(), b.getTime());
749 }, 764 },
750 765
751 /** @id MochiKit.Base.compareArrayLike */ 766 /** @id MochiKit.Base.compareArrayLike */
752 compareArrayLike: function (a, b) { 767 compareArrayLike: function (a, b) {
753 var compare = MochiKit.Base.compare; 768 var compare = MochiKit.Base.compare;
754 var count = a.length; 769 var count = a.length;
755 var rval = 0; 770 var rval = 0;
756 if (count > b.length) { 771 if (count > b.length) {
757 rval = 1; 772 rval = 1;
758 count = b.length; 773 count = b.length;
759 } else if (count < b.length) { 774 } else if (count < b.length) {
760 rval = -1; 775 rval = -1;
761 } 776 }
762 for (var i = 0; i < count; i++) { 777 for (var i = 0; i < count; i++) {
763 var cmp = compare(a[i], b[i]); 778 var cmp = compare(a[i], b[i]);
764 if (cmp) { 779 if (cmp) {
765 return cmp; 780 return cmp;
766 } 781 }
767 } 782 }
768 return rval; 783 return rval;
769 }, 784 },
770 785
771 /** @id MochiKit.Base.registerRepr */ 786 /** @id MochiKit.Base.registerRepr */
772 registerRepr: function (name, check, wrap, /* optional */override) { 787 registerRepr: function (name, check, wrap, /* optional */override) {
773 MochiKit.Base.reprRegistry.register(name, check, wrap, override); 788 MochiKit.Base.reprRegistry.register(name, check, wrap, override);
774 }, 789 },
775 790
776 /** @id MochiKit.Base.repr */ 791 /** @id MochiKit.Base.repr */
777 repr: function (o) { 792 repr: function (o) {
778 if (typeof(o) == "undefined") { 793 if (typeof(o) == "undefined") {
779 return "undefined"; 794 return "undefined";
780 } else if (o === null) { 795 } else if (o === null) {
781 return "null"; 796 return "null";
782 } 797 }
783 try { 798 try {
784 if (typeof(o.__repr__) == 'function') { 799 if (typeof(o.__repr__) == 'function') {
785 return o.__repr__(); 800 return o.__repr__();
786 } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) { 801 } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) {
787 return o.repr(); 802 return o.repr();
788 } 803 }
789 return MochiKit.Base.reprRegistry.match(o); 804 return MochiKit.Base.reprRegistry.match(o);
790 } catch (e) { 805 } catch (e) {
791 if (typeof(o.NAME) == 'string' && ( 806 try {
792 o.toString == Function.prototype.toString || 807 if (typeof(o.NAME) == 'string' && (
793 o.toString == Object.prototype.toString 808 o.toString == Function.prototype.toString ||
794 )) { 809 o.toString == Object.prototype.toString
795 return o.NAME; 810 )) {
811 return o.NAME;
812 }
813 } catch (ignore) {
796 } 814 }
797 } 815 }
798 try { 816 try {
799 var ostring = (o + ""); 817 var ostring = (o + "");
800 } catch (e) { 818 } catch (e) {
801 return "[" + typeof(o) + "]"; 819 return "[" + typeof(o) + "]";
802 } 820 }
803 if (typeof(o) == "function") { 821 if (typeof(o) == "function") {
804 ostring = ostring.replace(/^\s+/, "").replace(/\s+/g, " "); 822 ostring = ostring.replace(/^\s+/, "").replace(/\s+/g, " ");
805 ostring = ostring.replace(/,(\S)/, ", $1"); 823 ostring = ostring.replace(/,(\S)/, ", $1");
806 var idx = ostring.indexOf("{"); 824 var idx = ostring.indexOf("{");
807 if (idx != -1) { 825 if (idx != -1) {
808 ostring = ostring.substr(0, idx) + "{...}"; 826 ostring = ostring.substr(0, idx) + "{...}";
809 } 827 }
810 } 828 }
811 return ostring; 829 return ostring;
812 }, 830 },
813 831
814 /** @id MochiKit.Base.reprArrayLike */ 832 /** @id MochiKit.Base.reprArrayLike */
815 reprArrayLike: function (o) { 833 reprArrayLike: function (o) {
816 var m = MochiKit.Base; 834 var m = MochiKit.Base;
817 return "[" + m.map(m.repr, o).join(", ") + "]"; 835 return "[" + m.map(m.repr, o).join(", ") + "]";
818 }, 836 },
819 837
820 /** @id MochiKit.Base.reprString */ 838 /** @id MochiKit.Base.reprString */
821 reprString: function (o) { 839 reprString: function (o) {
822 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"' 840 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
823 ).replace(/[\f]/g, "\\f" 841 ).replace(/[\f]/g, "\\f"
824 ).replace(/[\b]/g, "\\b" 842 ).replace(/[\b]/g, "\\b"
825 ).replace(/[\n]/g, "\\n" 843 ).replace(/[\n]/g, "\\n"
826 ).replace(/[\t]/g, "\\t" 844 ).replace(/[\t]/g, "\\t"
827 ).replace(/[\v]/g, "\\v" 845 ).replace(/[\v]/g, "\\v"
828 ).replace(/[\r]/g, "\\r"); 846 ).replace(/[\r]/g, "\\r");
829 }, 847 },
830 848
831 /** @id MochiKit.Base.reprNumber */ 849 /** @id MochiKit.Base.reprNumber */
832 reprNumber: function (o) { 850 reprNumber: function (o) {
833 return o + ""; 851 return o + "";
834 }, 852 },
835 853
836 /** @id MochiKit.Base.registerJSON */ 854 /** @id MochiKit.Base.registerJSON */
837 registerJSON: function (name, check, wrap, /* optional */override) { 855 registerJSON: function (name, check, wrap, /* optional */override) {
838 MochiKit.Base.jsonRegistry.register(name, check, wrap, override); 856 MochiKit.Base.jsonRegistry.register(name, check, wrap, override);
839 }, 857 },
840 858
841 859
842 /** @id MochiKit.Base.evalJSON */ 860 /** @id MochiKit.Base.evalJSON */
843 evalJSON: function () { 861 evalJSON: function (jsonText) {
844 return eval("(" + MochiKit.Base._filterJSON(arguments[0]) + ")"); 862 return eval("(" + MochiKit.Base._filterJSON(jsonText) + ")");
845 }, 863 },
846 864
847 _filterJSON: function (s) { 865 _filterJSON: function (s) {
848 var m = s.match(/^\s*\/\*(.*)\*\/\s*$/); 866 var m = s.match(/^\s*\/\*(.*)\*\/\s*$/);
849 if (m) { 867 return (m) ? m[1] : s;
850 return m[1];
851 }
852 return s;
853 }, 868 },
854 869
855 /** @id MochiKit.Base.serializeJSON */ 870 /** @id MochiKit.Base.serializeJSON */
856 serializeJSON: function (o) { 871 serializeJSON: function (o) {
857 var objtype = typeof(o); 872 var objtype = typeof(o);
858 if (objtype == "number" || objtype == "boolean") { 873 if (objtype == "number" || objtype == "boolean") {
859 return o + ""; 874 return o + "";
860 } else if (o === null) { 875 } else if (o === null) {
861 return "null"; 876 return "null";
862 } else if (objtype == "string") { 877 } else if (objtype == "string") {
863 var res = ""; 878 var res = "";
864 for (var i = 0; i < o.length; i++) { 879 for (var i = 0; i < o.length; i++) {
865 var c = o.charAt(i); 880 var c = o.charAt(i);
866 if (c == '\"') { 881 if (c == '\"') {
867 res += '\\"'; 882 res += '\\"';
868 } else if (c == '\\') { 883 } else if (c == '\\') {
869 res += '\\\\'; 884 res += '\\\\';
870 } else if (c == '\b') { 885 } else if (c == '\b') {
871 res += '\\b'; 886 res += '\\b';
872 } else if (c == '\f') { 887 } else if (c == '\f') {
873 res += '\\f'; 888 res += '\\f';
874 } else if (c == '\n') { 889 } else if (c == '\n') {
875 res += '\\n'; 890 res += '\\n';
876 } else if (c == '\r') { 891 } else if (c == '\r') {
877 res += '\\r'; 892 res += '\\r';
878 } else if (c == '\t') { 893 } else if (c == '\t') {
879 res += '\\t'; 894 res += '\\t';
880 } else if (o.charCodeAt(i) <= 0x1F) { 895 } else if (o.charCodeAt(i) <= 0x1F) {
881 var hex = o.charCodeAt(i).toString(16); 896 var hex = o.charCodeAt(i).toString(16);
882 if (hex.length < 2) { 897 if (hex.length < 2) {
883 hex = '0' + hex; 898 hex = '0' + hex;
884 } 899 }
885 res += '\\u00' + hex.toUpperCase(); 900 res += '\\u00' + hex.toUpperCase();
886 } else { 901 } else {
887 res += c; 902 res += c;
888 } 903 }
889 } 904 }
890 return '"' + res + '"'; 905 return '"' + res + '"';
891 } 906 }
892 // recurse 907 // recurse
893 var me = arguments.callee; 908 var me = arguments.callee;
894 // short-circuit for objects that support "json" serialization 909 // short-circuit for objects that support "json" serialization
895 // if they return "self" then just pass-through... 910 // if they return "self" then just pass-through...
896 var newObj; 911 var newObj;
912 if (typeof(o.toJSON) == "function") {
913 newObj = o.toJSON();
914 if (o !== newObj) {
915 return me(newObj);
916 }
917 }
897 if (typeof(o.__json__) == "function") { 918 if (typeof(o.__json__) == "function") {
898 newObj = o.__json__(); 919 newObj = o.__json__();
899 if (o !== newObj) { 920 if (o !== newObj) {
900 return me(newObj); 921 return me(newObj);
901 } 922 }
902 } 923 }
903 if (typeof(o.json) == "function") { 924 if (typeof(o.json) == "function") {
904 newObj = o.json(); 925 newObj = o.json();
905 if (o !== newObj) { 926 if (o !== newObj) {
906 return me(newObj); 927 return me(newObj);
907 } 928 }
908 } 929 }
909 // array 930 // array
910 if (objtype != "function" && typeof(o.length) == "number") { 931 if (objtype != "function" && typeof(o.length) == "number") {
911 var res = []; 932 var res = [];
912 for (var i = 0; i < o.length; i++) { 933 for (var i = 0; i < o.length; i++) {
913 var val = me(o[i]); 934 var val = me(o[i]);
914 if (typeof(val) != "string") { 935 if (typeof(val) != "string") {
915 // skip non-serializable values 936 // skip non-serializable values
916 continue; 937 continue;
917 } 938 }
918 res.push(val); 939 res.push(val);
919 } 940 }
920 return "[" + res.join(", ") + "]"; 941 return "[" + res.join(", ") + "]";
921 } 942 }
922 // look in the registry 943 // look in the registry
923 var m = MochiKit.Base; 944 var m = MochiKit.Base;
924 try { 945 try {
925 newObj = m.jsonRegistry.match(o); 946 newObj = m.jsonRegistry.match(o);
926 if (o !== newObj) { 947 if (o !== newObj) {
927 return me(newObj); 948 return me(newObj);
928 } 949 }
929 } catch (e) { 950 } catch (e) {
930 if (e != m.NotFound) { 951 if (e != m.NotFound) {
931 // something really bad happened 952 // something really bad happened
932 throw e; 953 throw e;
933 } 954 }
934 } 955 }
935 // undefined is outside of the spec 956 // undefined is outside of the spec
936 if (objtype == "undefined") { 957 if (objtype == "undefined") {
937 throw new TypeError("undefined can not be serialized as JSON"); 958 throw new TypeError("undefined can not be serialized as JSON");
938 } 959 }
939 // it's a function with no adapter, bad 960 // it's a function with no adapter, bad
940 if (objtype == "function") { 961 if (objtype == "function") {
941 return null; 962 return null;
942 } 963 }
943 // generic object code path 964 // generic object code path
944 res = []; 965 res = [];
945 for (var k in o) { 966 for (var k in o) {
946 var useKey; 967 var useKey;
947 if (typeof(k) == "number") { 968 if (typeof(k) == "number") {
948 useKey = '"' + k + '"'; 969 useKey = '"' + k + '"';
949 } else if (typeof(k) == "string") { 970 } else if (typeof(k) == "string") {
950 useKey = me(k); 971 useKey = me(k);
951 } else { 972 } else {
952 // skip non-string or number keys 973 // skip non-string or number keys
953 continue; 974 continue;
954 } 975 }
955 val = me(o[k]); 976 val = me(o[k]);
956 if (typeof(val) != "string") { 977 if (typeof(val) != "string") {
957 // skip non-serializable values 978 // skip non-serializable values
958 continue; 979 continue;
959 } 980 }
960 res.push(useKey + ":" + val); 981 res.push(useKey + ":" + val);
@@ -1039,129 +1060,129 @@ MochiKit.Base.update(MochiKit.Base, {
1039 return cur; 1060 return cur;
1040 }, 1061 },
1041 1062
1042 /** @id MochiKit.Base.objMax */ 1063 /** @id MochiKit.Base.objMax */
1043 objMax: function (/* obj... */) { 1064 objMax: function (/* obj... */) {
1044 return MochiKit.Base.listMinMax(1, arguments); 1065 return MochiKit.Base.listMinMax(1, arguments);
1045 }, 1066 },
1046 1067
1047 /** @id MochiKit.Base.objMin */ 1068 /** @id MochiKit.Base.objMin */
1048 objMin: function (/* obj... */) { 1069 objMin: function (/* obj... */) {
1049 return MochiKit.Base.listMinMax(-1, arguments); 1070 return MochiKit.Base.listMinMax(-1, arguments);
1050 }, 1071 },
1051 1072
1052 /** @id MochiKit.Base.findIdentical */ 1073 /** @id MochiKit.Base.findIdentical */
1053 findIdentical: function (lst, value, start/* = 0 */, /* optional */end) { 1074 findIdentical: function (lst, value, start/* = 0 */, /* optional */end) {
1054 if (typeof(end) == "undefined" || end === null) { 1075 if (typeof(end) == "undefined" || end === null) {
1055 end = lst.length; 1076 end = lst.length;
1056 } 1077 }
1057 if (typeof(start) == "undefined" || start === null) { 1078 if (typeof(start) == "undefined" || start === null) {
1058 start = 0; 1079 start = 0;
1059 } 1080 }
1060 for (var i = start; i < end; i++) { 1081 for (var i = start; i < end; i++) {
1061 if (lst[i] === value) { 1082 if (lst[i] === value) {
1062 return i; 1083 return i;
1063 } 1084 }
1064 } 1085 }
1065 return -1; 1086 return -1;
1066 }, 1087 },
1067 1088
1068 /** @id MochiKit.Base.mean */ 1089 /** @id MochiKit.Base.mean */
1069 mean: function(/* lst... */) { 1090 mean: function(/* lst... */) {
1070 /* http://www.nist.gov/dads/HTML/mean.html */ 1091 /* http://www.nist.gov/dads/HTML/mean.html */
1071 var sum = 0; 1092 var sum = 0;
1072 1093
1073 var m = MochiKit.Base; 1094 var m = MochiKit.Base;
1074 var args = m.extend(null, arguments); 1095 var args = m.extend(null, arguments);
1075 var count = args.length; 1096 var count = args.length;
1076 1097
1077 while (args.length) { 1098 while (args.length) {
1078 var o = args.shift(); 1099 var o = args.shift();
1079 if (o && typeof(o) == "object" && typeof(o.length) == "number") { 1100 if (o && typeof(o) == "object" && typeof(o.length) == "number") {
1080 count += o.length - 1; 1101 count += o.length - 1;
1081 for (var i = o.length - 1; i >= 0; i--) { 1102 for (var i = o.length - 1; i >= 0; i--) {
1082 sum += o[i]; 1103 sum += o[i];
1083 } 1104 }
1084 } else { 1105 } else {
1085 sum += o; 1106 sum += o;
1086 } 1107 }
1087 } 1108 }
1088 1109
1089 if (count <= 0) { 1110 if (count <= 0) {
1090 throw new TypeError('mean() requires at least one argument'); 1111 throw new TypeError('mean() requires at least one argument');
1091 } 1112 }
1092 1113
1093 return sum/count; 1114 return sum/count;
1094 }, 1115 },
1095 1116
1096 /** @id MochiKit.Base.median */ 1117 /** @id MochiKit.Base.median */
1097 median: function(/* lst... */) { 1118 median: function(/* lst... */) {
1098 /* http://www.nist.gov/dads/HTML/median.html */ 1119 /* http://www.nist.gov/dads/HTML/median.html */
1099 var data = MochiKit.Base.flattenArguments(arguments); 1120 var data = MochiKit.Base.flattenArguments(arguments);
1100 if (data.length === 0) { 1121 if (data.length === 0) {
1101 throw new TypeError('median() requires at least one argument'); 1122 throw new TypeError('median() requires at least one argument');
1102 } 1123 }
1103 data.sort(compare); 1124 data.sort(MochiKit.Base.compare);
1104 if (data.length % 2 == 0) { 1125 if (data.length % 2 == 0) {
1105 var upper = data.length / 2; 1126 var upper = data.length / 2;
1106 return (data[upper] + data[upper - 1]) / 2; 1127 return (data[upper] + data[upper - 1]) / 2;
1107 } else { 1128 } else {
1108 return data[(data.length - 1) / 2]; 1129 return data[(data.length - 1) / 2];
1109 } 1130 }
1110 }, 1131 },
1111 1132
1112 /** @id MochiKit.Base.findValue */ 1133 /** @id MochiKit.Base.findValue */
1113 findValue: function (lst, value, start/* = 0 */, /* optional */end) { 1134 findValue: function (lst, value, start/* = 0 */, /* optional */end) {
1114 if (typeof(end) == "undefined" || end === null) { 1135 if (typeof(end) == "undefined" || end === null) {
1115 end = lst.length; 1136 end = lst.length;
1116 } 1137 }
1117 if (typeof(start) == "undefined" || start === null) { 1138 if (typeof(start) == "undefined" || start === null) {
1118 start = 0; 1139 start = 0;
1119 } 1140 }
1120 var cmp = MochiKit.Base.compare; 1141 var cmp = MochiKit.Base.compare;
1121 for (var i = start; i < end; i++) { 1142 for (var i = start; i < end; i++) {
1122 if (cmp(lst[i], value) === 0) { 1143 if (cmp(lst[i], value) === 0) {
1123 return i; 1144 return i;
1124 } 1145 }
1125 } 1146 }
1126 return -1; 1147 return -1;
1127 }, 1148 },
1128 1149
1129 /** @id MochiKit.Base.nodeWalk */ 1150 /** @id MochiKit.Base.nodeWalk */
1130 nodeWalk: function (node, visitor) { 1151 nodeWalk: function (node, visitor) {
1131 var nodes = [node]; 1152 var nodes = [node];
1132 var extend = MochiKit.Base.extend; 1153 var extend = MochiKit.Base.extend;
1133 while (nodes.length) { 1154 while (nodes.length) {
1134 var res = visitor(nodes.shift()); 1155 var res = visitor(nodes.shift());
1135 if (res) { 1156 if (res) {
1136 extend(nodes, res); 1157 extend(nodes, res);
1137 } 1158 }
1138 } 1159 }
1139 }, 1160 },
1140 1161
1141 1162
1142 /** @id MochiKit.Base.nameFunctions */ 1163 /** @id MochiKit.Base.nameFunctions */
1143 nameFunctions: function (namespace) { 1164 nameFunctions: function (namespace) {
1144 var base = namespace.NAME; 1165 var base = namespace.NAME;
1145 if (typeof(base) == 'undefined') { 1166 if (typeof(base) == 'undefined') {
1146 base = ''; 1167 base = '';
1147 } else { 1168 } else {
1148 base = base + '.'; 1169 base = base + '.';
1149 } 1170 }
1150 for (var name in namespace) { 1171 for (var name in namespace) {
1151 var o = namespace[name]; 1172 var o = namespace[name];
1152 if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { 1173 if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') {
1153 try { 1174 try {
1154 o.NAME = base + name; 1175 o.NAME = base + name;
1155 } catch (e) { 1176 } catch (e) {
1156 // pass 1177 // pass
1157 } 1178 }
1158 } 1179 }
1159 } 1180 }
1160 }, 1181 },
1161 1182
1162 1183
1163 /** @id MochiKit.Base.queryString */ 1184 /** @id MochiKit.Base.queryString */
1164 queryString: function (names, values) { 1185 queryString: function (names, values) {
1165 // check to see if names is a string or a DOM element, and if 1186 // check to see if names is a string or a DOM element, and if
1166 // MochiKit.DOM is available. If so, drop it like it's a form 1187 // MochiKit.DOM is available. If so, drop it like it's a form
1167 // Ugliest conditional in MochiKit? Probably! 1188 // Ugliest conditional in MochiKit? Probably!
@@ -1229,224 +1250,251 @@ MochiKit.Base.update(MochiKit.Base, {
1229 var name = decode(pair.shift()); 1250 var name = decode(pair.shift());
1230 if (!name) { 1251 if (!name) {
1231 continue; 1252 continue;
1232 } 1253 }
1233 var arr = o[name]; 1254 var arr = o[name];
1234 if (!(arr instanceof Array)) { 1255 if (!(arr instanceof Array)) {
1235 arr = []; 1256 arr = [];
1236 o[name] = arr; 1257 o[name] = arr;
1237 } 1258 }
1238 arr.push(decode(pair.join("="))); 1259 arr.push(decode(pair.join("=")));
1239 } 1260 }
1240 } else { 1261 } else {
1241 for (var i = 0; i < pairs.length; i++) { 1262 for (var i = 0; i < pairs.length; i++) {
1242 pair = pairs[i].split("="); 1263 pair = pairs[i].split("=");
1243 var name = pair.shift(); 1264 var name = pair.shift();
1244 if (!name) { 1265 if (!name) {
1245 continue; 1266 continue;
1246 } 1267 }
1247 o[decode(name)] = decode(pair.join("=")); 1268 o[decode(name)] = decode(pair.join("="));
1248 } 1269 }
1249 } 1270 }
1250 return o; 1271 return o;
1251 } 1272 }
1252}); 1273});
1253 1274
1254/** @id MochiKit.Base.AdapterRegistry */ 1275/** @id MochiKit.Base.AdapterRegistry */
1255MochiKit.Base.AdapterRegistry = function () { 1276MochiKit.Base.AdapterRegistry = function () {
1256 this.pairs = []; 1277 this.pairs = [];
1257}; 1278};
1258 1279
1259MochiKit.Base.AdapterRegistry.prototype = { 1280MochiKit.Base.AdapterRegistry.prototype = {
1260 /** @id MochiKit.Base.AdapterRegistry.prototype.register */ 1281 /** @id MochiKit.Base.AdapterRegistry.prototype.register */
1261 register: function (name, check, wrap, /* optional */ override) { 1282 register: function (name, check, wrap, /* optional */ override) {
1262 if (override) { 1283 if (override) {
1263 this.pairs.unshift([name, check, wrap]); 1284 this.pairs.unshift([name, check, wrap]);
1264 } else { 1285 } else {
1265 this.pairs.push([name, check, wrap]); 1286 this.pairs.push([name, check, wrap]);
1266 } 1287 }
1267 }, 1288 },
1268 1289
1269 /** @id MochiKit.Base.AdapterRegistry.prototype.match */ 1290 /** @id MochiKit.Base.AdapterRegistry.prototype.match */
1270 match: function (/* ... */) { 1291 match: function (/* ... */) {
1271 for (var i = 0; i < this.pairs.length; i++) { 1292 for (var i = 0; i < this.pairs.length; i++) {
1272 var pair = this.pairs[i]; 1293 var pair = this.pairs[i];
1273 if (pair[1].apply(this, arguments)) { 1294 if (pair[1].apply(this, arguments)) {
1274 return pair[2].apply(this, arguments); 1295 return pair[2].apply(this, arguments);
1275 } 1296 }
1276 } 1297 }
1277 throw MochiKit.Base.NotFound; 1298 throw MochiKit.Base.NotFound;
1278 }, 1299 },
1279 1300
1280 /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */ 1301 /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */
1281 unregister: function (name) { 1302 unregister: function (name) {
1282 for (var i = 0; i < this.pairs.length; i++) { 1303 for (var i = 0; i < this.pairs.length; i++) {
1283 var pair = this.pairs[i]; 1304 var pair = this.pairs[i];
1284 if (pair[0] == name) { 1305 if (pair[0] == name) {
1285 this.pairs.splice(i, 1); 1306 this.pairs.splice(i, 1);
1286 return true; 1307 return true;
1287 } 1308 }
1288 } 1309 }
1289 return false; 1310 return false;
1290 } 1311 }
1291}; 1312};
1292 1313
1293MochiKit.Base._exportSymbols = function (globals, module) { 1314/**
1294 if (MochiKit.__export__ === false || module.__export__ === false) { 1315 * Exports all symbols from one or more modules into the specified
1295 return; 1316 * namespace (or scope). This is similar to MochiKit.Base.update(),
1296 } 1317 * except for special handling of the "__export__" flag, contained
1297 for (var k in module) { 1318 * sub-modules (exported recursively), and names starting with "_".
1298 var v = module[k]; 1319 *
1299 if (v != null) { 1320 * @param {Object} namespace the object or scope to modify
1300 var okName = (k[0] !== "_" && k !== "toString"); 1321 * @param {Object} module the module to export
1301 if (v.__export__ === true || (v.__export__ !== false && okName)) { 1322 */
1302 globals[k] = module[k]; 1323MochiKit.Base.moduleExport = function (namespace, module/*, ...*/) {
1324 var SKIP = { toString: true, NAME: true, VERSION: true };
1325 var mods = MochiKit.Base.extend([], arguments, 1);
1326 while ((module = mods.shift()) != null) {
1327 for (var k in module) {
1328 var v = module[k];
1329 if (v != null) {
1330 var flagSet = (typeof(v.__export__) == 'boolean');
1331 var nameValid = (k[0] !== "_" && !SKIP[k]);
1332 if (flagSet ? v.__export__ : nameValid) {
1333 if (typeof(v) == 'object' && v.NAME && v.VERSION) {
1334 mods.push(v);
1335 } else {
1336 namespace[k] = module[k];
1337 }
1338 }
1303 } 1339 }
1304 } 1340 }
1305 } 1341 }
1342 return namespace;
1343};
1344
1345/**
1346 * Identical to moduleExport, but also considers the global and
1347 * module-specific "__export__" flag.
1348 */
1349MochiKit.Base._exportSymbols = function (namespace, module) {
1350 if (MochiKit.__export__ !== false && module.__export__ !== false) {
1351 MochiKit.Base.moduleExport(namespace, module);
1352 }
1306}; 1353};
1307 1354
1308/** 1355/**
1309 * Creates a deprecated function alias in the specified module. The 1356 * Creates a deprecated function alias in the specified module. The
1310 * deprecated function will forward all calls and arguments to a 1357 * deprecated function will forward all calls and arguments to a
1311 * target function, while also logging a debug message on the first 1358 * target function, while also logging a debug message on the first
1312 * call (if MochiKit.Logging is loaded). The destination function may 1359 * call (if MochiKit.Logging is loaded). The destination function may
1313 * be located in another module, which must be loaded, or an 1360 * be located in another module, which must be loaded, or an
1314 * exception will be thrown. 1361 * exception will be thrown.
1315 * 1362 *
1316 * @param {Object/String} module the source module or module name 1363 * @param {Object/String} module the source module or module name
1317 * (e.g. 'DOM' or 'MochiKit.DOM') 1364 * (e.g. 'DOM' or 'MochiKit.DOM')
1318 * @param {String} name the deprecated function name (e.g. 'getStyle') 1365 * @param {String} name the deprecated function name (e.g. 'getStyle')
1319 * @param {String} target the fully qualified name of the target 1366 * @param {String} target the fully qualified name of the target
1320 * function (e.g. 'MochiKit.Style.getStyle') 1367 * function (e.g. 'MochiKit.Style.getStyle')
1321 * @param {String} version the first version when the source function 1368 * @param {String} version the first version when the source function
1322 * was deprecated (e.g. '1.4') 1369 * was deprecated (e.g. '1.4')
1323 * @param {Boolean} [exportable] the exportable function flag, 1370 * @param {Boolean} [exportable] the exportable function flag,
1324 * defaults to true 1371 * defaults to false
1325 */ 1372 */
1326MochiKit.Base._deprecated = function (module, name, target, version, exportable) { 1373MochiKit.Base._deprecated = function (module, name, target, version, exportable) {
1327 if (typeof(module) === 'string') { 1374 if (typeof(module) === 'string') {
1328 if (module.indexOf('MochiKit.') === 0) { 1375 if (module.indexOf('MochiKit.') === 0) {
1329 module = module.substring(9); 1376 module = module.substring(9);
1330 } 1377 }
1331 module = MochiKit[module]; 1378 module = MochiKit[module];
1332 } 1379 }
1333 var targetModule = target.split('.')[1]; 1380 var targetModule = target.split('.')[1];
1334 var targetName = target.split('.')[2]; 1381 var targetName = target.split('.')[2];
1335 var func = function () { 1382 var func = function () {
1336 var self = arguments.callee; 1383 var self = arguments.callee;
1337 var msg = module.NAME + '.' + name + ' is deprecated since version ' + 1384 var msg = module.NAME + '.' + name + ' is deprecated since version ' +
1338 version + '. Use ' + target + ' instead.'; 1385 version + '. Use ' + target + ' instead.';
1339 if (self.logged !== true) { 1386 if (self.logged !== true) {
1340 self.logged = true; 1387 self.logged = true;
1341 if (MochiKit.Logging) { 1388 if (MochiKit.Logging) {
1342 MochiKit.Logging.logDebug(msg); 1389 MochiKit.Logging.logDebug(msg);
1343 } else if (console && console.log) { 1390 } else if (console && console.log) {
1344 console.log(msg); 1391 console.log(msg);
1345 } 1392 }
1346 } 1393 }
1347 if (!MochiKit[targetModule]) { 1394 if (!MochiKit[targetModule]) {
1348 throw new Error(msg); 1395 throw new Error(msg);
1349 } 1396 }
1350 return MochiKit[targetModule][targetName].apply(this, arguments); 1397 return MochiKit[targetModule][targetName].apply(this, arguments);
1351 }; 1398 };
1352 if (exportable === false) { 1399 func.__export__ = (exportable === true);
1353 func.__export__ = false;
1354 }
1355 module[name] = func; 1400 module[name] = func;
1356} 1401};
1357 1402
1358MochiKit.Base.__new__ = function () { 1403MochiKit.Base.__new__ = function () {
1359 var m = this; 1404 var m = this;
1360 1405
1361 /** @id MochiKit.Base.noop */ 1406 /** @id MochiKit.Base.noop */
1362 m.noop = m.operator.identity; 1407 m.noop = m.operator.identity;
1363 1408
1364 // Backwards compat 1409 // Backwards compat
1365 m._deprecated(m, 'forward', 'MochiKit.Base.forwardCall', '1.3', false); 1410 m._deprecated(m, 'forward', 'MochiKit.Base.forwardCall', '1.3');
1366 m._deprecated(m, 'find', 'MochiKit.Base.findValue', '1.3', false); 1411 m._deprecated(m, 'find', 'MochiKit.Base.findValue', '1.3');
1367 1412
1368 if (typeof(encodeURIComponent) != "undefined") { 1413 if (typeof(encodeURIComponent) != "undefined") {
1369 /** @id MochiKit.Base.urlEncode */ 1414 /** @id MochiKit.Base.urlEncode */
1370 m.urlEncode = function (unencoded) { 1415 m.urlEncode = function (unencoded) {
1371 return encodeURIComponent(unencoded).replace(/\'/g, '%27'); 1416 return encodeURIComponent(unencoded).replace(/\'/g, '%27');
1372 }; 1417 };
1373 } else { 1418 } else {
1374 m.urlEncode = function (unencoded) { 1419 m.urlEncode = function (unencoded) {
1375 return escape(unencoded 1420 return escape(unencoded
1376 ).replace(/\+/g, '%2B' 1421 ).replace(/\+/g, '%2B'
1377 ).replace(/\"/g,'%22' 1422 ).replace(/\"/g,'%22'
1378 ).rval.replace(/\'/g, '%27'); 1423 ).replace(/\'/g, '%27');
1379 }; 1424 };
1380 } 1425 }
1381 1426
1382 /** @id MochiKit.Base.NamedError */ 1427 /** @id MochiKit.Base.NamedError */
1383 m.NamedError = function (name) { 1428 m.NamedError = function (name) {
1384 this.message = name; 1429 this.message = name;
1385 this.name = name; 1430 this.name = name;
1386 }; 1431 };
1387 m.NamedError.prototype = new Error(); 1432 m.NamedError.prototype = new Error();
1433 m.NamedError.prototype.constructor = m.NamedError;
1388 m.update(m.NamedError.prototype, { 1434 m.update(m.NamedError.prototype, {
1389 repr: function () { 1435 repr: function () {
1390 if (this.message && this.message != this.name) { 1436 if (this.message && this.message != this.name) {
1391 return this.name + "(" + m.repr(this.message) + ")"; 1437 return this.name + "(" + m.repr(this.message) + ")";
1392 } else { 1438 } else {
1393 return this.name + "()"; 1439 return this.name + "()";
1394 } 1440 }
1395 }, 1441 },
1396 toString: m.forwardCall("repr") 1442 toString: m.forwardCall("repr")
1397 }); 1443 });
1398 1444
1399 /** @id MochiKit.Base.NotFound */ 1445 /** @id MochiKit.Base.NotFound */
1400 m.NotFound = new m.NamedError("MochiKit.Base.NotFound"); 1446 m.NotFound = new m.NamedError("MochiKit.Base.NotFound");
1401 1447
1402 1448
1403 /** @id MochiKit.Base.listMax */ 1449 /** @id MochiKit.Base.listMax */
1404 m.listMax = m.partial(m.listMinMax, 1); 1450 m.listMax = m.partial(m.listMinMax, 1);
1405 /** @id MochiKit.Base.listMin */ 1451 /** @id MochiKit.Base.listMin */
1406 m.listMin = m.partial(m.listMinMax, -1); 1452 m.listMin = m.partial(m.listMinMax, -1);
1407 1453
1408 /** @id MochiKit.Base.isCallable */ 1454 /** @id MochiKit.Base.isCallable */
1409 m.isCallable = m.typeMatcher('function'); 1455 m.isCallable = m.typeMatcher('function');
1410 /** @id MochiKit.Base.isUndefined */ 1456 /** @id MochiKit.Base.isUndefined */
1411 m.isUndefined = m.typeMatcher('undefined'); 1457 m.isUndefined = m.typeMatcher('undefined');
1458 /** @id MochiKit.Base.isValue */
1459 m.isValue = m.typeMatcher('boolean', 'number', 'string');
1412 1460
1413 /** @id MochiKit.Base.merge */ 1461 /** @id MochiKit.Base.merge */
1414 m.merge = m.partial(m.update, null); 1462 m.merge = m.partial(m.update, null);
1415 /** @id MochiKit.Base.zip */ 1463 /** @id MochiKit.Base.zip */
1416 m.zip = m.partial(m.map, null); 1464 m.zip = m.partial(m.map, null);
1417 1465
1418 /** @id MochiKit.Base.average */ 1466 /** @id MochiKit.Base.average */
1419 m.average = m.mean; 1467 m.average = m.mean;
1420 1468
1421 /** @id MochiKit.Base.comparatorRegistry */ 1469 /** @id MochiKit.Base.comparatorRegistry */
1422 m.comparatorRegistry = new m.AdapterRegistry(); 1470 m.comparatorRegistry = new m.AdapterRegistry();
1423 m.registerComparator("dateLike", m.isDateLike, m.compareDateLike); 1471 m.registerComparator("dateLike", m.isDateLike, m.compareDateLike);
1424 m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike); 1472 m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike);
1425 1473
1426 /** @id MochiKit.Base.reprRegistry */ 1474 /** @id MochiKit.Base.reprRegistry */
1427 m.reprRegistry = new m.AdapterRegistry(); 1475 m.reprRegistry = new m.AdapterRegistry();
1428 m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike); 1476 m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike);
1429 m.registerRepr("string", m.typeMatcher("string"), m.reprString); 1477 m.registerRepr("string", m.typeMatcher("string"), m.reprString);
1430 m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber); 1478 m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber);
1431 1479
1432 /** @id MochiKit.Base.jsonRegistry */ 1480 /** @id MochiKit.Base.jsonRegistry */
1433 m.jsonRegistry = new m.AdapterRegistry(); 1481 m.jsonRegistry = new m.AdapterRegistry();
1434 1482
1435 m.nameFunctions(this); 1483 m.nameFunctions(this);
1436 1484
1437}; 1485};
1438 1486
1439MochiKit.Base.__new__(); 1487MochiKit.Base.__new__();
1440 1488
1441// 1489//
1442// XXX: Internet Explorer blows 1490// XXX: Internet Explorer blows
1443// 1491//
1444if (MochiKit.__export__) { 1492if (MochiKit.__export__) {
1445 compare = MochiKit.Base.compare; 1493 compare = MochiKit.Base.compare;
1446 compose = MochiKit.Base.compose; 1494 compose = MochiKit.Base.compose;
1447 serializeJSON = MochiKit.Base.serializeJSON; 1495 serializeJSON = MochiKit.Base.serializeJSON;
1448 mean = MochiKit.Base.mean; 1496 mean = MochiKit.Base.mean;
1449 median = MochiKit.Base.median; 1497 median = MochiKit.Base.median;
1450} 1498}
1451 1499
1452MochiKit.Base._exportSymbols(this, MochiKit.Base); 1500MochiKit.Base._exportSymbols(this, MochiKit.Base);
diff --git a/frontend/gamma/js/MochiKit/Color.js b/frontend/gamma/js/MochiKit/Color.js
index 27dc2d0..f2a0f67 100644
--- a/frontend/gamma/js/MochiKit/Color.js
+++ b/frontend/gamma/js/MochiKit/Color.js
@@ -1,179 +1,179 @@
1/*** 1/***
2 2
3MochiKit.Color 1.5 3MochiKit.Color 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito and others. All rights Reserved. 7(c) 2005 Bob Ippolito and others. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Color', '1.5', ['Base', 'DOM', 'Style']); 11MochiKit.Base.module(MochiKit, 'Color', '1.5', ['Base', 'DOM', 'Style']);
12 12
13/** @id MochiKit.Color.Color */ 13/** @id MochiKit.Color.Color */
14MochiKit.Color.Color = function (red, green, blue, alpha) { 14MochiKit.Color.Color = function (red, green, blue, alpha) {
15 if (typeof(alpha) == 'undefined' || alpha === null) { 15 if (typeof(alpha) == 'undefined' || alpha === null) {
16 alpha = 1.0; 16 alpha = 1.0;
17 } 17 }
18 this.rgb = { 18 this.rgb = {
19 r: red, 19 r: red,
20 g: green, 20 g: green,
21 b: blue, 21 b: blue,
22 a: alpha 22 a: alpha
23 }; 23 };
24}; 24};
25 25
26 26
27// Prototype methods 27// Prototype methods
28 28
29MochiKit.Color.Color.prototype = { 29MochiKit.Color.Color.prototype = {
30 30
31 __class__: MochiKit.Color.Color, 31 __class__: MochiKit.Color.Color,
32 32
33 /** @id MochiKit.Color.Color.prototype.colorWithAlpha */ 33 /** @id MochiKit.Color.Color.prototype.colorWithAlpha */
34 colorWithAlpha: function (alpha) { 34 colorWithAlpha: function (alpha) {
35 var rgb = this.rgb; 35 var rgb = this.rgb;
36 var m = MochiKit.Color; 36 var m = MochiKit.Color;
37 return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha); 37 return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha);
38 }, 38 },
39 39
40 /** @id MochiKit.Color.Color.prototype.colorWithHue */ 40 /** @id MochiKit.Color.Color.prototype.colorWithHue */
41 colorWithHue: function (hue) { 41 colorWithHue: function (hue) {
42 // get an HSL model, and set the new hue... 42 // get an HSL model, and set the new hue...
43 var hsl = this.asHSL(); 43 var hsl = this.asHSL();
44 hsl.h = hue; 44 hsl.h = hue;
45 var m = MochiKit.Color; 45 var m = MochiKit.Color;
46 // convert back to RGB... 46 // convert back to RGB...
47 return m.Color.fromHSL(hsl); 47 return m.Color.fromHSL(hsl);
48 }, 48 },
49 49
50 /** @id MochiKit.Color.Color.prototype.colorWithSaturation */ 50 /** @id MochiKit.Color.Color.prototype.colorWithSaturation */
51 colorWithSaturation: function (saturation) { 51 colorWithSaturation: function (saturation) {
52 // get an HSL model, and set the new hue... 52 // get an HSL model, and set the new hue...
53 var hsl = this.asHSL(); 53 var hsl = this.asHSL();
54 hsl.s = saturation; 54 hsl.s = saturation;
55 var m = MochiKit.Color; 55 var m = MochiKit.Color;
56 // convert back to RGB... 56 // convert back to RGB...
57 return m.Color.fromHSL(hsl); 57 return m.Color.fromHSL(hsl);
58 }, 58 },
59 59
60 /** @id MochiKit.Color.Color.prototype.colorWithLightness */ 60 /** @id MochiKit.Color.Color.prototype.colorWithLightness */
61 colorWithLightness: function (lightness) { 61 colorWithLightness: function (lightness) {
62 // get an HSL model, and set the new hue... 62 // get an HSL model, and set the new hue...
63 var hsl = this.asHSL(); 63 var hsl = this.asHSL();
64 hsl.l = lightness; 64 hsl.l = lightness;
65 var m = MochiKit.Color; 65 var m = MochiKit.Color;
66 // convert back to RGB... 66 // convert back to RGB...
67 return m.Color.fromHSL(hsl); 67 return m.Color.fromHSL(hsl);
68 }, 68 },
69 69
70 /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */ 70 /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */
71 darkerColorWithLevel: function (level) { 71 darkerColorWithLevel: function (level) {
72 var hsl = this.asHSL(); 72 var hsl = this.asHSL();
73 hsl.l = Math.max(hsl.l - level, 0); 73 hsl.l = Math.max(hsl.l - level, 0);
74 var m = MochiKit.Color; 74 var m = MochiKit.Color;
75 return m.Color.fromHSL(hsl); 75 return m.Color.fromHSL(hsl);
76 }, 76 },
77 77
78 /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */ 78 /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */
79 lighterColorWithLevel: function (level) { 79 lighterColorWithLevel: function (level) {
80 var hsl = this.asHSL(); 80 var hsl = this.asHSL();
81 hsl.l = Math.min(hsl.l + level, 1); 81 hsl.l = Math.min(hsl.l + level, 1);
82 var m = MochiKit.Color; 82 var m = MochiKit.Color;
83 return m.Color.fromHSL(hsl); 83 return m.Color.fromHSL(hsl);
84 }, 84 },
85 85
86 /** @id MochiKit.Color.Color.prototype.blendedColor */ 86 /** @id MochiKit.Color.Color.prototype.blendedColor */
87 blendedColor: function (other, /* optional */ fraction) { 87 blendedColor: function (other, /* optional */ fraction) {
88 if (typeof(fraction) == 'undefined' || fraction === null) { 88 if (typeof(fraction) == 'undefined' || fraction === null) {
89 fraction = 0.5; 89 fraction = 0.5;
90 } 90 }
91 var sf = 1.0 - fraction; 91 var sf = 1.0 - fraction;
92 var s = this.rgb; 92 var s = this.rgb;
93 var d = other.rgb; 93 var d = other.rgb;
94 var df = fraction; 94 var df = fraction;
95 return MochiKit.Color.Color.fromRGB( 95 return MochiKit.Color.Color.fromRGB(
96 (s.r * sf) + (d.r * df), 96 (s.r * sf) + (d.r * df),
97 (s.g * sf) + (d.g * df), 97 (s.g * sf) + (d.g * df),
98 (s.b * sf) + (d.b * df), 98 (s.b * sf) + (d.b * df),
99 (s.a * sf) + (d.a * df) 99 (s.a * sf) + (d.a * df)
100 ); 100 );
101 }, 101 },
102 102
103 /** @id MochiKit.Color.Color.prototype.compareRGB */ 103 /** @id MochiKit.Color.Color.prototype.compareRGB */
104 compareRGB: function (other) { 104 compareRGB: function (other) {
105 var a = this.asRGB(); 105 var a = this.asRGB();
106 var b = other.asRGB(); 106 var b = other.asRGB();
107 return MochiKit.Base.compare( 107 return MochiKit.Base.compare(
108 [a.r, a.g, a.b, a.a], 108 [a.r, a.g, a.b, a.a],
109 [b.r, b.g, b.b, b.a] 109 [b.r, b.g, b.b, b.a]
110 ); 110 );
111 }, 111 },
112 112
113 /** @id MochiKit.Color.Color.prototype.isLight */ 113 /** @id MochiKit.Color.Color.prototype.isLight */
114 isLight: function () { 114 isLight: function () {
115 return this.asHSL().b > 0.5; 115 return this.asHSL().l > 0.5;
116 }, 116 },
117 117
118 /** @id MochiKit.Color.Color.prototype.isDark */ 118 /** @id MochiKit.Color.Color.prototype.isDark */
119 isDark: function () { 119 isDark: function () {
120 return (!this.isLight()); 120 return (!this.isLight());
121 }, 121 },
122 122
123 /** @id MochiKit.Color.Color.prototype.toHSLString */ 123 /** @id MochiKit.Color.Color.prototype.toHSLString */
124 toHSLString: function () { 124 toHSLString: function () {
125 var c = this.asHSL(); 125 var c = this.asHSL();
126 var ccc = MochiKit.Color.clampColorComponent; 126 var ccc = MochiKit.Color.clampColorComponent;
127 var rval = this._hslString; 127 var rval = this._hslString;
128 if (!rval) { 128 if (!rval) {
129 var mid = ( 129 var mid = (
130 ccc(c.h, 360).toFixed(0) 130 ccc(c.h, 360).toFixed(0)
131 + "," + ccc(c.s, 100).toPrecision(4) + "%" 131 + "," + ccc(c.s, 100).toPrecision(4) + "%"
132 + "," + ccc(c.l, 100).toPrecision(4) + "%" 132 + "," + ccc(c.l, 100).toPrecision(4) + "%"
133 ); 133 );
134 var a = c.a; 134 var a = c.a;
135 if (a >= 1) { 135 if (a >= 1) {
136 a = 1; 136 a = 1;
137 rval = "hsl(" + mid + ")"; 137 rval = "hsl(" + mid + ")";
138 } else { 138 } else {
139 if (a <= 0) { 139 if (a <= 0) {
140 a = 0; 140 a = 0;
141 } 141 }
142 rval = "hsla(" + mid + "," + a + ")"; 142 rval = "hsla(" + mid + "," + a + ")";
143 } 143 }
144 this._hslString = rval; 144 this._hslString = rval;
145 } 145 }
146 return rval; 146 return rval;
147 }, 147 },
148 148
149 /** @id MochiKit.Color.Color.prototype.toRGBString */ 149 /** @id MochiKit.Color.Color.prototype.toRGBString */
150 toRGBString: function () { 150 toRGBString: function () {
151 var c = this.rgb; 151 var c = this.rgb;
152 var ccc = MochiKit.Color.clampColorComponent; 152 var ccc = MochiKit.Color.clampColorComponent;
153 var rval = this._rgbString; 153 var rval = this._rgbString;
154 if (!rval) { 154 if (!rval) {
155 var mid = ( 155 var mid = (
156 ccc(c.r, 255).toFixed(0) 156 ccc(c.r, 255).toFixed(0)
157 + "," + ccc(c.g, 255).toFixed(0) 157 + "," + ccc(c.g, 255).toFixed(0)
158 + "," + ccc(c.b, 255).toFixed(0) 158 + "," + ccc(c.b, 255).toFixed(0)
159 ); 159 );
160 if (c.a != 1) { 160 if (c.a != 1) {
161 rval = "rgba(" + mid + "," + c.a + ")"; 161 rval = "rgba(" + mid + "," + c.a + ")";
162 } else { 162 } else {
163 rval = "rgb(" + mid + ")"; 163 rval = "rgb(" + mid + ")";
164 } 164 }
165 this._rgbString = rval; 165 this._rgbString = rval;
166 } 166 }
167 return rval; 167 return rval;
168 }, 168 },
169 169
170 /** @id MochiKit.Color.Color.prototype.asRGB */ 170 /** @id MochiKit.Color.Color.prototype.asRGB */
171 asRGB: function () { 171 asRGB: function () {
172 return MochiKit.Base.clone(this.rgb); 172 return MochiKit.Base.clone(this.rgb);
173 }, 173 },
174 174
175 /** @id MochiKit.Color.Color.prototype.toHexString */ 175 /** @id MochiKit.Color.Color.prototype.toHexString */
176 toHexString: function () { 176 toHexString: function () {
177 var m = MochiKit.Color; 177 var m = MochiKit.Color;
178 var c = this.rgb; 178 var c = this.rgb;
179 var ccc = MochiKit.Color.clampColorComponent; 179 var ccc = MochiKit.Color.clampColorComponent;
@@ -580,141 +580,132 @@ MochiKit.Base.update(MochiKit.Color, {
580 l: lightness, 580 l: lightness,
581 a: alpha 581 a: alpha
582 }; 582 };
583 }, 583 },
584 584
585 /** @id MochiKit.Color.toColorPart */ 585 /** @id MochiKit.Color.toColorPart */
586 toColorPart: function (num) { 586 toColorPart: function (num) {
587 num = Math.round(num); 587 num = Math.round(num);
588 var digits = num.toString(16); 588 var digits = num.toString(16);
589 if (num < 16) { 589 if (num < 16) {
590 return '0' + digits; 590 return '0' + digits;
591 } 591 }
592 return digits; 592 return digits;
593 }, 593 },
594 594
595 __new__: function () { 595 __new__: function () {
596 var m = MochiKit.Base; 596 var m = MochiKit.Base;
597 /** @id MochiKit.Color.Color.fromRGBString */ 597 /** @id MochiKit.Color.Color.fromRGBString */
598 this.Color.fromRGBString = m.bind( 598 this.Color.fromRGBString = m.bind(
599 this.Color._fromColorString, this.Color, "rgb", "fromRGB", 599 this.Color._fromColorString, this.Color, "rgb", "fromRGB",
600 [1.0/255.0, 1.0/255.0, 1.0/255.0, 1] 600 [1.0/255.0, 1.0/255.0, 1.0/255.0, 1]
601 ); 601 );
602 /** @id MochiKit.Color.Color.fromHSLString */ 602 /** @id MochiKit.Color.Color.fromHSLString */
603 this.Color.fromHSLString = m.bind( 603 this.Color.fromHSLString = m.bind(
604 this.Color._fromColorString, this.Color, "hsl", "fromHSL", 604 this.Color._fromColorString, this.Color, "hsl", "fromHSL",
605 [1.0/360.0, 0.01, 0.01, 1] 605 [1.0/360.0, 0.01, 0.01, 1]
606 ); 606 );
607 607
608 var third = 1.0 / 3.0; 608 var third = 1.0 / 3.0;
609 /** @id MochiKit.Color.colors */ 609 /** @id MochiKit.Color.colors */
610 var colors = { 610 var colors = {
611 // NSColor colors plus transparent 611 // NSColor colors plus transparent
612 /** @id MochiKit.Color.blackColor */ 612 /** @id MochiKit.Color.blackColor */
613 black: [0, 0, 0], 613 black: [0, 0, 0],
614 /** @id MochiKit.Color.blueColor */ 614 /** @id MochiKit.Color.blueColor */
615 blue: [0, 0, 1], 615 blue: [0, 0, 1],
616 /** @id MochiKit.Color.brownColor */ 616 /** @id MochiKit.Color.brownColor */
617 brown: [0.6, 0.4, 0.2], 617 brown: [0.6, 0.4, 0.2],
618 /** @id MochiKit.Color.cyanColor */ 618 /** @id MochiKit.Color.cyanColor */
619 cyan: [0, 1, 1], 619 cyan: [0, 1, 1],
620 /** @id MochiKit.Color.darkGrayColor */ 620 /** @id MochiKit.Color.darkGrayColor */
621 darkGray: [third, third, third], 621 darkGray: [third, third, third],
622 /** @id MochiKit.Color.grayColor */ 622 /** @id MochiKit.Color.grayColor */
623 gray: [0.5, 0.5, 0.5], 623 gray: [0.5, 0.5, 0.5],
624 /** @id MochiKit.Color.greenColor */ 624 /** @id MochiKit.Color.greenColor */
625 green: [0, 1, 0], 625 green: [0, 1, 0],
626 /** @id MochiKit.Color.lightGrayColor */ 626 /** @id MochiKit.Color.lightGrayColor */
627 lightGray: [2 * third, 2 * third, 2 * third], 627 lightGray: [2 * third, 2 * third, 2 * third],
628 /** @id MochiKit.Color.magentaColor */ 628 /** @id MochiKit.Color.magentaColor */
629 magenta: [1, 0, 1], 629 magenta: [1, 0, 1],
630 /** @id MochiKit.Color.orangeColor */ 630 /** @id MochiKit.Color.orangeColor */
631 orange: [1, 0.5, 0], 631 orange: [1, 0.5, 0],
632 /** @id MochiKit.Color.purpleColor */ 632 /** @id MochiKit.Color.purpleColor */
633 purple: [0.5, 0, 0.5], 633 purple: [0.5, 0, 0.5],
634 /** @id MochiKit.Color.redColor */ 634 /** @id MochiKit.Color.redColor */
635 red: [1, 0, 0], 635 red: [1, 0, 0],
636 /** @id MochiKit.Color.transparentColor */ 636 /** @id MochiKit.Color.transparentColor */
637 transparent: [0, 0, 0, 0], 637 transparent: [0, 0, 0, 0],
638 /** @id MochiKit.Color.whiteColor */ 638 /** @id MochiKit.Color.whiteColor */
639 white: [1, 1, 1], 639 white: [1, 1, 1],
640 /** @id MochiKit.Color.yellowColor */ 640 /** @id MochiKit.Color.yellowColor */
641 yellow: [1, 1, 0] 641 yellow: [1, 1, 0]
642 }; 642 };
643 643
644 var makeColor = function (name, r, g, b, a) {
645 var rval = this.fromRGB(r, g, b, a);
646 this[name] = function () { return rval; };
647 return rval;
648 };
649
650 for (var k in colors) { 644 for (var k in colors) {
651 var name = k + "Color"; 645 var name = k + "Color";
652 var bindArgs = m.concat( 646 var value = this.Color.fromRGB.apply(this.Color, colors[k]);
653 [makeColor, this.Color, name], 647 this.Color[name] = m.partial(m.operator.identity, value);
654 colors[k]
655 );
656 this.Color[name] = m.bind.apply(null, bindArgs);
657 } 648 }
658 649
659 var isColor = function () { 650 var isColor = function () {
660 for (var i = 0; i < arguments.length; i++) { 651 for (var i = 0; i < arguments.length; i++) {
661 if (!(arguments[i] instanceof MochiKit.Color.Color)) { 652 if (!(arguments[i] instanceof MochiKit.Color.Color)) {
662 return false; 653 return false;
663 } 654 }
664 } 655 }
665 return true; 656 return true;
666 }; 657 };
667 658
668 var compareColor = function (a, b) { 659 var compareColor = function (a, b) {
669 return a.compareRGB(b); 660 return a.compareRGB(b);
670 }; 661 };
671 662
672 m.nameFunctions(this); 663 m.nameFunctions(this);
673 664
674 m.registerComparator(this.Color.NAME, isColor, compareColor); 665 m.registerComparator(this.Color.NAME, isColor, compareColor);
675 } 666 }
676}); 667});
677 668
678MochiKit.Color.__new__(); 669MochiKit.Color.__new__();
679 670
680// Full table of css3 X11 colors <http://www.w3.org/TR/css3-color/#X11COLORS> 671// Full table of css3 X11 colors <http://www.w3.org/TR/css3-color/#X11COLORS>
681 672
682MochiKit.Color.Color._namedColors = { 673MochiKit.Color.Color._namedColors = {
683 aliceblue: "#f0f8ff", 674 aliceblue: "#f0f8ff",
684 antiquewhite: "#faebd7", 675 antiquewhite: "#faebd7",
685 aqua: "#00ffff", 676 aqua: "#00ffff",
686 aquamarine: "#7fffd4", 677 aquamarine: "#7fffd4",
687 azure: "#f0ffff", 678 azure: "#f0ffff",
688 beige: "#f5f5dc", 679 beige: "#f5f5dc",
689 bisque: "#ffe4c4", 680 bisque: "#ffe4c4",
690 black: "#000000", 681 black: "#000000",
691 blanchedalmond: "#ffebcd", 682 blanchedalmond: "#ffebcd",
692 blue: "#0000ff", 683 blue: "#0000ff",
693 blueviolet: "#8a2be2", 684 blueviolet: "#8a2be2",
694 brown: "#a52a2a", 685 brown: "#a52a2a",
695 burlywood: "#deb887", 686 burlywood: "#deb887",
696 cadetblue: "#5f9ea0", 687 cadetblue: "#5f9ea0",
697 chartreuse: "#7fff00", 688 chartreuse: "#7fff00",
698 chocolate: "#d2691e", 689 chocolate: "#d2691e",
699 coral: "#ff7f50", 690 coral: "#ff7f50",
700 cornflowerblue: "#6495ed", 691 cornflowerblue: "#6495ed",
701 cornsilk: "#fff8dc", 692 cornsilk: "#fff8dc",
702 crimson: "#dc143c", 693 crimson: "#dc143c",
703 cyan: "#00ffff", 694 cyan: "#00ffff",
704 darkblue: "#00008b", 695 darkblue: "#00008b",
705 darkcyan: "#008b8b", 696 darkcyan: "#008b8b",
706 darkgoldenrod: "#b8860b", 697 darkgoldenrod: "#b8860b",
707 darkgray: "#a9a9a9", 698 darkgray: "#a9a9a9",
708 darkgreen: "#006400", 699 darkgreen: "#006400",
709 darkgrey: "#a9a9a9", 700 darkgrey: "#a9a9a9",
710 darkkhaki: "#bdb76b", 701 darkkhaki: "#bdb76b",
711 darkmagenta: "#8b008b", 702 darkmagenta: "#8b008b",
712 darkolivegreen: "#556b2f", 703 darkolivegreen: "#556b2f",
713 darkorange: "#ff8c00", 704 darkorange: "#ff8c00",
714 darkorchid: "#9932cc", 705 darkorchid: "#9932cc",
715 darkred: "#8b0000", 706 darkred: "#8b0000",
716 darksalmon: "#e9967a", 707 darksalmon: "#e9967a",
717 darkseagreen: "#8fbc8f", 708 darkseagreen: "#8fbc8f",
718 darkslateblue: "#483d8b", 709 darkslateblue: "#483d8b",
719 darkslategray: "#2f4f4f", 710 darkslategray: "#2f4f4f",
720 darkslategrey: "#2f4f4f", 711 darkslategrey: "#2f4f4f",
diff --git a/frontend/gamma/js/MochiKit/DOM.js b/frontend/gamma/js/MochiKit/DOM.js
index af5d46f..944ab78 100644
--- a/frontend/gamma/js/MochiKit/DOM.js
+++ b/frontend/gamma/js/MochiKit/DOM.js
@@ -1,75 +1,75 @@
1/*** 1/***
2 2
3MochiKit.DOM 1.5 3MochiKit.DOM 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('DOM', '1.5', ['Base']); 11MochiKit.Base.module(MochiKit, 'DOM', '1.5', ['Base']);
12 12
13MochiKit.Base.update(MochiKit.DOM, { 13MochiKit.Base.update(MochiKit.DOM, {
14 14
15 /** @id MochiKit.DOM.currentWindow */ 15 /** @id MochiKit.DOM.currentWindow */
16 currentWindow: function () { 16 currentWindow: function () {
17 return MochiKit.DOM._window; 17 return MochiKit.DOM._window;
18 }, 18 },
19 19
20 /** @id MochiKit.DOM.currentDocument */ 20 /** @id MochiKit.DOM.currentDocument */
21 currentDocument: function () { 21 currentDocument: function () {
22 return MochiKit.DOM._document; 22 return MochiKit.DOM._document;
23 }, 23 },
24 24
25 /** @id MochiKit.DOM.withWindow */ 25 /** @id MochiKit.DOM.withWindow */
26 withWindow: function (win, func) { 26 withWindow: function (win, func) {
27 var self = MochiKit.DOM; 27 var self = MochiKit.DOM;
28 var oldDoc = self._document; 28 var oldDoc = self._document;
29 var oldWin = self._window; 29 var oldWin = self._window;
30 var rval; 30 var rval;
31 try { 31 try {
32 self._window = win; 32 self._window = win;
33 self._document = win.document; 33 self._document = win.document;
34 rval = func(); 34 rval = func();
35 } catch (e) { 35 } catch (e) {
36 self._window = oldWin; 36 self._window = oldWin;
37 self._document = oldDoc; 37 self._document = oldDoc;
38 throw e; 38 throw e;
39 } 39 }
40 self._window = oldWin; 40 self._window = oldWin;
41 self._document = oldDoc; 41 self._document = oldDoc;
42 return rval; 42 return rval;
43 }, 43 },
44 44
45 /** @id MochiKit.DOM.formContents */ 45 /** @id MochiKit.DOM.formContents */
46 formContents: function (elem/* = document.body */) { 46 formContents: function (elem/* = document.body */) {
47 var names = []; 47 var names = [];
48 var values = []; 48 var values = [];
49 var m = MochiKit.Base; 49 var m = MochiKit.Base;
50 var self = MochiKit.DOM; 50 var self = MochiKit.DOM;
51 if (typeof(elem) == "undefined" || elem === null) { 51 if (typeof(elem) == "undefined" || elem === null) {
52 elem = self._document.body; 52 elem = self._document.body;
53 } else { 53 } else {
54 elem = self.getElement(elem); 54 elem = self.getElement(elem);
55 } 55 }
56 m.nodeWalk(elem, function (elem) { 56 m.nodeWalk(elem, function (elem) {
57 var name = elem.name; 57 var name = elem.name;
58 if (m.isNotEmpty(name)) { 58 if (m.isNotEmpty(name)) {
59 var tagName = elem.tagName.toUpperCase(); 59 var tagName = elem.tagName.toUpperCase();
60 if (tagName === "INPUT" 60 if (tagName === "INPUT"
61 && (elem.type == "radio" || elem.type == "checkbox") 61 && (elem.type == "radio" || elem.type == "checkbox")
62 && !elem.checked 62 && !elem.checked
63 ) { 63 ) {
64 return null; 64 return null;
65 } 65 }
66 if (tagName === "SELECT") { 66 if (tagName === "SELECT") {
67 if (elem.type == "select-one") { 67 if (elem.type == "select-one") {
68 if (elem.selectedIndex >= 0) { 68 if (elem.selectedIndex >= 0) {
69 var opt = elem.options[elem.selectedIndex]; 69 var opt = elem.options[elem.selectedIndex];
70 var v = opt.value; 70 var v = opt.value;
71 if (!v) { 71 if (!v) {
72 var h = opt.outerHTML; 72 var h = opt.outerHTML;
73 // internet explorer sure does suck. 73 // internet explorer sure does suck.
74 if (h && !h.match(/^[^>]+\svalue\s*=/i)) { 74 if (h && !h.match(/^[^>]+\svalue\s*=/i)) {
75 v = opt.text; 75 v = opt.text;
@@ -236,183 +236,183 @@ MochiKit.Base.update(MochiKit.DOM, {
236 if (typeof(node) == 'undefined' || node === null) { 236 if (typeof(node) == 'undefined' || node === null) {
237 return false; 237 return false;
238 } 238 }
239 while (node != null && node !== self._document) { 239 while (node != null && node !== self._document) {
240 if (node === maybeparent) { 240 if (node === maybeparent) {
241 return true; 241 return true;
242 } 242 }
243 node = node.parentNode; 243 node = node.parentNode;
244 } 244 }
245 return false; 245 return false;
246 }, 246 },
247 247
248 /** @id MochiKit.DOM.setNodeAttribute */ 248 /** @id MochiKit.DOM.setNodeAttribute */
249 setNodeAttribute: function (node, attr, value) { 249 setNodeAttribute: function (node, attr, value) {
250 var o = {}; 250 var o = {};
251 o[attr] = value; 251 o[attr] = value;
252 try { 252 try {
253 return MochiKit.DOM.updateNodeAttributes(node, o); 253 return MochiKit.DOM.updateNodeAttributes(node, o);
254 } catch (e) { 254 } catch (e) {
255 // pass 255 // pass
256 } 256 }
257 return null; 257 return null;
258 }, 258 },
259 259
260 /** @id MochiKit.DOM.getNodeAttribute */ 260 /** @id MochiKit.DOM.getNodeAttribute */
261 getNodeAttribute: function (node, attr) { 261 getNodeAttribute: function (node, attr) {
262 var self = MochiKit.DOM; 262 var self = MochiKit.DOM;
263 var rename = self.attributeArray.renames[attr]; 263 var rename = self.attributeArray.renames[attr];
264 var ignoreValue = self.attributeArray.ignoreAttr[attr]; 264 var ignoreValue = self.attributeArray.ignoreAttr[attr];
265 node = self.getElement(node); 265 node = self.getElement(node);
266 try { 266 try {
267 if (rename) { 267 if (rename) {
268 return node[rename]; 268 return node[rename];
269 } 269 }
270 var value = node.getAttribute(attr); 270 var value = node.getAttribute(attr);
271 if (value != ignoreValue) { 271 if (value != ignoreValue) {
272 return value; 272 return value;
273 } 273 }
274 } catch (e) { 274 } catch (e) {
275 // pass 275 // pass
276 } 276 }
277 return null; 277 return null;
278 }, 278 },
279 279
280 /** @id MochiKit.DOM.removeNodeAttribute */ 280 /** @id MochiKit.DOM.removeNodeAttribute */
281 removeNodeAttribute: function (node, attr) { 281 removeNodeAttribute: function (node, attr) {
282 var self = MochiKit.DOM; 282 var self = MochiKit.DOM;
283 var rename = self.attributeArray.renames[attr]; 283 var rename = self.attributeArray.renames[attr];
284 node = self.getElement(node); 284 node = self.getElement(node);
285 try { 285 try {
286 if (rename) { 286 if (rename) {
287 return node[rename]; 287 return node[rename];
288 } 288 }
289 return node.removeAttribute(attr); 289 return node.removeAttribute(attr);
290 } catch (e) { 290 } catch (e) {
291 // pass 291 // pass
292 } 292 }
293 return null; 293 return null;
294 }, 294 },
295 295
296 /** @id MochiKit.DOM.updateNodeAttributes */ 296 /** @id MochiKit.DOM.updateNodeAttributes */
297 updateNodeAttributes: function (node, attrs) { 297 updateNodeAttributes: function (node, attrs) {
298 var elem = node; 298 var elem = node;
299 var self = MochiKit.DOM; 299 var self = MochiKit.DOM;
300 var base = MochiKit.Base;
300 if (typeof(node) == 'string') { 301 if (typeof(node) == 'string') {
301 elem = self.getElement(node); 302 elem = self.getElement(node);
302 } 303 }
303 if (attrs) { 304 if (attrs) {
304 var updatetree = MochiKit.Base.updatetree;
305 if (self.attributeArray.compliant) { 305 if (self.attributeArray.compliant) {
306 // not IE, good. 306 // not IE, good.
307 for (var k in attrs) { 307 for (var k in attrs) {
308 var v = attrs[k]; 308 var v = attrs[k];
309 if (typeof(v) == 'object' && typeof(elem[k]) == 'object') { 309 if (typeof(v) == 'object' && typeof(elem[k]) == 'object') {
310 if (k == "style" && MochiKit.Style) { 310 if (k == "style" && MochiKit.Style) {
311 MochiKit.Style.setStyle(elem, v); 311 MochiKit.Style.setStyle(elem, v);
312 } else { 312 } else {
313 updatetree(elem[k], v); 313 base.updatetree(elem[k], v);
314 } 314 }
315 } else if (k.substring(0, 2) == "on") { 315 } else if (k.substring(0, 2) == "on") {
316 if (typeof(v) == "string") { 316 if (typeof(v) == "string") {
317 v = new Function(v); 317 v = new Function(v);
318 } 318 }
319 elem[k] = v; 319 elem[k] = v;
320 } else { 320 } else {
321 elem.setAttribute(k, v); 321 elem.setAttribute(k, v);
322 } 322 }
323 if (typeof(elem[k]) == "string" && elem[k] != v) { 323 if (base.isValue(elem[k]) && elem[k] != v) {
324 // Also set property for weird attributes (see #302) 324 // Also set property for weird attributes (see #302 & #335)
325 elem[k] = v; 325 elem[k] = v;
326 } 326 }
327 } 327 }
328 } else { 328 } else {
329 // IE is insane in the membrane 329 // IE is insane in the membrane
330 var renames = self.attributeArray.renames; 330 var renames = self.attributeArray.renames;
331 for (var k in attrs) { 331 for (var k in attrs) {
332 v = attrs[k]; 332 v = attrs[k];
333 var renamed = renames[k]; 333 var renamed = renames[k];
334 if (k == "style" && typeof(v) == "string") { 334 if (k == "style" && typeof(v) == "string") {
335 elem.style.cssText = v; 335 elem.style.cssText = v;
336 } else if (typeof(renamed) == "string") { 336 } else if (typeof(renamed) == "string") {
337 elem[renamed] = v; 337 elem[renamed] = v;
338 } else if (typeof(elem[k]) == 'object' 338 } else if (typeof(elem[k]) == 'object'
339 && typeof(v) == 'object') { 339 && typeof(v) == 'object') {
340 if (k == "style" && MochiKit.Style) { 340 if (k == "style" && MochiKit.Style) {
341 MochiKit.Style.setStyle(elem, v); 341 MochiKit.Style.setStyle(elem, v);
342 } else { 342 } else {
343 updatetree(elem[k], v); 343 base.updatetree(elem[k], v);
344 } 344 }
345 } else if (k.substring(0, 2) == "on") { 345 } else if (k.substring(0, 2) == "on") {
346 if (typeof(v) == "string") { 346 if (typeof(v) == "string") {
347 v = new Function(v); 347 v = new Function(v);
348 } 348 }
349 elem[k] = v; 349 elem[k] = v;
350 } else { 350 } else {
351 elem.setAttribute(k, v); 351 elem.setAttribute(k, v);
352 } 352 }
353 if (typeof(elem[k]) == "string" && elem[k] != v) { 353 if (base.isValue(elem[k]) && elem[k] != v) {
354 // Also set property for weird attributes (see #302) 354 // Also set property for weird attributes (see #302 & #335)
355 elem[k] = v; 355 elem[k] = v;
356 } 356 }
357 } 357 }
358 } 358 }
359 } 359 }
360 return elem; 360 return elem;
361 }, 361 },
362 362
363 /** @id MochiKit.DOM.appendChildNodes */ 363 /** @id MochiKit.DOM.appendChildNodes */
364 appendChildNodes: function (node/*, nodes...*/) { 364 appendChildNodes: function (node/*, nodes...*/) {
365 var elem = node; 365 var elem = node;
366 var self = MochiKit.DOM; 366 var self = MochiKit.DOM;
367 if (typeof(node) == 'string') { 367 if (typeof(node) == 'string') {
368 elem = self.getElement(node); 368 elem = self.getElement(node);
369 } 369 }
370 var nodeStack = [ 370 var nodeStack = [
371 self.coerceToDOM( 371 self.coerceToDOM(
372 MochiKit.Base.extend(null, arguments, 1), 372 MochiKit.Base.extend(null, arguments, 1),
373 elem 373 elem
374 ) 374 )
375 ]; 375 ];
376 var concat = MochiKit.Base.concat; 376 var concat = MochiKit.Base.concat;
377 while (nodeStack.length) { 377 while (nodeStack.length) {
378 var n = nodeStack.shift(); 378 var n = nodeStack.shift();
379 if (typeof(n) == 'undefined' || n === null) { 379 if (typeof(n) == 'undefined' || n === null) {
380 // pass 380 // pass
381 } else if (typeof(n.nodeType) == 'number') { 381 } else if (typeof(n.nodeType) == 'number') {
382 elem.appendChild(n); 382 elem.appendChild(n);
383 } else { 383 } else {
384 nodeStack = concat(n, nodeStack); 384 nodeStack = concat(n, nodeStack);
385 } 385 }
386 } 386 }
387 return elem; 387 return elem;
388 }, 388 },
389 389
390 390
391 /** @id MochiKit.DOM.insertSiblingNodesBefore */ 391 /** @id MochiKit.DOM.insertSiblingNodesBefore */
392 insertSiblingNodesBefore: function (node/*, nodes...*/) { 392 insertSiblingNodesBefore: function (node/*, nodes...*/) {
393 var elem = node; 393 var elem = node;
394 var self = MochiKit.DOM; 394 var self = MochiKit.DOM;
395 if (typeof(node) == 'string') { 395 if (typeof(node) == 'string') {
396 elem = self.getElement(node); 396 elem = self.getElement(node);
397 } 397 }
398 var nodeStack = [ 398 var nodeStack = [
399 self.coerceToDOM( 399 self.coerceToDOM(
400 MochiKit.Base.extend(null, arguments, 1), 400 MochiKit.Base.extend(null, arguments, 1),
401 elem 401 elem
402 ) 402 )
403 ]; 403 ];
404 var parentnode = elem.parentNode; 404 var parentnode = elem.parentNode;
405 var concat = MochiKit.Base.concat; 405 var concat = MochiKit.Base.concat;
406 while (nodeStack.length) { 406 while (nodeStack.length) {
407 var n = nodeStack.shift(); 407 var n = nodeStack.shift();
408 if (typeof(n) == 'undefined' || n === null) { 408 if (typeof(n) == 'undefined' || n === null) {
409 // pass 409 // pass
410 } else if (typeof(n.nodeType) == 'number') { 410 } else if (typeof(n.nodeType) == 'number') {
411 parentnode.insertBefore(n, elem); 411 parentnode.insertBefore(n, elem);
412 } else { 412 } else {
413 nodeStack = concat(n, nodeStack); 413 nodeStack = concat(n, nodeStack);
414 } 414 }
415 } 415 }
416 return parentnode; 416 return parentnode;
417 }, 417 },
418 418
@@ -929,216 +929,251 @@ MochiKit.Base.update(MochiKit.DOM, {
929 if (elem) { 929 if (elem) {
930 elem = elem.parentNode; 930 elem = elem.parentNode;
931 } 931 }
932 while (elem && elem.tagName) { 932 while (elem && elem.tagName) {
933 var curTagName = elem.tagName.toUpperCase(); 933 var curTagName = elem.tagName.toUpperCase();
934 if ((tagName === '*' || tagName == curTagName) && 934 if ((tagName === '*' || tagName == curTagName) &&
935 (className === null || self.hasElementClass(elem, className))) { 935 (className === null || self.hasElementClass(elem, className))) {
936 return elem; 936 return elem;
937 } 937 }
938 elem = elem.parentNode; 938 elem = elem.parentNode;
939 } 939 }
940 return null; 940 return null;
941 }, 941 },
942 942
943 __new__: function (win) { 943 __new__: function (win) {
944 944
945 var m = MochiKit.Base; 945 var m = MochiKit.Base;
946 if (typeof(document) != "undefined") { 946 if (typeof(document) != "undefined") {
947 this._document = document; 947 this._document = document;
948 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; 948 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
949 this._xhtml = (document.documentElement && 949 this._xhtml = (document.documentElement &&
950 document.createElementNS && 950 document.createElementNS &&
951 document.documentElement.namespaceURI === kXULNSURI); 951 document.documentElement.namespaceURI === kXULNSURI);
952 } else if (MochiKit.MockDOM) { 952 } else if (MochiKit.MockDOM) {
953 this._document = MochiKit.MockDOM.document; 953 this._document = MochiKit.MockDOM.document;
954 } 954 }
955 this._window = win; 955 this._window = win;
956 956
957 this.domConverters = new m.AdapterRegistry(); 957 this.domConverters = new m.AdapterRegistry();
958 958
959 var __tmpElement = this._document.createElement("span"); 959 var __tmpElement = this._document.createElement("span");
960 var attributeArray; 960 var attributeArray;
961 if (__tmpElement && __tmpElement.attributes && 961 if (__tmpElement && __tmpElement.attributes &&
962 __tmpElement.attributes.length > 0) { 962 __tmpElement.attributes.length > 0) {
963 // for braindead browsers (IE) that insert extra junk 963 // for braindead browsers (IE) that insert extra junk
964 var filter = m.filter; 964 var filter = m.filter;
965 attributeArray = function (node) { 965 attributeArray = function (node) {
966 /*** 966 /***
967 967
968 Return an array of attributes for a given node, 968 Return an array of attributes for a given node,
969 filtering out attributes that don't belong for 969 filtering out attributes that don't belong for
970 that are inserted by "Certain Browsers". 970 that are inserted by "Certain Browsers".
971 971
972 ***/ 972 ***/
973 return filter(attributeArray.ignoreAttrFilter, node.attributes); 973 return filter(attributeArray.ignoreAttrFilter, node.attributes);
974 }; 974 };
975 attributeArray.ignoreAttr = {}; 975 attributeArray.ignoreAttr = {};
976 var attrs = __tmpElement.attributes; 976 var attrs = __tmpElement.attributes;
977 var ignoreAttr = attributeArray.ignoreAttr; 977 var ignoreAttr = attributeArray.ignoreAttr;
978 for (var i = 0; i < attrs.length; i++) { 978 for (var i = 0; i < attrs.length; i++) {
979 var a = attrs[i]; 979 var a = attrs[i];
980 ignoreAttr[a.name] = a.value; 980 ignoreAttr[a.name] = a.value;
981 } 981 }
982 attributeArray.ignoreAttrFilter = function (a) { 982 attributeArray.ignoreAttrFilter = function (a) {
983 return (attributeArray.ignoreAttr[a.name] != a.value); 983 return (attributeArray.ignoreAttr[a.name] != a.value);
984 }; 984 };
985 attributeArray.compliant = false; 985 attributeArray.compliant = false;
986 attributeArray.renames = { 986 attributeArray.renames = {
987 "class": "className", 987 "class": "className",
988 "checked": "defaultChecked", 988 "checked": "defaultChecked",
989 "usemap": "useMap", 989 "usemap": "useMap",
990 "for": "htmlFor", 990 "for": "htmlFor",
991 "readonly": "readOnly", 991 "readonly": "readOnly",
992 "colspan": "colSpan", 992 "colspan": "colSpan",
993 "rowspan": "rowSpan",
993 "bgcolor": "bgColor", 994 "bgcolor": "bgColor",
994 "cellspacing": "cellSpacing", 995 "cellspacing": "cellSpacing",
995 "cellpadding": "cellPadding" 996 "cellpadding": "cellPadding"
996 }; 997 };
997 } else { 998 } else {
998 attributeArray = function (node) { 999 attributeArray = function (node) {
999 return node.attributes; 1000 return node.attributes;
1000 }; 1001 };
1001 attributeArray.compliant = true; 1002 attributeArray.compliant = true;
1002 attributeArray.ignoreAttr = {}; 1003 attributeArray.ignoreAttr = {};
1003 attributeArray.renames = {}; 1004 attributeArray.renames = {};
1004 } 1005 }
1005 attributeArray.__export__ = false; 1006 attributeArray.__export__ = false;
1006 this.attributeArray = attributeArray; 1007 this.attributeArray = attributeArray;
1007 1008
1008 // Backwards compatibility aliases 1009 // Backwards compatibility aliases
1009 /** @id MochiKit.DOM.computedStyle */ 1010 /** @id MochiKit.DOM.computedStyle */
1010 m._deprecated(this, 'computedStyle', 'MochiKit.Style.getStyle', '1.4'); 1011 m._deprecated(this, 'computedStyle', 'MochiKit.Style.getStyle', '1.4', true);
1011 /** @id MochiKit.DOM.elementDimensions */ 1012 /** @id MochiKit.DOM.elementDimensions */
1012 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4'); 1013 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4');
1013 /** @id MochiKit.DOM.elementPosition */ 1014 /** @id MochiKit.DOM.elementPosition */
1014 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.4'); 1015 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.4');
1015 /** @id MochiKit.DOM.getViewportDimensions */ 1016 /** @id MochiKit.DOM.getViewportDimensions */
1016 m._deprecated(this, 'getViewportDimensions', 'MochiKit.Style.getViewportDimensions', '1.4'); 1017 m._deprecated(this, 'getViewportDimensions', 'MochiKit.Style.getViewportDimensions', '1.4');
1017 /** @id MochiKit.DOM.hideElement */ 1018 /** @id MochiKit.DOM.hideElement */
1018 m._deprecated(this, 'hideElement', 'MochiKit.Style.hideElement', '1.4'); 1019 m._deprecated(this, 'hideElement', 'MochiKit.Style.hideElement', '1.4');
1019 /** @id MochiKit.DOM.makeClipping */ 1020 /** @id MochiKit.DOM.makeClipping */
1020 m._deprecated(this, 'makeClipping', 'MochiKit.Style.makeClipping', '1.4.1'); 1021 m._deprecated(this, 'makeClipping', 'MochiKit.Style.makeClipping', '1.4.1');
1021 /** @id MochiKit.DOM.makePositioned */ 1022 /** @id MochiKit.DOM.makePositioned */
1022 m._deprecated(this, 'makePositioned', 'MochiKit.Style.makePositioned', '1.4.1'); 1023 m._deprecated(this, 'makePositioned', 'MochiKit.Style.makePositioned', '1.4.1');
1023 /** @id MochiKit.DOM.setElementDimensions */ 1024 /** @id MochiKit.DOM.setElementDimensions */
1024 m._deprecated(this, 'setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4'); 1025 m._deprecated(this, 'setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4');
1025 /** @id MochiKit.DOM.setElementPosition */ 1026 /** @id MochiKit.DOM.setElementPosition */
1026 m._deprecated(this, 'setElementPosition', 'MochiKit.Style.setElementPosition', '1.4'); 1027 m._deprecated(this, 'setElementPosition', 'MochiKit.Style.setElementPosition', '1.4');
1027 /** @id MochiKit.DOM.setDisplayForElement */ 1028 /** @id MochiKit.DOM.setDisplayForElement */
1028 m._deprecated(this, 'setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4'); 1029 m._deprecated(this, 'setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4');
1029 /** @id MochiKit.DOM.setOpacity */ 1030 /** @id MochiKit.DOM.setOpacity */
1030 m._deprecated(this, 'setOpacity', 'MochiKit.Style.setOpacity', '1.4'); 1031 m._deprecated(this, 'setOpacity', 'MochiKit.Style.setOpacity', '1.4');
1031 /** @id MochiKit.DOM.showElement */ 1032 /** @id MochiKit.DOM.showElement */
1032 m._deprecated(this, 'showElement', 'MochiKit.Style.showElement', '1.4'); 1033 m._deprecated(this, 'showElement', 'MochiKit.Style.showElement', '1.4');
1033 /** @id MochiKit.DOM.undoClipping */ 1034 /** @id MochiKit.DOM.undoClipping */
1034 m._deprecated(this, 'undoClipping', 'MochiKit.Style.undoClipping', '1.4.1'); 1035 m._deprecated(this, 'undoClipping', 'MochiKit.Style.undoClipping', '1.4.1');
1035 /** @id MochiKit.DOM.undoPositioned */ 1036 /** @id MochiKit.DOM.undoPositioned */
1036 m._deprecated(this, 'undoPositioned', 'MochiKit.Style.undoPositioned', '1.4.1'); 1037 m._deprecated(this, 'undoPositioned', 'MochiKit.Style.undoPositioned', '1.4.1');
1037 /** @id MochiKit.DOM.Coordinates */ 1038 /** @id MochiKit.DOM.Coordinates */
1038 m._deprecated(this, 'Coordinates', 'MochiKit.Style.Coordinates', '1.4'); 1039 m._deprecated(this, 'Coordinates', 'MochiKit.Style.Coordinates', '1.4');
1039 /** @id MochiKit.DOM.Dimensions */ 1040 /** @id MochiKit.DOM.Dimensions */
1040 m._deprecated(this, 'Dimensions', 'MochiKit.Style.Dimensions', '1.4'); 1041 m._deprecated(this, 'Dimensions', 'MochiKit.Style.Dimensions', '1.4');
1041 1042
1042 // shorthand for createDOM syntax 1043 // shorthand for createDOM syntax
1043 var createDOMFunc = this.createDOMFunc; 1044 var createDOMFunc = this.createDOMFunc;
1044 /** @id MochiKit.DOM.UL */
1045 this.UL = createDOMFunc("ul");
1046 /** @id MochiKit.DOM.OL */
1047 this.OL = createDOMFunc("ol");
1048 /** @id MochiKit.DOM.LI */
1049 this.LI = createDOMFunc("li");
1050 /** @id MochiKit.DOM.DL */
1051 this.DL = createDOMFunc("dl");
1052 /** @id MochiKit.DOM.DT */
1053 this.DT = createDOMFunc("dt");
1054 /** @id MochiKit.DOM.DD */
1055 this.DD = createDOMFunc("dd");
1056 /** @id MochiKit.DOM.TD */
1057 this.TD = createDOMFunc("td");
1058 /** @id MochiKit.DOM.TR */
1059 this.TR = createDOMFunc("tr");
1060 /** @id MochiKit.DOM.TBODY */
1061 this.TBODY = createDOMFunc("tbody");
1062 /** @id MochiKit.DOM.THEAD */
1063 this.THEAD = createDOMFunc("thead");
1064 /** @id MochiKit.DOM.TFOOT */
1065 this.TFOOT = createDOMFunc("tfoot");
1066 /** @id MochiKit.DOM.TABLE */
1067 this.TABLE = createDOMFunc("table");
1068 /** @id MochiKit.DOM.TH */
1069 this.TH = createDOMFunc("th");
1070 /** @id MochiKit.DOM.INPUT */
1071 this.INPUT = createDOMFunc("input");
1072 /** @id MochiKit.DOM.SPAN */
1073 this.SPAN = createDOMFunc("span");
1074 /** @id MochiKit.DOM.A */ 1045 /** @id MochiKit.DOM.A */
1075 this.A = createDOMFunc("a"); 1046 this.A = createDOMFunc("a");
1076 /** @id MochiKit.DOM.DIV */ 1047 /** @id MochiKit.DOM.ARTICLE */
1077 this.DIV = createDOMFunc("div"); 1048 this.ARTICLE = createDOMFunc("article");
1078 /** @id MochiKit.DOM.IMG */ 1049 /** @id MochiKit.DOM.ASIDE */
1079 this.IMG = createDOMFunc("img"); 1050 this.ASIDE = createDOMFunc("aside");
1051 /** @id MochiKit.DOM.BR */
1052 this.BR = createDOMFunc("br");
1080 /** @id MochiKit.DOM.BUTTON */ 1053 /** @id MochiKit.DOM.BUTTON */
1081 this.BUTTON = createDOMFunc("button"); 1054 this.BUTTON = createDOMFunc("button");
1082 /** @id MochiKit.DOM.TT */ 1055 /** @id MochiKit.DOM.CANVAS */
1083 this.TT = createDOMFunc("tt"); 1056 this.CANVAS = createDOMFunc("canvas");
1084 /** @id MochiKit.DOM.PRE */ 1057 /** @id MochiKit.DOM.CAPTION */
1085 this.PRE = createDOMFunc("pre"); 1058 this.CAPTION = createDOMFunc("caption");
1059 /** @id MochiKit.DOM.DD */
1060 this.DD = createDOMFunc("dd");
1061 /** @id MochiKit.DOM.DIV */
1062 this.DIV = createDOMFunc("div");
1063 /** @id MochiKit.DOM.DL */
1064 this.DL = createDOMFunc("dl");
1065 /** @id MochiKit.DOM.DT */
1066 this.DT = createDOMFunc("dt");
1067 /** @id MochiKit.DOM.FIELDSET */
1068 this.FIELDSET = createDOMFunc("fieldset");
1069 /** @id MochiKit.DOM.FIGURE */
1070 this.FIGURE = createDOMFunc("figure");
1071 /** @id MochiKit.DOM.FIGCAPTION */
1072 this.FIGCAPTION = createDOMFunc("figcaption");
1073 /** @id MochiKit.DOM.FOOTER */
1074 this.FOOTER = createDOMFunc("footer");
1075 /** @id MochiKit.DOM.FORM */
1076 this.FORM = createDOMFunc("form");
1086 /** @id MochiKit.DOM.H1 */ 1077 /** @id MochiKit.DOM.H1 */
1087 this.H1 = createDOMFunc("h1"); 1078 this.H1 = createDOMFunc("h1");
1088 /** @id MochiKit.DOM.H2 */ 1079 /** @id MochiKit.DOM.H2 */
1089 this.H2 = createDOMFunc("h2"); 1080 this.H2 = createDOMFunc("h2");
1090 /** @id MochiKit.DOM.H3 */ 1081 /** @id MochiKit.DOM.H3 */
1091 this.H3 = createDOMFunc("h3"); 1082 this.H3 = createDOMFunc("h3");
1092 /** @id MochiKit.DOM.H4 */ 1083 /** @id MochiKit.DOM.H4 */
1093 this.H4 = createDOMFunc("h4"); 1084 this.H4 = createDOMFunc("h4");
1094 /** @id MochiKit.DOM.H5 */ 1085 /** @id MochiKit.DOM.H5 */
1095 this.H5 = createDOMFunc("h5"); 1086 this.H5 = createDOMFunc("h5");
1096 /** @id MochiKit.DOM.H6 */ 1087 /** @id MochiKit.DOM.H6 */
1097 this.H6 = createDOMFunc("h6"); 1088 this.H6 = createDOMFunc("h6");
1098 /** @id MochiKit.DOM.BR */ 1089 /** @id MochiKit.DOM.HEADER */
1099 this.BR = createDOMFunc("br"); 1090 this.HEADER = createDOMFunc("header");
1091 /** @id MochiKit.DOM.HGROUP */
1092 this.HGROUP = createDOMFunc("hgroup");
1100 /** @id MochiKit.DOM.HR */ 1093 /** @id MochiKit.DOM.HR */
1101 this.HR = createDOMFunc("hr"); 1094 this.HR = createDOMFunc("hr");
1095 /** @id MochiKit.DOM.IFRAME */
1096 this.IFRAME = createDOMFunc("iframe");
1097 /** @id MochiKit.DOM.IMG */
1098 this.IMG = createDOMFunc("img");
1099 /** @id MochiKit.DOM.INPUT */
1100 this.INPUT = createDOMFunc("input");
1102 /** @id MochiKit.DOM.LABEL */ 1101 /** @id MochiKit.DOM.LABEL */
1103 this.LABEL = createDOMFunc("label"); 1102 this.LABEL = createDOMFunc("label");
1104 /** @id MochiKit.DOM.TEXTAREA */ 1103 /** @id MochiKit.DOM.LEGEND */
1105 this.TEXTAREA = createDOMFunc("textarea"); 1104 this.LEGEND = createDOMFunc("legend");
1106 /** @id MochiKit.DOM.FORM */ 1105 /** @id MochiKit.DOM.LI */
1107 this.FORM = createDOMFunc("form"); 1106 this.LI = createDOMFunc("li");
1107 /** @id MochiKit.DOM.LINK */
1108 this.LINK = createDOMFunc("link");
1109 /** @id MochiKit.DOM.MARK */
1110 this.MARK = createDOMFunc("mark");
1111 /** @id MochiKit.DOM.METER */
1112 this.METER = createDOMFunc("meter");
1113 /** @id MochiKit.DOM.NAV */
1114 this.NAV = createDOMFunc("nav");
1115 /** @id MochiKit.DOM.OL */
1116 this.OL = createDOMFunc("ol");
1117 /** @id MochiKit.DOM.OPTGROUP */
1118 this.OPTGROUP = createDOMFunc("optgroup");
1119 /** @id MochiKit.DOM.OPTION */
1120 this.OPTION = createDOMFunc("option");
1108 /** @id MochiKit.DOM.P */ 1121 /** @id MochiKit.DOM.P */
1109 this.P = createDOMFunc("p"); 1122 this.P = createDOMFunc("p");
1123 /** @id MochiKit.DOM.PRE */
1124 this.PRE = createDOMFunc("pre");
1125 /** @id MochiKit.DOM.PROGRESS */
1126 this.PROGRESS = createDOMFunc("progress");
1127 /** @id MochiKit.DOM.SCRIPT */
1128 this.SCRIPT = createDOMFunc("script");
1129 /** @id MochiKit.DOM.SECTION */
1130 this.SECTION = createDOMFunc("section");
1110 /** @id MochiKit.DOM.SELECT */ 1131 /** @id MochiKit.DOM.SELECT */
1111 this.SELECT = createDOMFunc("select"); 1132 this.SELECT = createDOMFunc("select");
1112 /** @id MochiKit.DOM.OPTION */ 1133 /** @id MochiKit.DOM.SPAN */
1113 this.OPTION = createDOMFunc("option"); 1134 this.SPAN = createDOMFunc("span");
1114 /** @id MochiKit.DOM.OPTGROUP */
1115 this.OPTGROUP = createDOMFunc("optgroup");
1116 /** @id MochiKit.DOM.LEGEND */
1117 this.LEGEND = createDOMFunc("legend");
1118 /** @id MochiKit.DOM.FIELDSET */
1119 this.FIELDSET = createDOMFunc("fieldset");
1120 /** @id MochiKit.DOM.STRONG */ 1135 /** @id MochiKit.DOM.STRONG */
1121 this.STRONG = createDOMFunc("strong"); 1136 this.STRONG = createDOMFunc("strong");
1122 /** @id MochiKit.DOM.CANVAS */ 1137 /** @id MochiKit.DOM.STYLE */
1123 this.CANVAS = createDOMFunc("canvas"); 1138 this.STYLE = createDOMFunc("style");
1124 1139 /** @id MochiKit.DOM.TABLE */
1140 this.TABLE = createDOMFunc("table");
1141 /** @id MochiKit.DOM.TBODY */
1142 this.TBODY = createDOMFunc("tbody");
1143 /** @id MochiKit.DOM.TD */
1144 this.TD = createDOMFunc("td");
1145 /** @id MochiKit.DOM.TEXTAREA */
1146 this.TEXTAREA = createDOMFunc("textarea");
1147 /** @id MochiKit.DOM.TFOOT */
1148 this.TFOOT = createDOMFunc("tfoot");
1149 /** @id MochiKit.DOM.TH */
1150 this.TH = createDOMFunc("th");
1151 /** @id MochiKit.DOM.THEAD */
1152 this.THEAD = createDOMFunc("thead");
1153 /** @id MochiKit.DOM.TR */
1154 this.TR = createDOMFunc("tr");
1155 /** @id MochiKit.DOM.TT */
1156 this.TT = createDOMFunc("tt");
1157 /** @id MochiKit.DOM.UL */
1158 this.UL = createDOMFunc("ul");
1159 /** @id MochiKit.DOM.NBSP */
1160 this.NBSP = "\u00a0";
1125 /** @id MochiKit.DOM.$ */ 1161 /** @id MochiKit.DOM.$ */
1126 this.$ = this.getElement; 1162 this.$ = this.getElement;
1127 1163
1128 m.nameFunctions(this); 1164 m.nameFunctions(this);
1129
1130 } 1165 }
1131}); 1166});
1132 1167
1133 1168
1134MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window)); 1169MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window));
1135 1170
1136// 1171//
1137// XXX: Internet Explorer blows 1172// XXX: Internet Explorer blows
1138// 1173//
1139if (MochiKit.__export__) { 1174if (MochiKit.__export__) {
1140 withWindow = MochiKit.DOM.withWindow; 1175 withWindow = MochiKit.DOM.withWindow;
1141 withDocument = MochiKit.DOM.withDocument; 1176 withDocument = MochiKit.DOM.withDocument;
1142} 1177}
1143 1178
1144MochiKit.Base._exportSymbols(this, MochiKit.DOM); 1179MochiKit.Base._exportSymbols(this, MochiKit.DOM);
diff --git a/frontend/gamma/js/MochiKit/DateTime.js b/frontend/gamma/js/MochiKit/DateTime.js
index c7b2d25..658084c 100644
--- a/frontend/gamma/js/MochiKit/DateTime.js
+++ b/frontend/gamma/js/MochiKit/DateTime.js
@@ -1,173 +1,176 @@
1/*** 1/***
2 2
3MochiKit.DateTime 1.5 3MochiKit.DateTime 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('DateTime', '1.5', ['Base']); 11MochiKit.Base.module(MochiKit, 'DateTime', '1.5', ['Base']);
12 12
13/** @id MochiKit.DateTime.isoDate */ 13/** @id MochiKit.DateTime.isoDate */
14MochiKit.DateTime.isoDate = function (str) { 14MochiKit.DateTime.isoDate = function (str) {
15 str = str + ""; 15 str = str + "";
16 if (typeof(str) != "string" || str.length === 0) { 16 if (typeof(str) != "string" || str.length === 0) {
17 return null; 17 return null;
18 } 18 }
19 var iso = str.split('-'); 19 var iso = str.split('-');
20 if (iso.length === 0) { 20 if (iso.length === 0) {
21 return null; 21 return null;
22 } 22 }
23 var date = new Date(iso[0], iso[1] - 1, iso[2]); 23 var date = new Date(parseInt(iso[0], 10), parseInt(iso[1], 10) - 1, parseInt(iso[2], 10));
24 date.setFullYear(iso[0]); 24 date.setFullYear(iso[0]);
25 date.setMonth(iso[1] - 1); 25 date.setMonth(iso[1] - 1);
26 date.setDate(iso[2]); 26 date.setDate(iso[2]);
27 return date; 27 return date;
28}; 28};
29 29
30MochiKit.DateTime._isoRegexp = /(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/; 30MochiKit.DateTime._isoRegexp = /(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/;
31 31
32/** @id MochiKit.DateTime.isoTimestamp */ 32/** @id MochiKit.DateTime.isoTimestamp */
33MochiKit.DateTime.isoTimestamp = function (str) { 33MochiKit.DateTime.isoTimestamp = function (str) {
34 str = str + ""; 34 str = str + "";
35 if (typeof(str) != "string" || str.length === 0) { 35 if (typeof(str) != "string" || str.length === 0) {
36 return null; 36 return null;
37 } 37 }
38 var res = str.match(MochiKit.DateTime._isoRegexp); 38 var res = str.match(MochiKit.DateTime._isoRegexp);
39 if (typeof(res) == "undefined" || res === null) { 39 if (typeof(res) == "undefined" || res === null) {
40 return null; 40 return null;
41 } 41 }
42 var year, month, day, hour, min, sec, msec; 42 var year, month, day, hour, min, sec, msec;
43 year = parseInt(res[1], 10); 43 year = parseInt(res[1], 10);
44 if (typeof(res[2]) == "undefined" || res[2] === '') { 44 if (typeof(res[2]) == "undefined" || res[2] === '') {
45 return new Date(year); 45 return new Date(year);
46 } 46 }
47 month = parseInt(res[2], 10) - 1; 47 month = parseInt(res[2], 10) - 1;
48 day = parseInt(res[3], 10); 48 day = parseInt(res[3], 10);
49 if (typeof(res[4]) == "undefined" || res[4] === '') { 49 if (typeof(res[4]) == "undefined" || res[4] === '') {
50 return new Date(year, month, day); 50 return new Date(year, month, day);
51 } 51 }
52 hour = parseInt(res[4], 10); 52 hour = parseInt(res[4], 10);
53 min = parseInt(res[5], 10); 53 min = parseInt(res[5], 10);
54 sec = (typeof(res[6]) != "undefined" && res[6] !== '') ? parseInt(res[6], 10) : 0; 54 sec = (typeof(res[6]) != "undefined" && res[6] !== '') ? parseInt(res[6], 10) : 0;
55 if (typeof(res[7]) != "undefined" && res[7] !== '') { 55 if (typeof(res[7]) != "undefined" && res[7] !== '') {
56 msec = Math.round(1000.0 * parseFloat("0." + res[7])); 56 msec = Math.round(1000.0 * parseFloat("0." + res[7]));
57 } else { 57 } else {
58 msec = 0; 58 msec = 0;
59 } 59 }
60 if ((typeof(res[8]) == "undefined" || res[8] === '') && (typeof(res[9]) == "undefined" || res[9] === '')) { 60 if ((typeof(res[8]) == "undefined" || res[8] === '') && (typeof(res[9]) == "undefined" || res[9] === '')) {
61 return new Date(year, month, day, hour, min, sec, msec); 61 return new Date(year, month, day, hour, min, sec, msec);
62 } 62 }
63 var ofs; 63 var ofs;
64 if (typeof(res[9]) != "undefined" && res[9] !== '') { 64 if (typeof(res[9]) != "undefined" && res[9] !== '') {
65 ofs = parseInt(res[10], 10) * 3600000; 65 ofs = parseInt(res[10], 10) * 3600000;
66 if (typeof(res[11]) != "undefined" && res[11] !== '') { 66 if (typeof(res[11]) != "undefined" && res[11] !== '') {
67 ofs += parseInt(res[11], 10) * 60000; 67 ofs += parseInt(res[11], 10) * 60000;
68 } 68 }
69 if (res[9] == "-") { 69 if (res[9] == "-") {
70 ofs = -ofs; 70 ofs = -ofs;
71 } 71 }
72 } else { 72 } else {
73 ofs = 0; 73 ofs = 0;
74 } 74 }
75 return new Date(Date.UTC(year, month, day, hour, min, sec, msec) - ofs); 75 return new Date(Date.UTC(year, month, day, hour, min, sec, msec) - ofs);
76}; 76};
77 77
78/** @id MochiKit.DateTime.toISOTime */ 78/** @id MochiKit.DateTime.toISOTime */
79MochiKit.DateTime.toISOTime = function (date, realISO/* = false */) { 79MochiKit.DateTime.toISOTime = function (date, realISO/* = false */) {
80 if (typeof(date) == "undefined" || date === null) { 80 if (typeof(date) == "undefined" || date === null) {
81 return null; 81 return null;
82 } 82 }
83 var hh = date.getHours(); 83 var _padTwo = MochiKit.DateTime._padTwo;
84 var mm = date.getMinutes(); 84 if (realISO) {
85 var ss = date.getSeconds(); 85 // adjust date for UTC timezone
86 date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
87 }
86 var lst = [ 88 var lst = [
87 ((realISO && (hh < 10)) ? "0" + hh : hh), 89 (realISO ? _padTwo(date.getHours()) : date.getHours()),
88 ((mm < 10) ? "0" + mm : mm), 90 _padTwo(date.getMinutes()),
89 ((ss < 10) ? "0" + ss : ss) 91 _padTwo(date.getSeconds())
90 ]; 92 ];
91 return lst.join(":"); 93 return lst.join(":") + (realISO ? "Z" : "");
92}; 94};
93 95
94/** @id MochiKit.DateTime.toISOTimeStamp */ 96/** @id MochiKit.DateTime.toISOTimeStamp */
95MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) { 97MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) {
96 if (typeof(date) == "undefined" || date === null) { 98 if (typeof(date) == "undefined" || date === null) {
97 return null; 99 return null;
98 } 100 }
101 var time = MochiKit.DateTime.toISOTime(date, realISO);
99 var sep = realISO ? "T" : " "; 102 var sep = realISO ? "T" : " ";
100 var foot = realISO ? "Z" : "";
101 if (realISO) { 103 if (realISO) {
104 // adjust date for UTC timezone
102 date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000)); 105 date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
103 } 106 }
104 return MochiKit.DateTime.toISODate(date) + sep + MochiKit.DateTime.toISOTime(date, realISO) + foot; 107 return MochiKit.DateTime.toISODate(date) + sep + time;
105}; 108};
106 109
107/** @id MochiKit.DateTime.toISODate */ 110/** @id MochiKit.DateTime.toISODate */
108MochiKit.DateTime.toISODate = function (date) { 111MochiKit.DateTime.toISODate = function (date) {
109 if (typeof(date) == "undefined" || date === null) { 112 if (typeof(date) == "undefined" || date === null) {
110 return null; 113 return null;
111 } 114 }
112 var _padTwo = MochiKit.DateTime._padTwo; 115 var _padTwo = MochiKit.DateTime._padTwo;
113 var _padFour = MochiKit.DateTime._padFour; 116 var _padFour = MochiKit.DateTime._padFour;
114 return [ 117 return [
115 _padFour(date.getFullYear()), 118 _padFour(date.getFullYear()),
116 _padTwo(date.getMonth() + 1), 119 _padTwo(date.getMonth() + 1),
117 _padTwo(date.getDate()) 120 _padTwo(date.getDate())
118 ].join("-"); 121 ].join("-");
119}; 122};
120 123
121/** @id MochiKit.DateTime.americanDate */ 124/** @id MochiKit.DateTime.americanDate */
122MochiKit.DateTime.americanDate = function (d) { 125MochiKit.DateTime.americanDate = function (d) {
123 d = d + ""; 126 d = d + "";
124 if (typeof(d) != "string" || d.length === 0) { 127 if (typeof(d) != "string" || d.length === 0) {
125 return null; 128 return null;
126 } 129 }
127 var a = d.split('/'); 130 var a = d.split('/');
128 return new Date(a[2], a[0] - 1, a[1]); 131 return new Date(a[2], a[0] - 1, a[1]);
129}; 132};
130 133
131MochiKit.DateTime._padTwo = function (n) { 134MochiKit.DateTime._padTwo = function (n) {
132 return (n > 9) ? n : "0" + n; 135 return (n > 9) ? n : "0" + n;
133}; 136};
134 137
135MochiKit.DateTime._padFour = function(n) { 138MochiKit.DateTime._padFour = function(n) {
136 switch(n.toString().length) { 139 switch(n.toString().length) {
137 case 1: return "000" + n; break; 140 case 1: return "000" + n; break;
138 case 2: return "00" + n; break; 141 case 2: return "00" + n; break;
139 case 3: return "0" + n; break; 142 case 3: return "0" + n; break;
140 case 4: 143 case 4:
141 default: 144 default:
142 return n; 145 return n;
143 } 146 }
144}; 147};
145 148
146/** @id MochiKit.DateTime.toPaddedAmericanDate */ 149/** @id MochiKit.DateTime.toPaddedAmericanDate */
147MochiKit.DateTime.toPaddedAmericanDate = function (d) { 150MochiKit.DateTime.toPaddedAmericanDate = function (d) {
148 if (typeof(d) == "undefined" || d === null) { 151 if (typeof(d) == "undefined" || d === null) {
149 return null; 152 return null;
150 } 153 }
151 var _padTwo = MochiKit.DateTime._padTwo; 154 var _padTwo = MochiKit.DateTime._padTwo;
152 return [ 155 return [
153 _padTwo(d.getMonth() + 1), 156 _padTwo(d.getMonth() + 1),
154 _padTwo(d.getDate()), 157 _padTwo(d.getDate()),
155 d.getFullYear() 158 d.getFullYear()
156 ].join('/'); 159 ].join('/');
157}; 160};
158 161
159/** @id MochiKit.DateTime.toAmericanDate */ 162/** @id MochiKit.DateTime.toAmericanDate */
160MochiKit.DateTime.toAmericanDate = function (d) { 163MochiKit.DateTime.toAmericanDate = function (d) {
161 if (typeof(d) == "undefined" || d === null) { 164 if (typeof(d) == "undefined" || d === null) {
162 return null; 165 return null;
163 } 166 }
164 return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/'); 167 return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/');
165}; 168};
166 169
167MochiKit.DateTime.__new__ = function () { 170MochiKit.DateTime.__new__ = function () {
168 MochiKit.Base.nameFunctions(this); 171 MochiKit.Base.nameFunctions(this);
169}; 172};
170 173
171MochiKit.DateTime.__new__(); 174MochiKit.DateTime.__new__();
172 175
173MochiKit.Base._exportSymbols(this, MochiKit.DateTime); 176MochiKit.Base._exportSymbols(this, MochiKit.DateTime);
diff --git a/frontend/gamma/js/MochiKit/DragAndDrop.js b/frontend/gamma/js/MochiKit/DragAndDrop.js
index 62777c5..cf84f77 100644
--- a/frontend/gamma/js/MochiKit/DragAndDrop.js
+++ b/frontend/gamma/js/MochiKit/DragAndDrop.js
@@ -1,75 +1,75 @@
1/*** 1/***
2MochiKit.DragAndDrop 1.5 2MochiKit.DragAndDrop 1.5
3 3
4See <http://mochikit.com/> for documentation, downloads, license, etc. 4See <http://mochikit.com/> for documentation, downloads, license, etc.
5 5
6Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 6Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
7 Mochi-ized By Thomas Herve (_firstname_@nimail.org) 7 Mochi-ized By Thomas Herve (_firstname_@nimail.org)
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('DragAndDrop', '1.5', ['Base', 'Iter', 'DOM', 'Signal', 'Visual', 'Position']); 11MochiKit.Base.module(MochiKit, 'DragAndDrop', '1.5', ['Base', 'Iter', 'DOM', 'Signal', 'Visual', 'Position']);
12 12
13MochiKit.DragAndDrop.Droppables = { 13MochiKit.DragAndDrop.Droppables = {
14 /*** 14 /***
15 15
16 Manage all droppables. Shouldn't be used, use the Droppable object instead. 16 Manage all droppables. Shouldn't be used, use the Droppable object instead.
17 17
18 ***/ 18 ***/
19 drops: [], 19 drops: [],
20 20
21 remove: function (element) { 21 remove: function (element) {
22 this.drops = MochiKit.Base.filter(function (d) { 22 this.drops = MochiKit.Base.filter(function (d) {
23 return d.element != MochiKit.DOM.getElement(element); 23 return d.element != MochiKit.DOM.getElement(element);
24 }, this.drops); 24 }, this.drops);
25 }, 25 },
26 26
27 register: function (drop) { 27 register: function (drop) {
28 this.drops.push(drop); 28 this.drops.push(drop);
29 }, 29 },
30 30
31 unregister: function (drop) { 31 unregister: function (drop) {
32 this.drops = MochiKit.Base.filter(function (d) { 32 this.drops = MochiKit.Base.filter(function (d) {
33 return d != drop; 33 return d != drop;
34 }, this.drops); 34 }, this.drops);
35 }, 35 },
36 36
37 prepare: function (element) { 37 prepare: function (element) {
38 MochiKit.Base.map(function (drop) { 38 MochiKit.Base.map(function (drop) {
39 if (drop.isAccepted(element)) { 39 if (drop.isAccepted(element)) {
40 if (drop.options.activeclass) { 40 if (drop.options.activeclass) {
41 MochiKit.DOM.addElementClass(drop.element, 41 MochiKit.DOM.addElementClass(drop.element,
42 drop.options.activeclass); 42 drop.options.activeclass);
43 } 43 }
44 drop.options.onactive(drop.element, element); 44 drop.options.onactive(drop.element, element);
45 } 45 }
46 }, this.drops); 46 }, this.drops);
47 }, 47 },
48 48
49 findDeepestChild: function (drops) { 49 findDeepestChild: function (drops) {
50 var deepest = drops[0]; 50 var deepest = drops[0];
51 51
52 for (var i = 1; i < drops.length; ++i) { 52 for (var i = 1; i < drops.length; ++i) {
53 if (MochiKit.DOM.isChildNode(drops[i].element, deepest.element)) { 53 if (MochiKit.DOM.isChildNode(drops[i].element, deepest.element)) {
54 deepest = drops[i]; 54 deepest = drops[i];
55 } 55 }
56 } 56 }
57 return deepest; 57 return deepest;
58 }, 58 },
59 59
60 show: function (point, element) { 60 show: function (point, element) {
61 if (!this.drops.length) { 61 if (!this.drops.length) {
62 return; 62 return;
63 } 63 }
64 var affected = []; 64 var affected = [];
65 65
66 if (this.last_active) { 66 if (this.last_active) {
67 this.last_active.deactivate(); 67 this.last_active.deactivate();
68 } 68 }
69 MochiKit.Iter.forEach(this.drops, function (drop) { 69 MochiKit.Iter.forEach(this.drops, function (drop) {
70 if (drop.isAffected(point, element)) { 70 if (drop.isAffected(point, element)) {
71 affected.push(drop); 71 affected.push(drop);
72 } 72 }
73 }); 73 });
74 if (affected.length > 0) { 74 if (affected.length > 0) {
75 var drop = this.findDeepestChild(affected); 75 var drop = this.findDeepestChild(affected);
@@ -245,130 +245,131 @@ MochiKit.DragAndDrop.Droppable.prototype = {
245 /*** 245 /***
246 246
247 Delete this droppable. 247 Delete this droppable.
248 248
249 ***/ 249 ***/
250 MochiKit.DragAndDrop.Droppables.unregister(this); 250 MochiKit.DragAndDrop.Droppables.unregister(this);
251 }, 251 },
252 252
253 /** @id MochiKit.DragAndDrop.repr */ 253 /** @id MochiKit.DragAndDrop.repr */
254 repr: function () { 254 repr: function () {
255 return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]"; 255 return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]";
256 } 256 }
257}; 257};
258 258
259MochiKit.DragAndDrop.Draggables = { 259MochiKit.DragAndDrop.Draggables = {
260 /*** 260 /***
261 261
262 Manage draggables elements. Not intended to direct use. 262 Manage draggables elements. Not intended to direct use.
263 263
264 ***/ 264 ***/
265 drags: [], 265 drags: [],
266 266
267 register: function (draggable) { 267 register: function (draggable) {
268 if (this.drags.length === 0) { 268 if (this.drags.length === 0) {
269 var conn = MochiKit.Signal.connect; 269 var conn = MochiKit.Signal.connect;
270 this.eventMouseUp = conn(document, 'onmouseup', this, this.endDrag); 270 this.eventMouseUp = conn(document, 'onmouseup', this, this.endDrag);
271 this.eventMouseMove = conn(document, 'onmousemove', this, 271 this.eventMouseMove = conn(document, 'onmousemove', this,
272 this.updateDrag); 272 this.updateDrag);
273 this.eventKeypress = conn(document, 'onkeypress', this, 273 this.eventKeypress = conn(document, 'onkeypress', this,
274 this.keyPress); 274 this.keyPress);
275 } 275 }
276 this.drags.push(draggable); 276 this.drags.push(draggable);
277 }, 277 },
278 278
279 unregister: function (draggable) { 279 unregister: function (draggable) {
280 this.drags = MochiKit.Base.filter(function (d) { 280 this.drags = MochiKit.Base.filter(function (d) {
281 return d != draggable; 281 return d != draggable;
282 }, this.drags); 282 }, this.drags);
283 if (this.drags.length === 0) { 283 if (this.drags.length === 0) {
284 var disc = MochiKit.Signal.disconnect; 284 var disc = MochiKit.Signal.disconnect;
285 disc(this.eventMouseUp); 285 disc(this.eventMouseUp);
286 disc(this.eventMouseMove); 286 disc(this.eventMouseMove);
287 disc(this.eventKeypress); 287 disc(this.eventKeypress);
288 } 288 }
289 }, 289 },
290 290
291 activate: function (draggable) { 291 activate: function (draggable) {
292 // allows keypress events if window is not currently focused 292 // allows keypress events if window is not currently focused
293 // fails for Safari 293 // fails for Safari
294 window.focus(); 294 window.focus();
295 this.activeDraggable = draggable; 295 this.activeDraggable = draggable;
296 }, 296 },
297 297
298 deactivate: function () { 298 deactivate: function () {
299 this.activeDraggable = null; 299 this.activeDraggable = null;
300 }, 300 },
301 301
302 updateDrag: function (event) { 302 updateDrag: function (event) {
303 if (!this.activeDraggable) { 303 if (!this.activeDraggable) {
304 return; 304 return;
305 } 305 }
306 var pointer = event.mouse(); 306 var pointer = event.mouse();
307 // Mozilla-based browsers fire successive mousemove events with 307 // Mozilla-based browsers fire successive mousemove events with
308 // the same coordinates, prevent needless redrawing (moz bug?) 308 // the same coordinates, prevent needless redrawing (moz bug?)
309 if (this._lastPointer && (MochiKit.Base.repr(this._lastPointer.page) == 309 if (this._lastPointer &&
310 MochiKit.Base.repr(pointer.page))) { 310 this._lastPointer.page.x == pointer.page.x &&
311 this._lastPointer.page.y == pointer.page.y) {
311 return; 312 return;
312 } 313 }
313 this._lastPointer = pointer; 314 this._lastPointer = pointer;
314 this.activeDraggable.updateDrag(event, pointer); 315 this.activeDraggable.updateDrag(event, pointer);
315 }, 316 },
316 317
317 endDrag: function (event) { 318 endDrag: function (event) {
318 if (!this.activeDraggable) { 319 if (!this.activeDraggable) {
319 return; 320 return;
320 } 321 }
321 this._lastPointer = null; 322 this._lastPointer = null;
322 this.activeDraggable.endDrag(event); 323 this.activeDraggable.endDrag(event);
323 this.activeDraggable = null; 324 this.activeDraggable = null;
324 }, 325 },
325 326
326 keyPress: function (event) { 327 keyPress: function (event) {
327 if (this.activeDraggable) { 328 if (this.activeDraggable) {
328 this.activeDraggable.keyPress(event); 329 this.activeDraggable.keyPress(event);
329 } 330 }
330 }, 331 },
331 332
332 notify: function (eventName, draggable, event) { 333 notify: function (eventName, draggable, event) {
333 MochiKit.Signal.signal(this, eventName, draggable, event); 334 MochiKit.Signal.signal(this, eventName, draggable, event);
334 } 335 }
335}; 336};
336 337
337/** @id MochiKit.DragAndDrop.Draggable */ 338/** @id MochiKit.DragAndDrop.Draggable */
338MochiKit.DragAndDrop.Draggable = function (element, options) { 339MochiKit.DragAndDrop.Draggable = function (element, options) {
339 var cls = arguments.callee; 340 var cls = arguments.callee;
340 if (!(this instanceof cls)) { 341 if (!(this instanceof cls)) {
341 return new cls(element, options); 342 return new cls(element, options);
342 } 343 }
343 this.__init__(element, options); 344 this.__init__(element, options);
344}; 345};
345 346
346MochiKit.DragAndDrop.Draggable.prototype = { 347MochiKit.DragAndDrop.Draggable.prototype = {
347 /*** 348 /***
348 349
349 A draggable object. Simple instantiate : 350 A draggable object. Simple instantiate :
350 351
351 new MochiKit.DragAndDrop.Draggable('myelement'); 352 new MochiKit.DragAndDrop.Draggable('myelement');
352 353
353 ***/ 354 ***/
354 __class__ : MochiKit.DragAndDrop.Draggable, 355 __class__ : MochiKit.DragAndDrop.Draggable,
355 356
356 __init__: function (element, /* optional */options) { 357 __init__: function (element, /* optional */options) {
357 var v = MochiKit.Visual; 358 var v = MochiKit.Visual;
358 var b = MochiKit.Base; 359 var b = MochiKit.Base;
359 options = b.update({ 360 options = b.update({
360 361
361 /** @id MochiKit.DragAndDrop.handle */ 362 /** @id MochiKit.DragAndDrop.handle */
362 handle: false, 363 handle: false,
363 364
364 /** @id MochiKit.DragAndDrop.starteffect */ 365 /** @id MochiKit.DragAndDrop.starteffect */
365 starteffect: function (innerelement) { 366 starteffect: function (innerelement) {
366 this._savedOpacity = MochiKit.Style.getStyle(innerelement, 'opacity') || 1.0; 367 this._savedOpacity = MochiKit.Style.getStyle(innerelement, 'opacity') || 1.0;
367 new v.Opacity(innerelement, {duration:0.2, from:this._savedOpacity, to:0.7}); 368 new v.Opacity(innerelement, {duration:0.2, from:this._savedOpacity, to:0.7});
368 }, 369 },
369 /** @id MochiKit.DragAndDrop.reverteffect */ 370 /** @id MochiKit.DragAndDrop.reverteffect */
370 reverteffect: function (innerelement, top_offset, left_offset) { 371 reverteffect: function (innerelement, top_offset, left_offset) {
371 var dur = Math.sqrt(Math.abs(top_offset^2) + 372 var dur = Math.sqrt(Math.abs(top_offset^2) +
372 Math.abs(left_offset^2))*0.02; 373 Math.abs(left_offset^2))*0.02;
373 return new v.Move(innerelement, 374 return new v.Move(innerelement,
374 {x: -left_offset, y: -top_offset, duration: dur}); 375 {x: -left_offset, y: -top_offset, duration: dur});
@@ -381,169 +382,168 @@ MochiKit.DragAndDrop.Draggable.prototype = {
381 382
382 /** @id MochiKit.DragAndDrop.onchange */ 383 /** @id MochiKit.DragAndDrop.onchange */
383 onchange: b.noop, 384 onchange: b.noop,
384 385
385 /** @id MochiKit.DragAndDrop.zindex */ 386 /** @id MochiKit.DragAndDrop.zindex */
386 zindex: 1000, 387 zindex: 1000,
387 388
388 /** @id MochiKit.DragAndDrop.revert */ 389 /** @id MochiKit.DragAndDrop.revert */
389 revert: false, 390 revert: false,
390 391
391 /** @id MochiKit.DragAndDrop.scroll */ 392 /** @id MochiKit.DragAndDrop.scroll */
392 scroll: false, 393 scroll: false,
393 394
394 /** @id MochiKit.DragAndDrop.scrollSensitivity */ 395 /** @id MochiKit.DragAndDrop.scrollSensitivity */
395 scrollSensitivity: 20, 396 scrollSensitivity: 20,
396 397
397 /** @id MochiKit.DragAndDrop.scrollSpeed */ 398 /** @id MochiKit.DragAndDrop.scrollSpeed */
398 scrollSpeed: 15, 399 scrollSpeed: 15,
399 // false, or xy or [x, y] or function (x, y){return [x, y];} 400 // false, or xy or [x, y] or function (x, y){return [x, y];}
400 401
401 /** @id MochiKit.DragAndDrop.snap */ 402 /** @id MochiKit.DragAndDrop.snap */
402 snap: false 403 snap: false
403 }, options); 404 }, options);
404 405
405 var d = MochiKit.DOM; 406 var d = MochiKit.DOM;
406 this.element = d.getElement(element); 407 this.element = d.getElement(element);
407 408
408 if (options.handle && (typeof(options.handle) == 'string')) { 409 if (options.handle && (typeof(options.handle) == 'string')) {
409 this.handle = d.getFirstElementByTagAndClassName(null, 410 this.handle = d.getFirstElementByTagAndClassName(null,
410 options.handle, this.element); 411 options.handle, this.element);
411 } 412 }
412 if (!this.handle) { 413 if (!this.handle) {
413 this.handle = d.getElement(options.handle); 414 this.handle = d.getElement(options.handle);
414 } 415 }
415 if (!this.handle) { 416 if (!this.handle) {
416 this.handle = this.element; 417 this.handle = this.element;
417 } 418 }
418 419
419 if (options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { 420 if (options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
420 options.scroll = d.getElement(options.scroll); 421 options.scroll = d.getElement(options.scroll);
421 this._isScrollChild = MochiKit.DOM.isChildNode(this.element, options.scroll); 422 this._isScrollChild = MochiKit.DOM.isChildNode(this.element, options.scroll);
422 } 423 }
423 424
424 MochiKit.Style.makePositioned(this.element); // fix IE 425 MochiKit.Style.makePositioned(this.element); // fix IE
425 426
426 this.delta = this.currentDelta(); 427 this.delta = this.currentDelta();
427 this.options = options; 428 this.options = options;
428 this.dragging = false; 429 this.dragging = false;
429 430
430 this.eventMouseDown = MochiKit.Signal.connect(this.handle, 431 this.eventMouseDown = MochiKit.Signal.connect(this.handle,
431 'onmousedown', this, this.initDrag); 432 'onmousedown', this, this.initDrag);
432 MochiKit.DragAndDrop.Draggables.register(this); 433 MochiKit.DragAndDrop.Draggables.register(this);
433 }, 434 },
434 435
435 /** @id MochiKit.DragAndDrop.destroy */ 436 /** @id MochiKit.DragAndDrop.destroy */
436 destroy: function () { 437 destroy: function () {
437 MochiKit.Signal.disconnect(this.eventMouseDown); 438 MochiKit.Signal.disconnect(this.eventMouseDown);
438 MochiKit.DragAndDrop.Draggables.unregister(this); 439 MochiKit.DragAndDrop.Draggables.unregister(this);
439 }, 440 },
440 441
441 /** @id MochiKit.DragAndDrop.currentDelta */ 442 /** @id MochiKit.DragAndDrop.currentDelta */
442 currentDelta: function () { 443 currentDelta: function () {
443 var s = MochiKit.Style.getStyle; 444 var s = MochiKit.Style.getStyle;
444 return [ 445 return [
445 parseInt(s(this.element, 'left') || '0'), 446 parseInt(s(this.element, 'left') || '0', 10),
446 parseInt(s(this.element, 'top') || '0')]; 447 parseInt(s(this.element, 'top') || '0', 10)];
447 }, 448 },
448 449
449 /** @id MochiKit.DragAndDrop.initDrag */ 450 /** @id MochiKit.DragAndDrop.initDrag */
450 initDrag: function (event) { 451 initDrag: function (event) {
451 if (!event.mouse().button.left) { 452 if (!event.mouse().button.left) {
452 return; 453 return;
453 } 454 }
454 // abort on form elements, fixes a Firefox issue 455 // abort on form elements, fixes a Firefox issue
455 var src = event.target(); 456 var src = event.target();
456 var tagName = (src.tagName || '').toUpperCase(); 457 var tagName = (src.tagName || '').toUpperCase();
457 if (tagName === 'INPUT' || tagName === 'SELECT' || 458 if (tagName === 'INPUT' || tagName === 'SELECT' ||
458 tagName === 'OPTION' || tagName === 'BUTTON' || 459 tagName === 'OPTION' || tagName === 'BUTTON' ||
459 tagName === 'TEXTAREA') { 460 tagName === 'TEXTAREA') {
460 return; 461 return;
461 } 462 }
462 463
463 if (this._revert) { 464 if (this._revert) {
464 this._revert.cancel(); 465 this._revert.cancel();
465 this._revert = null; 466 this._revert = null;
466 } 467 }
467 468
468 var pointer = event.mouse(); 469 var pointer = event.mouse();
469 var pos = MochiKit.Position.cumulativeOffset(this.element); 470 var pos = MochiKit.Position.cumulativeOffset(this.element);
470 this.offset = [pointer.page.x - pos.x, pointer.page.y - pos.y]; 471 this.offset = [pointer.page.x - pos.x, pointer.page.y - pos.y];
471 472
472 MochiKit.DragAndDrop.Draggables.activate(this); 473 MochiKit.DragAndDrop.Draggables.activate(this);
473 event.stop(); 474 event.stop();
474 }, 475 },
475 476
476 /** @id MochiKit.DragAndDrop.startDrag */ 477 /** @id MochiKit.DragAndDrop.startDrag */
477 startDrag: function (event) { 478 startDrag: function (event) {
478 this.dragging = true; 479 this.dragging = true;
479 if (this.options.selectclass) { 480 if (this.options.selectclass) {
480 MochiKit.DOM.addElementClass(this.element, 481 MochiKit.DOM.addElementClass(this.element,
481 this.options.selectclass); 482 this.options.selectclass);
482 } 483 }
483 if (this.options.zindex) { 484 if (this.options.zindex) {
484 this.originalZ = parseInt(MochiKit.Style.getStyle(this.element, 485 this.originalZ = MochiKit.Style.getStyle(this.element, 'z-index');
485 'z-index') || '0');
486 this.element.style.zIndex = this.options.zindex; 486 this.element.style.zIndex = this.options.zindex;
487 } 487 }
488 488
489 if (this.options.ghosting) { 489 if (this.options.ghosting) {
490 this._clone = this.element.cloneNode(true); 490 this._clone = this.element.cloneNode(true);
491 this.ghostPosition = MochiKit.Position.absolutize(this.element); 491 this.ghostPosition = MochiKit.Position.absolutize(this.element);
492 this.element.parentNode.insertBefore(this._clone, this.element); 492 this.element.parentNode.insertBefore(this._clone, this.element);
493 } 493 }
494 494
495 if (this.options.scroll) { 495 if (this.options.scroll) {
496 if (this.options.scroll == window) { 496 if (this.options.scroll == window) {
497 var where = this._getWindowScroll(this.options.scroll); 497 var where = this._getWindowScroll(this.options.scroll);
498 this.originalScrollLeft = where.left; 498 this.originalScrollLeft = where.left;
499 this.originalScrollTop = where.top; 499 this.originalScrollTop = where.top;
500 } else { 500 } else {
501 this.originalScrollLeft = this.options.scroll.scrollLeft; 501 this.originalScrollLeft = this.options.scroll.scrollLeft;
502 this.originalScrollTop = this.options.scroll.scrollTop; 502 this.originalScrollTop = this.options.scroll.scrollTop;
503 } 503 }
504 } 504 }
505 505
506 MochiKit.DragAndDrop.Droppables.prepare(this.element); 506 MochiKit.DragAndDrop.Droppables.prepare(this.element);
507 MochiKit.DragAndDrop.Draggables.notify('start', this, event); 507 MochiKit.DragAndDrop.Draggables.notify('start', this, event);
508 if (this.options.starteffect) { 508 if (this.options.starteffect) {
509 this.options.starteffect(this.element); 509 this.options.starteffect(this.element);
510 } 510 }
511 }, 511 },
512 512
513 /** @id MochiKit.DragAndDrop.updateDrag */ 513 /** @id MochiKit.DragAndDrop.updateDrag */
514 updateDrag: function (event, pointer) { 514 updateDrag: function (event, pointer) {
515 if (!this.dragging) { 515 if (!this.dragging) {
516 this.startDrag(event); 516 this.startDrag(event);
517 } 517 }
518 MochiKit.Position.prepare(); 518 MochiKit.Position.prepare();
519 MochiKit.DragAndDrop.Droppables.show(pointer, this.element); 519 MochiKit.DragAndDrop.Droppables.show(pointer, this.element);
520 MochiKit.DragAndDrop.Draggables.notify('drag', this, event); 520 MochiKit.DragAndDrop.Draggables.notify('drag', this, event);
521 this.draw(pointer); 521 this.draw(pointer);
522 this.options.onchange(this); 522 this.options.onchange(this);
523 523
524 if (this.options.scroll) { 524 if (this.options.scroll) {
525 this.stopScrolling(); 525 this.stopScrolling();
526 var p, q; 526 var p, q;
527 if (this.options.scroll == window) { 527 if (this.options.scroll == window) {
528 var s = this._getWindowScroll(this.options.scroll); 528 var s = this._getWindowScroll(this.options.scroll);
529 p = new MochiKit.Style.Coordinates(s.left, s.top); 529 p = new MochiKit.Style.Coordinates(s.left, s.top);
530 q = new MochiKit.Style.Coordinates(s.left + s.width, 530 q = new MochiKit.Style.Coordinates(s.left + s.width,
531 s.top + s.height); 531 s.top + s.height);
532 } else { 532 } else {
533 p = MochiKit.Position.page(this.options.scroll); 533 p = MochiKit.Position.page(this.options.scroll);
534 p.x += this.options.scroll.scrollLeft; 534 p.x += this.options.scroll.scrollLeft;
535 p.y += this.options.scroll.scrollTop; 535 p.y += this.options.scroll.scrollTop;
536 p.x += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0); 536 p.x += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);
537 p.y += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0); 537 p.y += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);
538 q = new MochiKit.Style.Coordinates(p.x + this.options.scroll.offsetWidth, 538 q = new MochiKit.Style.Coordinates(p.x + this.options.scroll.offsetWidth,
539 p.y + this.options.scroll.offsetHeight); 539 p.y + this.options.scroll.offsetHeight);
540 } 540 }
541 var speed = [0, 0]; 541 var speed = [0, 0];
542 if (pointer.page.x > (q.x - this.options.scrollSensitivity)) { 542 if (pointer.page.x > (q.x - this.options.scrollSensitivity)) {
543 speed[0] = pointer.page.x - (q.x - this.options.scrollSensitivity); 543 speed[0] = pointer.page.x - (q.x - this.options.scrollSensitivity);
544 } else if (pointer.page.x < (p.x + this.options.scrollSensitivity)) { 544 } else if (pointer.page.x < (p.x + this.options.scrollSensitivity)) {
545 speed[0] = pointer.page.x - (p.x + this.options.scrollSensitivity); 545 speed[0] = pointer.page.x - (p.x + this.options.scrollSensitivity);
546 } 546 }
547 if (pointer.page.y > (q.y - this.options.scrollSensitivity)) { 547 if (pointer.page.y > (q.y - this.options.scrollSensitivity)) {
548 speed[1] = pointer.page.y - (q.y - this.options.scrollSensitivity); 548 speed[1] = pointer.page.y - (q.y - this.options.scrollSensitivity);
549 } else if (pointer.page.y < (p.y + this.options.scrollSensitivity)) { 549 } else if (pointer.page.y < (p.y + this.options.scrollSensitivity)) {
diff --git a/frontend/gamma/js/MochiKit/Format.js b/frontend/gamma/js/MochiKit/Format.js
index 122845e..58877e7 100644
--- a/frontend/gamma/js/MochiKit/Format.js
+++ b/frontend/gamma/js/MochiKit/Format.js
@@ -1,309 +1,309 @@
1/*** 1/***
2 2
3MochiKit.Format 1.5 3MochiKit.Format 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Format', '1.5', ['Base']); 11MochiKit.Base.module(MochiKit, 'Format', '1.5', ['Base']);
12 12
13MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) { 13MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) {
14 return function (num) { 14 return function (num) {
15 num = parseFloat(num); 15 num = parseFloat(num);
16 if (typeof(num) == "undefined" || num === null || isNaN(num)) { 16 if (typeof(num) == "undefined" || num === null || isNaN(num)) {
17 return placeholder; 17 return placeholder;
18 } 18 }
19 var curheader = header; 19 var curheader = header;
20 var curfooter = footer; 20 var curfooter = footer;
21 if (num < 0) { 21 if (num < 0) {
22 num = -num; 22 num = -num;
23 } else { 23 } else {
24 curheader = curheader.replace(/-/, ""); 24 curheader = curheader.replace(/-/, "");
25 } 25 }
26 var me = arguments.callee; 26 var me = arguments.callee;
27 var fmt = MochiKit.Format.formatLocale(locale); 27 var fmt = MochiKit.Format.formatLocale(locale);
28 if (isPercent) { 28 if (isPercent) {
29 num = num * 100.0; 29 num = num * 100.0;
30 curfooter = fmt.percent + curfooter; 30 curfooter = fmt.percent + curfooter;
31 } 31 }
32 num = MochiKit.Format.roundToFixed(num, precision); 32 num = MochiKit.Format.roundToFixed(num, precision);
33 var parts = num.split(/\./); 33 var parts = num.split(/\./);
34 var whole = parts[0]; 34 var whole = parts[0];
35 var frac = (parts.length == 1) ? "" : parts[1]; 35 var frac = (parts.length == 1) ? "" : parts[1];
36 var res = ""; 36 var res = "";
37 while (whole.length < leadingZeros) { 37 while (whole.length < leadingZeros) {
38 whole = "0" + whole; 38 whole = "0" + whole;
39 } 39 }
40 if (separatorAt) { 40 if (separatorAt) {
41 while (whole.length > separatorAt) { 41 while (whole.length > separatorAt) {
42 var i = whole.length - separatorAt; 42 var i = whole.length - separatorAt;
43 //res = res + fmt.separator + whole.substring(i, whole.length); 43 //res = res + fmt.separator + whole.substring(i, whole.length);
44 res = fmt.separator + whole.substring(i, whole.length) + res; 44 res = fmt.separator + whole.substring(i, whole.length) + res;
45 whole = whole.substring(0, i); 45 whole = whole.substring(0, i);
46 } 46 }
47 } 47 }
48 res = whole + res; 48 res = whole + res;
49 if (precision > 0) { 49 if (precision > 0) {
50 while (frac.length < trailingZeros) { 50 while (frac.length < trailingZeros) {
51 frac = frac + "0"; 51 frac = frac + "0";
52 } 52 }
53 res = res + fmt.decimal + frac; 53 res = res + fmt.decimal + frac;
54 } 54 }
55 return curheader + res + curfooter; 55 return curheader + res + curfooter;
56 }; 56 };
57}; 57};
58 58
59/** @id MochiKit.Format.numberFormatter */ 59/** @id MochiKit.Format.numberFormatter */
60MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) { 60MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) {
61 // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html 61 // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
62 // | 0 | leading or trailing zeros 62 // | 0 | leading or trailing zeros
63 // | # | just the number 63 // | # | just the number
64 // | , | separator 64 // | , | separator
65 // | . | decimal separator 65 // | . | decimal separator
66 // | % | Multiply by 100 and format as percent 66 // | % | Multiply by 100 and format as percent
67 if (typeof(placeholder) == "undefined") { 67 if (typeof(placeholder) == "undefined") {
68 placeholder = ""; 68 placeholder = "";
69 } 69 }
70 var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); 70 var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
71 if (!match) { 71 if (!match) {
72 throw TypeError("Invalid pattern"); 72 throw TypeError("Invalid pattern");
73 } 73 }
74 var header = pattern.substr(0, match.index); 74 var header = pattern.substr(0, match.index);
75 var footer = pattern.substr(match.index + match[0].length); 75 var footer = pattern.substr(match.index + match[0].length);
76 if (header.search(/-/) == -1) { 76 if (header.search(/-/) == -1) {
77 header = header + "-"; 77 header = header + "-";
78 } 78 }
79 var whole = match[1]; 79 var whole = match[1];
80 var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : ""; 80 var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : "";
81 var isPercent = (typeof(match[3]) == "string" && match[3] != ""); 81 var isPercent = (typeof(match[3]) == "string" && match[3] != "");
82 var tmp = whole.split(/,/); 82 var tmp = whole.split(/,/);
83 var separatorAt; 83 var separatorAt;
84 if (typeof(locale) == "undefined") { 84 if (typeof(locale) == "undefined") {
85 locale = "default"; 85 locale = "default";
86 } 86 }
87 if (tmp.length == 1) { 87 if (tmp.length == 1) {
88 separatorAt = null; 88 separatorAt = null;
89 } else { 89 } else {
90 separatorAt = tmp[1].length; 90 separatorAt = tmp[1].length;
91 } 91 }
92 var leadingZeros = whole.length - whole.replace(/0/g, "").length; 92 var leadingZeros = whole.length - whole.replace(/0/g, "").length;
93 var trailingZeros = frac.length - frac.replace(/0/g, "").length; 93 var trailingZeros = frac.length - frac.replace(/0/g, "").length;
94 var precision = frac.length; 94 var precision = frac.length;
95 var rval = MochiKit.Format._numberFormatter( 95 var rval = MochiKit.Format._numberFormatter(
96 placeholder, header, footer, locale, isPercent, precision, 96 placeholder, header, footer, locale, isPercent, precision,
97 leadingZeros, separatorAt, trailingZeros 97 leadingZeros, separatorAt, trailingZeros
98 ); 98 );
99 var m = MochiKit.Base; 99 var m = MochiKit.Base;
100 if (m) { 100 if (m) {
101 var fn = arguments.callee; 101 var fn = arguments.callee;
102 var args = m.concat(arguments); 102 var args = m.concat(arguments);
103 rval.repr = function () { 103 rval.repr = function () {
104 return [ 104 return [
105 self.NAME, 105 self.NAME,
106 "(", 106 "(",
107 map(m.repr, args).join(", "), 107 m.map(m.repr, args).join(", "),
108 ")" 108 ")"
109 ].join(""); 109 ].join("");
110 }; 110 };
111 } 111 }
112 return rval; 112 return rval;
113}; 113};
114 114
115/** @id MochiKit.Format.formatLocale */ 115/** @id MochiKit.Format.formatLocale */
116MochiKit.Format.formatLocale = function (locale) { 116MochiKit.Format.formatLocale = function (locale) {
117 if (typeof(locale) == "undefined" || locale === null) { 117 if (typeof(locale) == "undefined" || locale === null) {
118 locale = "default"; 118 locale = "default";
119 } 119 }
120 if (typeof(locale) == "string") { 120 if (typeof(locale) == "string") {
121 var rval = MochiKit.Format.LOCALE[locale]; 121 var rval = MochiKit.Format.LOCALE[locale];
122 if (typeof(rval) == "string") { 122 if (typeof(rval) == "string") {
123 rval = arguments.callee(rval); 123 rval = arguments.callee(rval);
124 MochiKit.Format.LOCALE[locale] = rval; 124 MochiKit.Format.LOCALE[locale] = rval;
125 } 125 }
126 return rval; 126 return rval;
127 } else { 127 } else {
128 return locale; 128 return locale;
129 } 129 }
130}; 130};
131 131
132/** @id MochiKit.Format.twoDigitAverage */ 132/** @id MochiKit.Format.twoDigitAverage */
133MochiKit.Format.twoDigitAverage = function (numerator, denominator) { 133MochiKit.Format.twoDigitAverage = function (numerator, denominator) {
134 if (denominator) { 134 if (denominator) {
135 var res = numerator / denominator; 135 var res = numerator / denominator;
136 if (!isNaN(res)) { 136 if (!isNaN(res)) {
137 return MochiKit.Format.twoDigitFloat(res); 137 return MochiKit.Format.twoDigitFloat(res);
138 } 138 }
139 } 139 }
140 return "0"; 140 return "0";
141}; 141};
142 142
143/** @id MochiKit.Format.twoDigitFloat */ 143/** @id MochiKit.Format.twoDigitFloat */
144MochiKit.Format.twoDigitFloat = function (aNumber) { 144MochiKit.Format.twoDigitFloat = function (aNumber) {
145 var res = roundToFixed(aNumber, 2); 145 var res = MochiKit.Format.roundToFixed(aNumber, 2);
146 if (res.indexOf(".00") > 0) { 146 if (res.indexOf(".00") > 0) {
147 return res.substring(0, res.length - 3); 147 return res.substring(0, res.length - 3);
148 } else if (res.charAt(res.length - 1) == "0") { 148 } else if (res.charAt(res.length - 1) == "0") {
149 return res.substring(0, res.length - 1); 149 return res.substring(0, res.length - 1);
150 } else { 150 } else {
151 return res; 151 return res;
152 } 152 }
153}; 153};
154 154
155/** @id MochiKit.Format.lstrip */ 155/** @id MochiKit.Format.lstrip */
156MochiKit.Format.lstrip = function (str, /* optional */chars) { 156MochiKit.Format.lstrip = function (str, /* optional */chars) {
157 str = str + ""; 157 str = str + "";
158 if (typeof(str) != "string") { 158 if (typeof(str) != "string") {
159 return null; 159 return null;
160 } 160 }
161 if (!chars) { 161 if (!chars) {
162 return str.replace(/^\s+/, ""); 162 return str.replace(/^\s+/, "");
163 } else { 163 } else {
164 return str.replace(new RegExp("^[" + chars + "]+"), ""); 164 return str.replace(new RegExp("^[" + chars + "]+"), "");
165 } 165 }
166}; 166};
167 167
168/** @id MochiKit.Format.rstrip */ 168/** @id MochiKit.Format.rstrip */
169MochiKit.Format.rstrip = function (str, /* optional */chars) { 169MochiKit.Format.rstrip = function (str, /* optional */chars) {
170 str = str + ""; 170 str = str + "";
171 if (typeof(str) != "string") { 171 if (typeof(str) != "string") {
172 return null; 172 return null;
173 } 173 }
174 if (!chars) { 174 if (!chars) {
175 return str.replace(/\s+$/, ""); 175 return str.replace(/\s+$/, "");
176 } else { 176 } else {
177 return str.replace(new RegExp("[" + chars + "]+$"), ""); 177 return str.replace(new RegExp("[" + chars + "]+$"), "");
178 } 178 }
179}; 179};
180 180
181/** @id MochiKit.Format.strip */ 181/** @id MochiKit.Format.strip */
182MochiKit.Format.strip = function (str, /* optional */chars) { 182MochiKit.Format.strip = function (str, /* optional */chars) {
183 var self = MochiKit.Format; 183 var self = MochiKit.Format;
184 return self.rstrip(self.lstrip(str, chars), chars); 184 return self.rstrip(self.lstrip(str, chars), chars);
185}; 185};
186 186
187/** @id MochiKit.Format.truncToFixed */ 187/** @id MochiKit.Format.truncToFixed */
188MochiKit.Format.truncToFixed = function (aNumber, precision) { 188MochiKit.Format.truncToFixed = function (aNumber, precision) {
189 var fixed = MochiKit.Format._numberToFixed(aNumber, precision); 189 var fixed = MochiKit.Format._numberToFixed(aNumber, precision);
190 var fracPos = fixed.indexOf("."); 190 var fracPos = fixed.indexOf(".");
191 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) { 191 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) {
192 fixed = fixed.substring(0, fracPos + precision + 1); 192 fixed = fixed.substring(0, fracPos + precision + 1);
193 fixed = MochiKit.Format._shiftNumber(fixed, 0); 193 fixed = MochiKit.Format._shiftNumber(fixed, 0);
194 } 194 }
195 return fixed; 195 return fixed;
196} 196};
197 197
198/** @id MochiKit.Format.roundToFixed */ 198/** @id MochiKit.Format.roundToFixed */
199MochiKit.Format.roundToFixed = function (aNumber, precision) { 199MochiKit.Format.roundToFixed = function (aNumber, precision) {
200 var fixed = MochiKit.Format._numberToFixed(aNumber, precision); 200 var fixed = MochiKit.Format._numberToFixed(aNumber, precision);
201 var fracPos = fixed.indexOf("."); 201 var fracPos = fixed.indexOf(".");
202 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) { 202 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) {
203 var str = MochiKit.Format._shiftNumber(fixed, precision); 203 var str = MochiKit.Format._shiftNumber(fixed, precision);
204 str = MochiKit.Format._numberToFixed(Math.round(parseFloat(str)), 0); 204 str = MochiKit.Format._numberToFixed(Math.round(parseFloat(str)), 0);
205 fixed = MochiKit.Format._shiftNumber(str, -precision); 205 fixed = MochiKit.Format._shiftNumber(str, -precision);
206 } 206 }
207 return fixed; 207 return fixed;
208} 208};
209 209
210/** 210/**
211 * Converts a number to a fixed format string. This function handles 211 * Converts a number to a fixed format string. This function handles
212 * conversion of exponents by shifting the decimal point to the left 212 * conversion of exponents by shifting the decimal point to the left
213 * or the right. It also guarantees a specified minimum number of 213 * or the right. It also guarantees a specified minimum number of
214 * fractional digits (but no maximum). 214 * fractional digits (but no maximum).
215 * 215 *
216 * @param {Number} aNumber the number to convert 216 * @param {Number} aNumber the number to convert
217 * @param {Number} precision the minimum number of decimal digits 217 * @param {Number} precision the minimum number of decimal digits
218 * 218 *
219 * @return {String} the fixed format number string 219 * @return {String} the fixed format number string
220 */ 220 */
221MochiKit.Format._numberToFixed = function (aNumber, precision) { 221MochiKit.Format._numberToFixed = function (aNumber, precision) {
222 var str = aNumber.toString(); 222 var str = aNumber.toString();
223 var parts = str.split(/[eE]/); 223 var parts = str.split(/[eE]/);
224 var exp = (parts.length === 1) ? 0 : parseInt(parts[1]) || 0; 224 var exp = (parts.length === 1) ? 0 : parseInt(parts[1], 10) || 0;
225 var fixed = MochiKit.Format._shiftNumber(parts[0], exp); 225 var fixed = MochiKit.Format._shiftNumber(parts[0], exp);
226 parts = fixed.split(/\./); 226 parts = fixed.split(/\./);
227 var whole = parts[0]; 227 var whole = parts[0];
228 var frac = (parts.length === 1) ? "" : parts[1]; 228 var frac = (parts.length === 1) ? "" : parts[1];
229 while (frac.length < precision) { 229 while (frac.length < precision) {
230 frac += "0"; 230 frac += "0";
231 } 231 }
232 if (frac.length > 0) { 232 if (frac.length > 0) {
233 return whole + "." + frac; 233 return whole + "." + frac;
234 } else { 234 } else {
235 return whole; 235 return whole;
236 } 236 }
237} 237};
238 238
239/** 239/**
240 * Shifts the decimal dot location in a fixed format number string. 240 * Shifts the decimal dot location in a fixed format number string.
241 * This function handles negative values and will add and remove 241 * This function handles negative values and will add and remove
242 * leading and trailing zeros as needed. 242 * leading and trailing zeros as needed.
243 * 243 *
244 * @param {String} num the fixed format number string 244 * @param {String} num the fixed format number string
245 * @param {Number} exp the base-10 exponent to apply 245 * @param {Number} exp the base-10 exponent to apply
246 * 246 *
247 * @return {String} the new fixed format number string 247 * @return {String} the new fixed format number string
248 */ 248 */
249MochiKit.Format._shiftNumber = function (num, exp) { 249MochiKit.Format._shiftNumber = function (num, exp) {
250 var pos = num.indexOf("."); 250 var pos = num.indexOf(".");
251 if (pos < 0) { 251 if (pos < 0) {
252 pos = num.length; 252 pos = num.length;
253 } else { 253 } else {
254 num = num.substring(0, pos) + num.substring(pos + 1); 254 num = num.substring(0, pos) + num.substring(pos + 1);
255 } 255 }
256 pos += exp; 256 pos += exp;
257 while (pos <= 0 || (pos <= 1 && num.charAt(0) === "-")) { 257 while (pos <= 0 || (pos <= 1 && num.charAt(0) === "-")) {
258 if (num.charAt(0) === "-") { 258 if (num.charAt(0) === "-") {
259 num = "-0" + num.substring(1); 259 num = "-0" + num.substring(1);
260 } else { 260 } else {
261 num = "0" + num; 261 num = "0" + num;
262 } 262 }
263 pos++; 263 pos++;
264 } 264 }
265 while (pos > num.length) { 265 while (pos > num.length) {
266 num += "0"; 266 num += "0";
267 } 267 }
268 if (pos < num.length) { 268 if (pos < num.length) {
269 num = num.substring(0, pos) + "." + num.substring(pos); 269 num = num.substring(0, pos) + "." + num.substring(pos);
270 } 270 }
271 while (/^0[^.]/.test(num)) { 271 while (/^0[^.]/.test(num)) {
272 num = num.substring(1); 272 num = num.substring(1);
273 } 273 }
274 while (/^-0[^.]/.test(num)) { 274 while (/^-0[^.]/.test(num)) {
275 num = "-" + num.substring(2); 275 num = "-" + num.substring(2);
276 } 276 }
277 return num; 277 return num;
278} 278};
279 279
280/** @id MochiKit.Format.percentFormat */ 280/** @id MochiKit.Format.percentFormat */
281MochiKit.Format.percentFormat = function (aNumber) { 281MochiKit.Format.percentFormat = function (aNumber) {
282 return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%'; 282 return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%';
283}; 283};
284 284
285MochiKit.Format.LOCALE = { 285MochiKit.Format.LOCALE = {
286 en_US: {separator: ",", decimal: ".", percent: "%"}, 286 en_US: {separator: ",", decimal: ".", percent: "%"},
287 de_DE: {separator: ".", decimal: ",", percent: "%"}, 287 de_DE: {separator: ".", decimal: ",", percent: "%"},
288 pt_BR: {separator: ".", decimal: ",", percent: "%"}, 288 pt_BR: {separator: ".", decimal: ",", percent: "%"},
289 fr_FR: {separator: " ", decimal: ",", percent: "%"}, 289 fr_FR: {separator: " ", decimal: ",", percent: "%"},
290 "default": "en_US", 290 "default": "en_US",
291 __export__: false 291 __export__: false
292}; 292};
293 293
294MochiKit.Format.__new__ = function () { 294MochiKit.Format.__new__ = function () {
295 MochiKit.Base.nameFunctions(this); 295 MochiKit.Base.nameFunctions(this);
296 var base = this.NAME + "."; 296 var base = this.NAME + ".";
297 var k, v, o; 297 var k, v, o;
298 for (k in this.LOCALE) { 298 for (k in this.LOCALE) {
299 o = this.LOCALE[k]; 299 o = this.LOCALE[k];
300 if (typeof(o) == "object") { 300 if (typeof(o) == "object") {
301 o.repr = function () { return this.NAME; }; 301 o.repr = function () { return this.NAME; };
302 o.NAME = base + "LOCALE." + k; 302 o.NAME = base + "LOCALE." + k;
303 } 303 }
304 } 304 }
305}; 305};
306 306
307MochiKit.Format.__new__(); 307MochiKit.Format.__new__();
308 308
309MochiKit.Base._exportSymbols(this, MochiKit.Format); 309MochiKit.Base._exportSymbols(this, MochiKit.Format);
diff --git a/frontend/gamma/js/MochiKit/Iter.js b/frontend/gamma/js/MochiKit/Iter.js
index 524b2bc..77623bc 100644
--- a/frontend/gamma/js/MochiKit/Iter.js
+++ b/frontend/gamma/js/MochiKit/Iter.js
@@ -1,75 +1,75 @@
1/*** 1/***
2 2
3MochiKit.Iter 1.5 3MochiKit.Iter 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Iter', '1.5', ['Base']); 11MochiKit.Base.module(MochiKit, 'Iter', '1.5', ['Base']);
12 12
13MochiKit.Base.update(MochiKit.Iter, { 13MochiKit.Base.update(MochiKit.Iter, {
14 /** @id MochiKit.Iter.registerIteratorFactory */ 14 /** @id MochiKit.Iter.registerIteratorFactory */
15 registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) { 15 registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) {
16 MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override); 16 MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override);
17 }, 17 },
18 18
19 /** @id MochiKit.Iter.isIterable */ 19 /** @id MochiKit.Iter.isIterable */
20 isIterable: function(o) { 20 isIterable: function(o) {
21 return o != null && 21 return o != null &&
22 (typeof(o.next) == "function" || typeof(o.iter) == "function"); 22 (typeof(o.next) == "function" || typeof(o.iter) == "function");
23 }, 23 },
24 24
25 /** @id MochiKit.Iter.iter */ 25 /** @id MochiKit.Iter.iter */
26 iter: function (iterable, /* optional */ sentinel) { 26 iter: function (iterable, /* optional */ sentinel) {
27 var self = MochiKit.Iter; 27 var self = MochiKit.Iter;
28 if (arguments.length == 2) { 28 if (arguments.length == 2) {
29 return self.takewhile( 29 return self.takewhile(
30 function (a) { return a != sentinel; }, 30 function (a) { return a != sentinel; },
31 iterable 31 iterable
32 ); 32 );
33 } 33 }
34 if (typeof(iterable.next) == 'function') { 34 if (typeof(iterable.next) == 'function') {
35 return iterable; 35 return iterable;
36 } else if (typeof(iterable.iter) == 'function') { 36 } else if (typeof(iterable.iter) == 'function') {
37 return iterable.iter(); 37 return iterable.iter();
38 /* 38 /*
39 } else if (typeof(iterable.__iterator__) == 'function') { 39 } else if (typeof(iterable.__iterator__) == 'function') {
40 // 40 //
41 // XXX: We can't support JavaScript 1.7 __iterator__ directly 41 // XXX: We can't support JavaScript 1.7 __iterator__ directly
42 // because of Object.prototype.__iterator__ 42 // because of Object.prototype.__iterator__
43 // 43 //
44 return iterable.__iterator__(); 44 return iterable.__iterator__();
45 */ 45 */
46 } 46 }
47 47
48 try { 48 try {
49 return self.iteratorRegistry.match(iterable); 49 return self.iteratorRegistry.match(iterable);
50 } catch (e) { 50 } catch (e) {
51 var m = MochiKit.Base; 51 var m = MochiKit.Base;
52 if (e == m.NotFound) { 52 if (e == m.NotFound) {
53 e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable"); 53 e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable");
54 } 54 }
55 throw e; 55 throw e;
56 } 56 }
57 }, 57 },
58 58
59 /** @id MochiKit.Iter.count */ 59 /** @id MochiKit.Iter.count */
60 count: function (n) { 60 count: function (n) {
61 if (!n) { 61 if (!n) {
62 n = 0; 62 n = 0;
63 } 63 }
64 var m = MochiKit.Base; 64 var m = MochiKit.Base;
65 return { 65 return {
66 repr: function () { return "count(" + n + ")"; }, 66 repr: function () { return "count(" + n + ")"; },
67 toString: m.forwardCall("repr"), 67 toString: m.forwardCall("repr"),
68 next: m.counter(n) 68 next: m.counter(n)
69 }; 69 };
70 }, 70 },
71 71
72 /** @id MochiKit.Iter.cycle */ 72 /** @id MochiKit.Iter.cycle */
73 cycle: function (p) { 73 cycle: function (p) {
74 var self = MochiKit.Iter; 74 var self = MochiKit.Iter;
75 var m = MochiKit.Base; 75 var m = MochiKit.Base;
@@ -161,320 +161,318 @@ MochiKit.Base.update(MochiKit.Iter, {
161 return { 161 return {
162 repr: function () { return "ifilter(...)"; }, 162 repr: function () { return "ifilter(...)"; },
163 toString: m.forwardCall("repr"), 163 toString: m.forwardCall("repr"),
164 next: function () { 164 next: function () {
165 while (true) { 165 while (true) {
166 var rval = seq.next(); 166 var rval = seq.next();
167 if (pred(rval)) { 167 if (pred(rval)) {
168 return rval; 168 return rval;
169 } 169 }
170 } 170 }
171 // mozilla warnings aren't too bright 171 // mozilla warnings aren't too bright
172 return undefined; 172 return undefined;
173 } 173 }
174 }; 174 };
175 }, 175 },
176 176
177 /** @id MochiKit.Iter.ifilterfalse */ 177 /** @id MochiKit.Iter.ifilterfalse */
178 ifilterfalse: function (pred, seq) { 178 ifilterfalse: function (pred, seq) {
179 var m = MochiKit.Base; 179 var m = MochiKit.Base;
180 seq = MochiKit.Iter.iter(seq); 180 seq = MochiKit.Iter.iter(seq);
181 if (pred === null) { 181 if (pred === null) {
182 pred = m.operator.truth; 182 pred = m.operator.truth;
183 } 183 }
184 return { 184 return {
185 repr: function () { return "ifilterfalse(...)"; }, 185 repr: function () { return "ifilterfalse(...)"; },
186 toString: m.forwardCall("repr"), 186 toString: m.forwardCall("repr"),
187 next: function () { 187 next: function () {
188 while (true) { 188 while (true) {
189 var rval = seq.next(); 189 var rval = seq.next();
190 if (!pred(rval)) { 190 if (!pred(rval)) {
191 return rval; 191 return rval;
192 } 192 }
193 } 193 }
194 // mozilla warnings aren't too bright 194 // mozilla warnings aren't too bright
195 return undefined; 195 return undefined;
196 } 196 }
197 }; 197 };
198 }, 198 },
199 199
200 /** @id MochiKit.Iter.islice */ 200 /** @id MochiKit.Iter.islice */
201 islice: function (seq/*, [start,] stop[, step] */) { 201 islice: function (seq/*, [start,] stop[, step] */) {
202 var self = MochiKit.Iter; 202 var self = MochiKit.Iter;
203 var m = MochiKit.Base; 203 var m = MochiKit.Base;
204 seq = self.iter(seq); 204 seq = self.iter(seq);
205 var start = 0; 205 var start = 0;
206 var stop = 0; 206 var stop = 0;
207 var step = 1; 207 var step = 1;
208 var i = -1; 208 var i = -1;
209 if (arguments.length == 2) { 209 if (arguments.length == 2) {
210 stop = arguments[1]; 210 stop = arguments[1];
211 } else if (arguments.length == 3) { 211 } else if (arguments.length == 3) {
212 start = arguments[1]; 212 start = arguments[1];
213 stop = arguments[2]; 213 stop = arguments[2];
214 } else { 214 } else {
215 start = arguments[1]; 215 start = arguments[1];
216 stop = arguments[2]; 216 stop = arguments[2];
217 step = arguments[3]; 217 step = arguments[3];
218 } 218 }
219 return { 219 return {
220 repr: function () { 220 repr: function () {
221 return "islice(" + ["...", start, stop, step].join(", ") + ")"; 221 return "islice(" + ["...", start, stop, step].join(", ") + ")";
222 }, 222 },
223 toString: m.forwardCall("repr"), 223 toString: m.forwardCall("repr"),
224 next: function () { 224 next: function () {
225 if (start >= stop) {
226 throw self.StopIteration;
227 }
228
225 var rval; 229 var rval;
226 while (i < start) { 230 while (i < start) {
227 rval = seq.next(); 231 rval = seq.next();
228 i++; 232 i++;
229 } 233 }
230 if (start >= stop) {
231 throw self.StopIteration;
232 }
233 start += step; 234 start += step;
234 return rval; 235 return rval;
235 } 236 }
236 }; 237 };
237 }, 238 },
238 239
239 /** @id MochiKit.Iter.imap */ 240 /** @id MochiKit.Iter.imap */
240 imap: function (fun, p, q/*, ...*/) { 241 imap: function (fun, p, q/*, ...*/) {
241 var m = MochiKit.Base; 242 var m = MochiKit.Base;
242 var self = MochiKit.Iter; 243 var self = MochiKit.Iter;
243 var iterables = m.map(self.iter, m.extend(null, arguments, 1)); 244 var iterables = m.map(self.iter, m.extend(null, arguments, 1));
244 var map = m.map; 245 var map = m.map;
245 var next = self.next; 246 var next = self.next;
246 return { 247 return {
247 repr: function () { return "imap(...)"; }, 248 repr: function () { return "imap(...)"; },
248 toString: m.forwardCall("repr"), 249 toString: m.forwardCall("repr"),
249 next: function () { 250 next: function () {
250 return fun.apply(this, map(next, iterables)); 251 return fun.apply(this, map(next, iterables));
251 } 252 }
252 }; 253 };
253 }, 254 },
254 255
255 /** @id MochiKit.Iter.applymap */ 256 /** @id MochiKit.Iter.applymap */
256 applymap: function (fun, seq, self) { 257 applymap: function (fun, seq, self) {
257 seq = MochiKit.Iter.iter(seq); 258 seq = MochiKit.Iter.iter(seq);
258 var m = MochiKit.Base; 259 var m = MochiKit.Base;
259 return { 260 return {
260 repr: function () { return "applymap(...)"; }, 261 repr: function () { return "applymap(...)"; },
261 toString: m.forwardCall("repr"), 262 toString: m.forwardCall("repr"),
262 next: function () { 263 next: function () {
263 return fun.apply(self, seq.next()); 264 return fun.apply(self, seq.next());
264 } 265 }
265 }; 266 };
266 }, 267 },
267 268
268 /** @id MochiKit.Iter.chain */ 269 /** @id MochiKit.Iter.chain */
269 chain: function (p, q/*, ...*/) { 270 chain: function (p, q/*, ...*/) {
270 // dumb fast path 271 // dumb fast path
271 var self = MochiKit.Iter; 272 var self = MochiKit.Iter;
272 var m = MochiKit.Base; 273 var m = MochiKit.Base;
273 if (arguments.length == 1) { 274 if (arguments.length == 1) {
274 return self.iter(arguments[0]); 275 return self.iter(arguments[0]);
275 } 276 }
276 var argiter = m.map(self.iter, arguments); 277 var argiter = m.map(self.iter, arguments);
277 return { 278 return {
278 repr: function () { return "chain(...)"; }, 279 repr: function () { return "chain(...)"; },
279 toString: m.forwardCall("repr"), 280 toString: m.forwardCall("repr"),
280 next: function () { 281 next: function () {
281 while (argiter.length > 1) { 282 while (argiter.length > 1) {
282 try { 283 try {
283 var result = argiter[0].next(); 284 return argiter[0].next();
284 return result;
285 } catch (e) { 285 } catch (e) {
286 if (e != self.StopIteration) { 286 if (e != self.StopIteration) {
287 throw e; 287 throw e;
288 } 288 }
289 argiter.shift(); 289 argiter.shift();
290 var result = argiter[0].next();
291 return result;
292 } 290 }
293 } 291 }
294 if (argiter.length == 1) { 292 if (argiter.length == 1) {
295 // optimize last element 293 // optimize last element
296 var arg = argiter.shift(); 294 var arg = argiter.shift();
297 this.next = m.bind("next", arg); 295 this.next = m.bind("next", arg);
298 return this.next(); 296 return this.next();
299 } 297 }
300 throw self.StopIteration; 298 throw self.StopIteration;
301 } 299 }
302 }; 300 };
303 }, 301 },
304 302
305 /** @id MochiKit.Iter.takewhile */ 303 /** @id MochiKit.Iter.takewhile */
306 takewhile: function (pred, seq) { 304 takewhile: function (pred, seq) {
307 var self = MochiKit.Iter; 305 var self = MochiKit.Iter;
308 seq = self.iter(seq); 306 seq = self.iter(seq);
309 return { 307 return {
310 repr: function () { return "takewhile(...)"; }, 308 repr: function () { return "takewhile(...)"; },
311 toString: MochiKit.Base.forwardCall("repr"), 309 toString: MochiKit.Base.forwardCall("repr"),
312 next: function () { 310 next: function () {
313 var rval = seq.next(); 311 var rval = seq.next();
314 if (!pred(rval)) { 312 if (!pred(rval)) {
315 this.next = function () { 313 this.next = function () {
316 throw self.StopIteration; 314 throw self.StopIteration;
317 }; 315 };
318 this.next(); 316 this.next();
319 } 317 }
320 return rval; 318 return rval;
321 } 319 }
322 }; 320 };
323 }, 321 },
324 322
325 /** @id MochiKit.Iter.dropwhile */ 323 /** @id MochiKit.Iter.dropwhile */
326 dropwhile: function (pred, seq) { 324 dropwhile: function (pred, seq) {
327 seq = MochiKit.Iter.iter(seq); 325 seq = MochiKit.Iter.iter(seq);
328 var m = MochiKit.Base; 326 var m = MochiKit.Base;
329 var bind = m.bind; 327 var bind = m.bind;
330 return { 328 return {
331 "repr": function () { return "dropwhile(...)"; }, 329 "repr": function () { return "dropwhile(...)"; },
332 "toString": m.forwardCall("repr"), 330 "toString": m.forwardCall("repr"),
333 "next": function () { 331 "next": function () {
334 while (true) { 332 while (true) {
335 var rval = seq.next(); 333 var rval = seq.next();
336 if (!pred(rval)) { 334 if (!pred(rval)) {
337 break; 335 break;
338 } 336 }
339 } 337 }
340 this.next = bind("next", seq); 338 this.next = bind("next", seq);
341 return rval; 339 return rval;
342 } 340 }
343 }; 341 };
344 }, 342 },
345 343
346 _tee: function (ident, sync, iterable) { 344 _tee: function (ident, sync, iterable) {
347 sync.pos[ident] = -1; 345 sync.pos[ident] = -1;
348 var m = MochiKit.Base; 346 var m = MochiKit.Base;
349 var listMin = m.listMin; 347 var listMin = m.listMin;
350 return { 348 return {
351 repr: function () { return "tee(" + ident + ", ...)"; }, 349 repr: function () { return "tee(" + ident + ", ...)"; },
352 toString: m.forwardCall("repr"), 350 toString: m.forwardCall("repr"),
353 next: function () { 351 next: function () {
354 var rval; 352 var rval;
355 var i = sync.pos[ident]; 353 var i = sync.pos[ident];
356 354
357 if (i == sync.max) { 355 if (i == sync.max) {
358 rval = iterable.next(); 356 rval = iterable.next();
359 sync.deque.push(rval); 357 sync.deque.push(rval);
360 sync.max += 1; 358 sync.max += 1;
361 sync.pos[ident] += 1; 359 sync.pos[ident] += 1;
362 } else { 360 } else {
363 rval = sync.deque[i - sync.min]; 361 rval = sync.deque[i - sync.min];
364 sync.pos[ident] += 1; 362 sync.pos[ident] += 1;
365 if (i == sync.min && listMin(sync.pos) != sync.min) { 363 if (i == sync.min && listMin(sync.pos) != sync.min) {
366 sync.min += 1; 364 sync.min += 1;
367 sync.deque.shift(); 365 sync.deque.shift();
368 } 366 }
369 } 367 }
370 return rval; 368 return rval;
371 } 369 }
372 }; 370 };
373 }, 371 },
374 372
375 /** @id MochiKit.Iter.tee */ 373 /** @id MochiKit.Iter.tee */
376 tee: function (iterable, n/* = 2 */) { 374 tee: function (iterable, n/* = 2 */) {
377 var rval = []; 375 var rval = [];
378 var sync = { 376 var sync = {
379 "pos": [], 377 "pos": [],
380 "deque": [], 378 "deque": [],
381 "max": -1, 379 "max": -1,
382 "min": -1 380 "min": -1
383 }; 381 };
384 if (arguments.length == 1 || typeof(n) == "undefined" || n === null) { 382 if (arguments.length == 1 || typeof(n) == "undefined" || n === null) {
385 n = 2; 383 n = 2;
386 } 384 }
387 var self = MochiKit.Iter; 385 var self = MochiKit.Iter;
388 iterable = self.iter(iterable); 386 iterable = self.iter(iterable);
389 var _tee = self._tee; 387 var _tee = self._tee;
390 for (var i = 0; i < n; i++) { 388 for (var i = 0; i < n; i++) {
391 rval.push(_tee(i, sync, iterable)); 389 rval.push(_tee(i, sync, iterable));
392 } 390 }
393 return rval; 391 return rval;
394 }, 392 },
395 393
396 /** @id MochiKit.Iter.list */ 394 /** @id MochiKit.Iter.list */
397 list: function (iterable) { 395 list: function (iterable) {
398 // Fast-path for Array and Array-like 396 // Fast-path for Array and Array-like
399 var rval; 397 var rval;
400 if (iterable instanceof Array) { 398 if (iterable instanceof Array) {
401 return iterable.slice(); 399 return iterable.slice();
402 } 400 }
403 // this is necessary to avoid a Safari crash 401 // this is necessary to avoid a Safari crash
404 if (typeof(iterable) == "function" && 402 if (typeof(iterable) == "function" &&
405 !(iterable instanceof Function) && 403 !(iterable instanceof Function) &&
406 typeof(iterable.length) == 'number') { 404 typeof(iterable.length) == 'number') {
407 rval = []; 405 rval = [];
408 for (var i = 0; i < iterable.length; i++) { 406 for (var i = 0; i < iterable.length; i++) {
409 rval.push(iterable[i]); 407 rval.push(iterable[i]);
410 } 408 }
411 return rval; 409 return rval;
412 } 410 }
413 411
414 var self = MochiKit.Iter; 412 var self = MochiKit.Iter;
415 iterable = self.iter(iterable); 413 iterable = self.iter(iterable);
416 var rval = []; 414 rval = [];
417 var a_val; 415 var a_val;
418 try { 416 try {
419 while (true) { 417 while (true) {
420 a_val = iterable.next(); 418 a_val = iterable.next();
421 rval.push(a_val); 419 rval.push(a_val);
422 } 420 }
423 } catch (e) { 421 } catch (e) {
424 if (e != self.StopIteration) { 422 if (e != self.StopIteration) {
425 throw e; 423 throw e;
426 } 424 }
427 return rval; 425 return rval;
428 } 426 }
429 // mozilla warnings aren't too bright 427 // mozilla warnings aren't too bright
430 return undefined; 428 return undefined;
431 }, 429 },
432 430
433 431
434 /** @id MochiKit.Iter.reduce */ 432 /** @id MochiKit.Iter.reduce */
435 reduce: function (fn, iterable, /* optional */initial) { 433 reduce: function (fn, iterable, /* optional */initial) {
436 var i = 0; 434 var i = 0;
437 var x = initial; 435 var x = initial;
438 var self = MochiKit.Iter; 436 var self = MochiKit.Iter;
439 iterable = self.iter(iterable); 437 iterable = self.iter(iterable);
440 if (arguments.length < 3) { 438 if (arguments.length < 3) {
441 try { 439 try {
442 x = iterable.next(); 440 x = iterable.next();
443 } catch (e) { 441 } catch (e) {
444 if (e == self.StopIteration) { 442 if (e == self.StopIteration) {
445 e = new TypeError("reduce() of empty sequence with no initial value"); 443 e = new TypeError("reduce() of empty sequence with no initial value");
446 } 444 }
447 throw e; 445 throw e;
448 } 446 }
449 i++; 447 i++;
450 } 448 }
451 try { 449 try {
452 while (true) { 450 while (true) {
453 x = fn(x, iterable.next()); 451 x = fn(x, iterable.next());
454 } 452 }
455 } catch (e) { 453 } catch (e) {
456 if (e != self.StopIteration) { 454 if (e != self.StopIteration) {
457 throw e; 455 throw e;
458 } 456 }
459 } 457 }
460 return x; 458 return x;
461 }, 459 },
462 460
463 /** @id MochiKit.Iter.range */ 461 /** @id MochiKit.Iter.range */
464 range: function (/* [start,] stop[, step] */) { 462 range: function (/* [start,] stop[, step] */) {
465 var start = 0; 463 var start = 0;
466 var stop = 0; 464 var stop = 0;
467 var step = 1; 465 var step = 1;
468 if (arguments.length == 1) { 466 if (arguments.length == 1) {
469 stop = arguments[0]; 467 stop = arguments[0];
470 } else if (arguments.length == 2) { 468 } else if (arguments.length == 2) {
471 start = arguments[0]; 469 start = arguments[0];
472 stop = arguments[1]; 470 stop = arguments[1];
473 } else if (arguments.length == 3) { 471 } else if (arguments.length == 3) {
474 start = arguments[0]; 472 start = arguments[0];
475 stop = arguments[1]; 473 stop = arguments[1];
476 step = arguments[2]; 474 step = arguments[2];
477 } else { 475 } else {
478 throw new TypeError("range() takes 1, 2, or 3 arguments!"); 476 throw new TypeError("range() takes 1, 2, or 3 arguments!");
479 } 477 }
480 if (step === 0) { 478 if (step === 0) {
diff --git a/frontend/gamma/js/MochiKit/Logging.js b/frontend/gamma/js/MochiKit/Logging.js
index f00996b..8b06e0b 100644
--- a/frontend/gamma/js/MochiKit/Logging.js
+++ b/frontend/gamma/js/MochiKit/Logging.js
@@ -1,75 +1,75 @@
1/*** 1/***
2 2
3MochiKit.Logging 1.5 3MochiKit.Logging 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Logging', '1.5', ['Base']); 11MochiKit.Base.module(MochiKit, 'Logging', '1.5', ['Base']);
12 12
13 /** @id MochiKit.Logging.LogMessage */ 13 /** @id MochiKit.Logging.LogMessage */
14MochiKit.Logging.LogMessage = function (num, level, info) { 14MochiKit.Logging.LogMessage = function (num, level, info) {
15 this.num = num; 15 this.num = num;
16 this.level = level; 16 this.level = level;
17 this.info = info; 17 this.info = info;
18 this.timestamp = new Date(); 18 this.timestamp = new Date();
19}; 19};
20 20
21MochiKit.Logging.LogMessage.prototype = { 21MochiKit.Logging.LogMessage.prototype = {
22 /** @id MochiKit.Logging.LogMessage.prototype.repr */ 22 /** @id MochiKit.Logging.LogMessage.prototype.repr */
23 repr: function () { 23 repr: function () {
24 var m = MochiKit.Base; 24 var m = MochiKit.Base;
25 return 'LogMessage(' + 25 return 'LogMessage(' +
26 m.map( 26 m.map(
27 m.repr, 27 m.repr,
28 [this.num, this.level, this.info] 28 [this.num, this.level, this.info]
29 ).join(', ') + ')'; 29 ).join(', ') + ')';
30 }, 30 },
31 /** @id MochiKit.Logging.LogMessage.prototype.toString */ 31 /** @id MochiKit.Logging.LogMessage.prototype.toString */
32 toString: MochiKit.Base.forwardCall("repr") 32 toString: MochiKit.Base.forwardCall("repr")
33}; 33};
34 34
35MochiKit.Base.update(MochiKit.Logging, { 35MochiKit.Base.update(MochiKit.Logging, {
36 /** @id MochiKit.Logging.logLevelAtLeast */ 36 /** @id MochiKit.Logging.logLevelAtLeast */
37 logLevelAtLeast: function (minLevel) { 37 logLevelAtLeast: function (minLevel) {
38 var self = MochiKit.Logging; 38 var self = MochiKit.Logging;
39 if (typeof(minLevel) == 'string') { 39 if (typeof(minLevel) == 'string') {
40 minLevel = self.LogLevel[minLevel]; 40 minLevel = self.LogLevel[minLevel];
41 } 41 }
42 return function (msg) { 42 return function (msg) {
43 var msgLevel = msg.level; 43 var msgLevel = msg.level;
44 if (typeof(msgLevel) == 'string') { 44 if (typeof(msgLevel) == 'string') {
45 msgLevel = self.LogLevel[msgLevel]; 45 msgLevel = self.LogLevel[msgLevel];
46 } 46 }
47 return msgLevel >= minLevel; 47 return msgLevel >= minLevel;
48 }; 48 };
49 }, 49 },
50 50
51 /** @id MochiKit.Logging.isLogMessage */ 51 /** @id MochiKit.Logging.isLogMessage */
52 isLogMessage: function (/* ... */) { 52 isLogMessage: function (/* ... */) {
53 var LogMessage = MochiKit.Logging.LogMessage; 53 var LogMessage = MochiKit.Logging.LogMessage;
54 for (var i = 0; i < arguments.length; i++) { 54 for (var i = 0; i < arguments.length; i++) {
55 if (!(arguments[i] instanceof LogMessage)) { 55 if (!(arguments[i] instanceof LogMessage)) {
56 return false; 56 return false;
57 } 57 }
58 } 58 }
59 return true; 59 return true;
60 }, 60 },
61 61
62 /** @id MochiKit.Logging.compareLogMessage */ 62 /** @id MochiKit.Logging.compareLogMessage */
63 compareLogMessage: function (a, b) { 63 compareLogMessage: function (a, b) {
64 return MochiKit.Base.compare([a.level, a.info], [b.level, b.info]); 64 return MochiKit.Base.compare([a.level, a.info], [b.level, b.info]);
65 }, 65 },
66 66
67 /** @id MochiKit.Logging.alertListener */ 67 /** @id MochiKit.Logging.alertListener */
68 alertListener: function (msg) { 68 alertListener: function (msg) {
69 alert( 69 alert(
70 "num: " + msg.num + 70 "num: " + msg.num +
71 "\nlevel: " + msg.level + 71 "\nlevel: " + msg.level +
72 "\ninfo: " + msg.info.join(" ") 72 "\ninfo: " + msg.info.join(" ")
73 ); 73 );
74 } 74 }
75 75
@@ -126,129 +126,129 @@ MochiKit.Logging.Logger.prototype = {
126 }, 126 },
127 127
128 /** @id MochiKit.Logging.Logger.prototype.addListener */ 128 /** @id MochiKit.Logging.Logger.prototype.addListener */
129 addListener: function (ident, filter, listener) { 129 addListener: function (ident, filter, listener) {
130 if (typeof(filter) == 'string') { 130 if (typeof(filter) == 'string') {
131 filter = MochiKit.Logging.logLevelAtLeast(filter); 131 filter = MochiKit.Logging.logLevelAtLeast(filter);
132 } 132 }
133 var entry = [filter, listener]; 133 var entry = [filter, listener];
134 entry.ident = ident; 134 entry.ident = ident;
135 this.listeners[ident] = entry; 135 this.listeners[ident] = entry;
136 }, 136 },
137 137
138 /** @id MochiKit.Logging.Logger.prototype.removeListener */ 138 /** @id MochiKit.Logging.Logger.prototype.removeListener */
139 removeListener: function (ident) { 139 removeListener: function (ident) {
140 delete this.listeners[ident]; 140 delete this.listeners[ident];
141 }, 141 },
142 142
143 /** @id MochiKit.Logging.Logger.prototype.baseLog */ 143 /** @id MochiKit.Logging.Logger.prototype.baseLog */
144 baseLog: function (level, message/*, ...*/) { 144 baseLog: function (level, message/*, ...*/) {
145 if (typeof(level) == "number") { 145 if (typeof(level) == "number") {
146 if (level >= MochiKit.Logging.LogLevel.FATAL) { 146 if (level >= MochiKit.Logging.LogLevel.FATAL) {
147 level = 'FATAL'; 147 level = 'FATAL';
148 } else if (level >= MochiKit.Logging.LogLevel.ERROR) { 148 } else if (level >= MochiKit.Logging.LogLevel.ERROR) {
149 level = 'ERROR'; 149 level = 'ERROR';
150 } else if (level >= MochiKit.Logging.LogLevel.WARNING) { 150 } else if (level >= MochiKit.Logging.LogLevel.WARNING) {
151 level = 'WARNING'; 151 level = 'WARNING';
152 } else if (level >= MochiKit.Logging.LogLevel.INFO) { 152 } else if (level >= MochiKit.Logging.LogLevel.INFO) {
153 level = 'INFO'; 153 level = 'INFO';
154 } else { 154 } else {
155 level = 'DEBUG'; 155 level = 'DEBUG';
156 } 156 }
157 } 157 }
158 var msg = new MochiKit.Logging.LogMessage( 158 var msg = new MochiKit.Logging.LogMessage(
159 this.counter, 159 this.counter,
160 level, 160 level,
161 MochiKit.Base.extend(null, arguments, 1) 161 MochiKit.Base.extend(null, arguments, 1)
162 ); 162 );
163 this._messages.push(msg); 163 this._messages.push(msg);
164 this.dispatchListeners(msg); 164 this.dispatchListeners(msg);
165 if (this.useNativeConsole) { 165 if (this.useNativeConsole) {
166 this.logToConsole(msg.level + ": " + msg.info.join(" ")); 166 this.logToConsole(msg.level + ": " + msg.info.join(" "));
167 } 167 }
168 this.counter += 1; 168 this.counter += 1;
169 while (this.maxSize >= 0 && this._messages.length > this.maxSize) { 169 while (this.maxSize >= 0 && this._messages.length > this.maxSize) {
170 this._messages.shift(); 170 this._messages.shift();
171 } 171 }
172 }, 172 },
173 173
174 /** @id MochiKit.Logging.Logger.prototype.getMessages */ 174 /** @id MochiKit.Logging.Logger.prototype.getMessages */
175 getMessages: function (howMany) { 175 getMessages: function (howMany) {
176 var firstMsg = 0; 176 var firstMsg = 0;
177 if (!(typeof(howMany) == 'undefined' || howMany === null)) { 177 if (!(typeof(howMany) == 'undefined' || howMany === null)) {
178 firstMsg = Math.max(0, this._messages.length - howMany); 178 firstMsg = Math.max(0, this._messages.length - howMany);
179 } 179 }
180 return this._messages.slice(firstMsg); 180 return this._messages.slice(firstMsg);
181 }, 181 },
182 182
183 /** @id MochiKit.Logging.Logger.prototype.getMessageText */ 183 /** @id MochiKit.Logging.Logger.prototype.getMessageText */
184 getMessageText: function (howMany) { 184 getMessageText: function (howMany) {
185 if (typeof(howMany) == 'undefined' || howMany === null) { 185 if (typeof(howMany) == 'undefined' || howMany === null) {
186 howMany = 30; 186 howMany = 30;
187 } 187 }
188 var messages = this.getMessages(howMany); 188 var messages = this.getMessages(howMany);
189 if (messages.length) { 189 if (messages.length) {
190 var lst = map(function (m) { 190 var lst = MochiKit.Base.map(function (m) {
191 return '\n [' + m.num + '] ' + m.level + ': ' + m.info.join(' '); 191 return '\n [' + m.num + '] ' + m.level + ': ' + m.info.join(' ');
192 }, messages); 192 }, messages);
193 lst.unshift('LAST ' + messages.length + ' MESSAGES:'); 193 lst.unshift('LAST ' + messages.length + ' MESSAGES:');
194 return lst.join(''); 194 return lst.join('');
195 } 195 }
196 return ''; 196 return '';
197 }, 197 },
198 198
199 /** @id MochiKit.Logging.Logger.prototype.debuggingBookmarklet */ 199 /** @id MochiKit.Logging.Logger.prototype.debuggingBookmarklet */
200 debuggingBookmarklet: function (inline) { 200 debuggingBookmarklet: function (inline) {
201 if (typeof(MochiKit.LoggingPane) == "undefined") { 201 if (typeof(MochiKit.LoggingPane) == "undefined") {
202 alert(this.getMessageText()); 202 alert(this.getMessageText());
203 } else { 203 } else {
204 MochiKit.LoggingPane.createLoggingPane(inline || false); 204 MochiKit.LoggingPane.createLoggingPane(inline || false);
205 } 205 }
206 } 206 }
207}; 207};
208 208
209MochiKit.Logging.__new__ = function () { 209MochiKit.Logging.__new__ = function () {
210 this.LogLevel = { 210 this.LogLevel = {
211 ERROR: 40, 211 ERROR: 40,
212 FATAL: 50, 212 FATAL: 50,
213 WARNING: 30, 213 WARNING: 30,
214 INFO: 20, 214 INFO: 20,
215 DEBUG: 10 215 DEBUG: 10
216 }; 216 };
217 217
218 var m = MochiKit.Base; 218 var m = MochiKit.Base;
219 m.registerComparator("LogMessage", 219 m.registerComparator("LogMessage",
220 this.isLogMessage, 220 this.isLogMessage,
221 this.compareLogMessage 221 this.compareLogMessage
222 ); 222 );
223 223
224 var partial = m.partial; 224 var partial = m.partial;
225 225
226 var Logger = this.Logger; 226 var Logger = this.Logger;
227 var baseLog = Logger.prototype.baseLog; 227 var baseLog = Logger.prototype.baseLog;
228 m.update(this.Logger.prototype, { 228 m.update(this.Logger.prototype, {
229 debug: partial(baseLog, 'DEBUG'), 229 debug: partial(baseLog, 'DEBUG'),
230 log: partial(baseLog, 'INFO'), 230 log: partial(baseLog, 'INFO'),
231 error: partial(baseLog, 'ERROR'), 231 error: partial(baseLog, 'ERROR'),
232 fatal: partial(baseLog, 'FATAL'), 232 fatal: partial(baseLog, 'FATAL'),
233 warning: partial(baseLog, 'WARNING') 233 warning: partial(baseLog, 'WARNING')
234 }); 234 });
235 235
236 // indirectly find logger so it can be replaced 236 // indirectly find logger so it can be replaced
237 var self = this; 237 var self = this;
238 var connectLog = function (name) { 238 var connectLog = function (name) {
239 return function () { 239 return function () {
240 self.logger[name].apply(self.logger, arguments); 240 self.logger[name].apply(self.logger, arguments);
241 }; 241 };
242 }; 242 };
243 243
244 /** @id MochiKit.Logging.log */ 244 /** @id MochiKit.Logging.log */
245 this.log = connectLog('log'); 245 this.log = connectLog('log');
246 /** @id MochiKit.Logging.logError */ 246 /** @id MochiKit.Logging.logError */
247 this.logError = connectLog('error'); 247 this.logError = connectLog('error');
248 /** @id MochiKit.Logging.logDebug */ 248 /** @id MochiKit.Logging.logDebug */
249 this.logDebug = connectLog('debug'); 249 this.logDebug = connectLog('debug');
250 /** @id MochiKit.Logging.logFatal */ 250 /** @id MochiKit.Logging.logFatal */
251 this.logFatal = connectLog('fatal'); 251 this.logFatal = connectLog('fatal');
252 /** @id MochiKit.Logging.logWarning */ 252 /** @id MochiKit.Logging.logWarning */
253 this.logWarning = connectLog('warning'); 253 this.logWarning = connectLog('warning');
254 this.logger = new Logger(); 254 this.logger = new Logger();
diff --git a/frontend/gamma/js/MochiKit/LoggingPane.js b/frontend/gamma/js/MochiKit/LoggingPane.js
index c960c21..b7ea120 100644
--- a/frontend/gamma/js/MochiKit/LoggingPane.js
+++ b/frontend/gamma/js/MochiKit/LoggingPane.js
@@ -1,291 +1,294 @@
1/*** 1/***
2 2
3MochiKit.LoggingPane 1.5 3MochiKit.LoggingPane 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('LoggingPane', '1.5', ['Base', 'Logging']); 11MochiKit.Base.module(MochiKit, 'LoggingPane', '1.5', ['Base', 'Logging']);
12 12
13/** @id MochiKit.LoggingPane.createLoggingPane */ 13/** @id MochiKit.LoggingPane.createLoggingPane */
14MochiKit.LoggingPane.createLoggingPane = function (inline/* = false */) { 14MochiKit.LoggingPane.createLoggingPane = function (inline/* = false */) {
15 var m = MochiKit.LoggingPane; 15 var m = MochiKit.LoggingPane;
16 inline = !(!inline); 16 inline = !(!inline);
17 if (m._loggingPane && m._loggingPane.inline != inline) { 17 if (m._loggingPane && m._loggingPane.inline != inline) {
18 m._loggingPane.closePane(); 18 m._loggingPane.closePane();
19 m._loggingPane = null; 19 m._loggingPane = null;
20 } 20 }
21 if (!m._loggingPane || m._loggingPane.closed) { 21 if (!m._loggingPane || m._loggingPane.closed) {
22 m._loggingPane = new m.LoggingPane(inline, MochiKit.Logging.logger); 22 m._loggingPane = new m.LoggingPane(inline, MochiKit.Logging.logger);
23 } 23 }
24 return m._loggingPane; 24 return m._loggingPane;
25}; 25};
26 26
27/** @id MochiKit.LoggingPane.LoggingPane */ 27/**
28 * @id MochiKit.LoggingPane.LoggingPane
29 * @constructor
30 */
28MochiKit.LoggingPane.LoggingPane = function (inline/* = false */, logger/* = MochiKit.Logging.logger */) { 31MochiKit.LoggingPane.LoggingPane = function (inline/* = false */, logger/* = MochiKit.Logging.logger */) {
29 32
30 /* Use a div if inline, pop up a window if not */ 33 /* Use a div if inline, pop up a window if not */
31 /* Create the elements */ 34 /* Create the elements */
32 if (typeof(logger) == "undefined" || logger === null) { 35 if (typeof(logger) == "undefined" || logger === null) {
33 logger = MochiKit.Logging.logger; 36 logger = MochiKit.Logging.logger;
34 } 37 }
35 this.logger = logger; 38 this.logger = logger;
36 var update = MochiKit.Base.update; 39 var update = MochiKit.Base.update;
37 var updatetree = MochiKit.Base.updatetree; 40 var updatetree = MochiKit.Base.updatetree;
38 var bind = MochiKit.Base.bind; 41 var bind = MochiKit.Base.bind;
39 var clone = MochiKit.Base.clone; 42 var clone = MochiKit.Base.clone;
40 var win = window; 43 var win = window;
41 var uid = "_MochiKit_LoggingPane"; 44 var uid = "_MochiKit_LoggingPane";
42 if (typeof(MochiKit.DOM) != "undefined") { 45 if (typeof(MochiKit.DOM) != "undefined") {
43 win = MochiKit.DOM.currentWindow(); 46 win = MochiKit.DOM.currentWindow();
44 } 47 }
45 if (!inline) { 48 if (!inline) {
46 // name the popup with the base URL for uniqueness 49 // name the popup with the base URL for uniqueness
47 var url = win.location.href.split("?")[0].replace(/[#:\/.><&%-]/g, "_"); 50 var url = win.location.href.split("?")[0].replace(/[#:\/.><&%-]/g, "_");
48 var name = uid + "_" + url; 51 var name = uid + "_" + url;
49 var nwin = win.open("", name, "dependent,resizable,height=200"); 52 var nwin = win.open("", name, "dependent,resizable,height=200");
50 if (!nwin) { 53 if (!nwin) {
51 alert("Not able to open debugging window due to pop-up blocking."); 54 alert("Not able to open debugging window due to pop-up blocking.");
52 return undefined; 55 return undefined;
53 } 56 }
54 nwin.document.write( 57 nwin.document.write(
55 '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ' 58 '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" '
56 + '"http://www.w3.org/TR/html4/loose.dtd">' 59 + '"http://www.w3.org/TR/html4/loose.dtd">'
57 + '<html><head><title>[MochiKit.LoggingPane]</title></head>' 60 + '<html><head><title>[MochiKit.LoggingPane]</title></head>'
58 + '<body></body></html>' 61 + '<body></body></html>'
59 ); 62 );
60 nwin.document.close(); 63 nwin.document.close();
61 nwin.document.title += ' ' + win.document.title; 64 nwin.document.title += ' ' + win.document.title;
62 win = nwin; 65 win = nwin;
63 } 66 }
64 var doc = win.document; 67 var doc = win.document;
65 this.doc = doc; 68 this.doc = doc;
66 69
67 // Connect to the debug pane if it already exists (i.e. in a window orphaned by the page being refreshed) 70 // Connect to the debug pane if it already exists (i.e. in a window orphaned by the page being refreshed)
68 var debugPane = doc.getElementById(uid); 71 var debugPane = doc.getElementById(uid);
69 var existing_pane = !!debugPane; 72 var existing_pane = !!debugPane;
70 if (debugPane && typeof(debugPane.loggingPane) != "undefined") { 73 if (debugPane && typeof(debugPane.loggingPane) != "undefined") {
71 debugPane.loggingPane.logger = this.logger; 74 debugPane.loggingPane.logger = this.logger;
72 debugPane.loggingPane.buildAndApplyFilter(); 75 debugPane.loggingPane.buildAndApplyFilter();
73 return debugPane.loggingPane; 76 return debugPane.loggingPane;
74 } 77 }
75 78
76 if (existing_pane) { 79 if (existing_pane) {
77 // clear any existing contents 80 // clear any existing contents
78 var child; 81 var child;
79 while ((child = debugPane.firstChild)) { 82 while ((child = debugPane.firstChild)) {
80 debugPane.removeChild(child); 83 debugPane.removeChild(child);
81 } 84 }
82 } else { 85 } else {
83 debugPane = doc.createElement("div"); 86 debugPane = doc.createElement("div");
84 debugPane.id = uid; 87 debugPane.id = uid;
85 } 88 }
86 debugPane.loggingPane = this; 89 debugPane.loggingPane = this;
87 var levelFilterField = doc.createElement("input"); 90 var levelFilterField = doc.createElement("input");
88 var infoFilterField = doc.createElement("input"); 91 var infoFilterField = doc.createElement("input");
89 var filterButton = doc.createElement("button"); 92 var filterButton = doc.createElement("button");
90 var loadButton = doc.createElement("button"); 93 var loadButton = doc.createElement("button");
91 var clearButton = doc.createElement("button"); 94 var clearButton = doc.createElement("button");
92 var closeButton = doc.createElement("button"); 95 var closeButton = doc.createElement("button");
93 var logPaneArea = doc.createElement("div"); 96 var logPaneArea = doc.createElement("div");
94 var logPane = doc.createElement("div"); 97 var logPane = doc.createElement("div");
95 98
96 /* Set up the functions */ 99 /* Set up the functions */
97 var listenerId = uid + "_Listener"; 100 var listenerId = uid + "_Listener";
98 this.colorTable = clone(this.colorTable); 101 this.colorTable = clone(this.colorTable);
99 var messages = []; 102 var messages = [];
100 var messageFilter = null; 103 var messageFilter = null;
101 104
102 /** @id MochiKit.LoggingPane.messageLevel */ 105 /** @id MochiKit.LoggingPane.messageLevel */
103 var messageLevel = function (msg) { 106 var messageLevel = function (msg) {
104 var level = msg.level; 107 var level = msg.level;
105 if (typeof(level) == "number") { 108 if (typeof(level) == "number") {
106 level = MochiKit.Logging.LogLevel[level]; 109 level = MochiKit.Logging.LogLevel[level];
107 } 110 }
108 return level; 111 return level;
109 }; 112 };
110 113
111 /** @id MochiKit.LoggingPane.messageText */ 114 /** @id MochiKit.LoggingPane.messageText */
112 var messageText = function (msg) { 115 var messageText = function (msg) {
113 return msg.info.join(" "); 116 return msg.info.join(" ");
114 }; 117 };
115 118
116 /** @id MochiKit.LoggingPane.addMessageText */ 119 /** @id MochiKit.LoggingPane.addMessageText */
117 var addMessageText = bind(function (msg) { 120 var addMessageText = bind(function (msg) {
118 var level = messageLevel(msg); 121 var level = messageLevel(msg);
119 var text = messageText(msg); 122 var text = messageText(msg);
120 var c = this.colorTable[level]; 123 var c = this.colorTable[level];
121 var p = doc.createElement("span"); 124 var p = doc.createElement("span");
122 p.className = "MochiKit-LogMessage MochiKit-LogLevel-" + level; 125 p.className = "MochiKit-LogMessage MochiKit-LogLevel-" + level;
123 p.style.cssText = "margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: " + c; 126 p.style.cssText = "margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: " + c;
124 p.appendChild(doc.createTextNode(level + ": " + text)); 127 p.appendChild(doc.createTextNode(level + ": " + text));
125 logPane.appendChild(p); 128 logPane.appendChild(p);
126 logPane.appendChild(doc.createElement("br")); 129 logPane.appendChild(doc.createElement("br"));
127 if (logPaneArea.offsetHeight > logPaneArea.scrollHeight) { 130 if (logPaneArea.offsetHeight > logPaneArea.scrollHeight) {
128 logPaneArea.scrollTop = 0; 131 logPaneArea.scrollTop = 0;
129 } else { 132 } else {
130 logPaneArea.scrollTop = logPaneArea.scrollHeight; 133 logPaneArea.scrollTop = logPaneArea.scrollHeight;
131 } 134 }
132 }, this); 135 }, this);
133 136
134 /** @id MochiKit.LoggingPane.addMessage */ 137 /** @id MochiKit.LoggingPane.addMessage */
135 var addMessage = function (msg) { 138 var addMessage = function (msg) {
136 messages[messages.length] = msg; 139 messages[messages.length] = msg;
137 addMessageText(msg); 140 addMessageText(msg);
138 }; 141 };
139 142
140 /** @id MochiKit.LoggingPane.buildMessageFilter */ 143 /** @id MochiKit.LoggingPane.buildMessageFilter */
141 var buildMessageFilter = function () { 144 var buildMessageFilter = function () {
142 var levelre, infore; 145 var levelre, infore;
143 try { 146 try {
144 /* Catch any exceptions that might arise due to invalid regexes */ 147 /* Catch any exceptions that might arise due to invalid regexes */
145 levelre = new RegExp(levelFilterField.value); 148 levelre = new RegExp(levelFilterField.value);
146 infore = new RegExp(infoFilterField.value); 149 infore = new RegExp(infoFilterField.value);
147 } catch(e) { 150 } catch(e) {
148 /* If there was an error with the regexes, do no filtering */ 151 /* If there was an error with the regexes, do no filtering */
149 logDebug("Error in filter regex: " + e.message); 152 MochiKit.Logging.logDebug("Error in filter regex: " + e.message);
150 return null; 153 return null;
151 } 154 }
152 155
153 return function (msg) { 156 return function (msg) {
154 return ( 157 return (
155 levelre.test(messageLevel(msg)) && 158 levelre.test(messageLevel(msg)) &&
156 infore.test(messageText(msg)) 159 infore.test(messageText(msg))
157 ); 160 );
158 }; 161 };
159 }; 162 };
160 163
161 /** @id MochiKit.LoggingPane.clearMessagePane */ 164 /** @id MochiKit.LoggingPane.clearMessagePane */
162 var clearMessagePane = function () { 165 var clearMessagePane = function () {
163 while (logPane.firstChild) { 166 while (logPane.firstChild) {
164 logPane.removeChild(logPane.firstChild); 167 logPane.removeChild(logPane.firstChild);
165 } 168 }
166 }; 169 };
167 170
168 /** @id MochiKit.LoggingPane.clearMessages */ 171 /** @id MochiKit.LoggingPane.clearMessages */
169 var clearMessages = function () { 172 var clearMessages = function () {
170 messages = []; 173 messages = [];
171 clearMessagePane(); 174 clearMessagePane();
172 }; 175 };
173 176
174 /** @id MochiKit.LoggingPane.closePane */ 177 /** @id MochiKit.LoggingPane.closePane */
175 var closePane = bind(function () { 178 var closePane = bind(function () {
176 if (this.closed) { 179 if (this.closed) {
177 return; 180 return;
178 } 181 }
179 this.closed = true; 182 this.closed = true;
180 if (MochiKit.LoggingPane._loggingPane == this) { 183 if (MochiKit.LoggingPane._loggingPane == this) {
181 MochiKit.LoggingPane._loggingPane = null; 184 MochiKit.LoggingPane._loggingPane = null;
182 } 185 }
183 this.logger.removeListener(listenerId); 186 this.logger.removeListener(listenerId);
184 try { 187 try {
185 try { 188 try {
186 debugPane.loggingPane = null; 189 debugPane.loggingPane = null;
187 } catch(e) { logFatal("Bookmarklet was closed incorrectly."); } 190 } catch(e) { MochiKit.Logging.logFatal("Bookmarklet was closed incorrectly."); }
188 if (inline) { 191 if (inline) {
189 debugPane.parentNode.removeChild(debugPane); 192 debugPane.parentNode.removeChild(debugPane);
190 } else { 193 } else {
191 this.win.close(); 194 this.win.close();
192 } 195 }
193 } catch(e) {} 196 } catch(e) {}
194 }, this); 197 }, this);
195 198
196 /** @id MochiKit.LoggingPane.filterMessages */ 199 /** @id MochiKit.LoggingPane.filterMessages */
197 var filterMessages = function () { 200 var filterMessages = function () {
198 clearMessagePane(); 201 clearMessagePane();
199 202
200 for (var i = 0; i < messages.length; i++) { 203 for (var i = 0; i < messages.length; i++) {
201 var msg = messages[i]; 204 var msg = messages[i];
202 if (messageFilter === null || messageFilter(msg)) { 205 if (messageFilter === null || messageFilter(msg)) {
203 addMessageText(msg); 206 addMessageText(msg);
204 } 207 }
205 } 208 }
206 }; 209 };
207 210
208 this.buildAndApplyFilter = function () { 211 this.buildAndApplyFilter = function () {
209 messageFilter = buildMessageFilter(); 212 messageFilter = buildMessageFilter();
210 213
211 filterMessages(); 214 filterMessages();
212 215
213 this.logger.removeListener(listenerId); 216 this.logger.removeListener(listenerId);
214 this.logger.addListener(listenerId, messageFilter, addMessage); 217 this.logger.addListener(listenerId, messageFilter, addMessage);
215 }; 218 };
216 219
217 220
218 /** @id MochiKit.LoggingPane.loadMessages */ 221 /** @id MochiKit.LoggingPane.loadMessages */
219 var loadMessages = bind(function () { 222 var loadMessages = bind(function () {
220 messages = this.logger.getMessages(); 223 messages = this.logger.getMessages();
221 filterMessages(); 224 filterMessages();
222 }, this); 225 }, this);
223 226
224 /** @id MochiKit.LoggingPane.filterOnEnter */ 227 /** @id MochiKit.LoggingPane.filterOnEnter */
225 var filterOnEnter = bind(function (event) { 228 var filterOnEnter = bind(function (event) {
226 event = event || window.event; 229 event = event || window.event;
227 key = event.which || event.keyCode; 230 var key = event.which || event.keyCode;
228 if (key == 13) { 231 if (key == 13) {
229 this.buildAndApplyFilter(); 232 this.buildAndApplyFilter();
230 } 233 }
231 }, this); 234 }, this);
232 235
233 /* Create the debug pane */ 236 /* Create the debug pane */
234 var style = "display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: " + this.logFont; 237 var style = "display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: " + this.logFont;
235 if (inline) { 238 if (inline) {
236 style += "; height: 10em; border-top: 2px solid black"; 239 style += "; height: 10em; border-top: 2px solid black";
237 } else { 240 } else {
238 style += "; height: 100%;"; 241 style += "; height: 100%;";
239 } 242 }
240 debugPane.style.cssText = style; 243 debugPane.style.cssText = style;
241 244
242 if (!existing_pane) { 245 if (!existing_pane) {
243 doc.body.appendChild(debugPane); 246 doc.body.appendChild(debugPane);
244 } 247 }
245 248
246 /* Create the filter fields */ 249 /* Create the filter fields */
247 style = {"cssText": "width: 33%; display: inline; font: " + this.logFont}; 250 style = {"cssText": "width: 33%; display: inline; font: " + this.logFont};
248 251
249 updatetree(levelFilterField, { 252 updatetree(levelFilterField, {
250 "value": "FATAL|ERROR|WARNING|INFO|DEBUG", 253 "value": "FATAL|ERROR|WARNING|INFO|DEBUG",
251 "onkeypress": filterOnEnter, 254 "onkeypress": filterOnEnter,
252 "style": style 255 "style": style
253 }); 256 });
254 debugPane.appendChild(levelFilterField); 257 debugPane.appendChild(levelFilterField);
255 258
256 updatetree(infoFilterField, { 259 updatetree(infoFilterField, {
257 "value": ".*", 260 "value": ".*",
258 "onkeypress": filterOnEnter, 261 "onkeypress": filterOnEnter,
259 "style": style 262 "style": style
260 }); 263 });
261 debugPane.appendChild(infoFilterField); 264 debugPane.appendChild(infoFilterField);
262 265
263 /* Create the buttons */ 266 /* Create the buttons */
264 style = "width: 8%; display:inline; font: " + this.logFont; 267 style = "width: 8%; display:inline; font: " + this.logFont;
265 268
266 filterButton.appendChild(doc.createTextNode("Filter")); 269 filterButton.appendChild(doc.createTextNode("Filter"));
267 filterButton.onclick = bind("buildAndApplyFilter", this); 270 filterButton.onclick = bind("buildAndApplyFilter", this);
268 filterButton.style.cssText = style; 271 filterButton.style.cssText = style;
269 debugPane.appendChild(filterButton); 272 debugPane.appendChild(filterButton);
270 273
271 loadButton.appendChild(doc.createTextNode("Load")); 274 loadButton.appendChild(doc.createTextNode("Load"));
272 loadButton.onclick = loadMessages; 275 loadButton.onclick = loadMessages;
273 loadButton.style.cssText = style; 276 loadButton.style.cssText = style;
274 debugPane.appendChild(loadButton); 277 debugPane.appendChild(loadButton);
275 278
276 clearButton.appendChild(doc.createTextNode("Clear")); 279 clearButton.appendChild(doc.createTextNode("Clear"));
277 clearButton.onclick = clearMessages; 280 clearButton.onclick = clearMessages;
278 clearButton.style.cssText = style; 281 clearButton.style.cssText = style;
279 debugPane.appendChild(clearButton); 282 debugPane.appendChild(clearButton);
280 283
281 closeButton.appendChild(doc.createTextNode("Close")); 284 closeButton.appendChild(doc.createTextNode("Close"));
282 closeButton.onclick = closePane; 285 closeButton.onclick = closePane;
283 closeButton.style.cssText = style; 286 closeButton.style.cssText = style;
284 debugPane.appendChild(closeButton); 287 debugPane.appendChild(closeButton);
285 288
286 /* Create the logging pane */ 289 /* Create the logging pane */
287 logPaneArea.style.cssText = "overflow: auto; width: 100%"; 290 logPaneArea.style.cssText = "overflow: auto; width: 100%";
288 logPane.style.cssText = "width: 100%; height: " + (inline ? "8em" : "100%"); 291 logPane.style.cssText = "width: 100%; height: " + (inline ? "8em" : "100%");
289 292
290 logPaneArea.appendChild(logPane); 293 logPaneArea.appendChild(logPane);
291 debugPane.appendChild(logPaneArea); 294 debugPane.appendChild(logPaneArea);
diff --git a/frontend/gamma/js/MochiKit/MochiKit.js b/frontend/gamma/js/MochiKit/MochiKit.js
index 8e5be68..511e075 100644
--- a/frontend/gamma/js/MochiKit/MochiKit.js
+++ b/frontend/gamma/js/MochiKit/MochiKit.js
@@ -1,85 +1,82 @@
1/*** 1/***
2 2
3MochiKit.MochiKit 1.5 3MochiKit.MochiKit 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11if (typeof(MochiKit) == 'undefined') { 11var MochiKit = MochiKit || {};
12 MochiKit = {};
13}
14 12
15if (typeof(MochiKit.MochiKit) == 'undefined') { 13/** @id MochiKit.MochiKit */
16 /** @id MochiKit.MochiKit */ 14MochiKit.MochiKit = MochiKit.MochiKit || {};
17 MochiKit.MochiKit = {};
18}
19 15
20MochiKit.MochiKit.NAME = "MochiKit.MochiKit"; 16MochiKit.MochiKit.NAME = "MochiKit.MochiKit";
21MochiKit.MochiKit.VERSION = "1.5"; 17MochiKit.MochiKit.VERSION = "1.5";
18MochiKit.MochiKit.__export__ = false;
22MochiKit.MochiKit.__repr__ = function () { 19MochiKit.MochiKit.__repr__ = function () {
23 return "[" + this.NAME + " " + this.VERSION + "]"; 20 return "[" + this.NAME + " " + this.VERSION + "]";
24}; 21};
25 22
26/** @id MochiKit.MochiKit.toString */ 23/** @id MochiKit.MochiKit.toString */
27MochiKit.MochiKit.toString = function () { 24MochiKit.MochiKit.toString = function () {
28 return this.__repr__(); 25 return this.__repr__();
29}; 26};
30 27
31/** @id MochiKit.MochiKit.SUBMODULES */ 28/** @id MochiKit.MochiKit.SUBMODULES */
32MochiKit.MochiKit.SUBMODULES = [ 29MochiKit.MochiKit.SUBMODULES = [
33 "Base", 30 "Base",
34 "Iter", 31 "Iter",
35 "Logging", 32 "Logging",
36 "DateTime", 33 "DateTime",
37 "Format", 34 "Format",
38 "Text", 35 "Text",
39 "Async", 36 "Async",
40 "DOM", 37 "DOM",
41 "Selector", 38 "Selector",
42 "Style", 39 "Style",
43 "LoggingPane", 40 "LoggingPane",
44 "Color", 41 "Color",
45 "Signal", 42 "Signal",
46 "Position", 43 "Position",
47 "Visual", 44 "Visual",
48 "DragAndDrop", 45 "DragAndDrop",
49 "Sortable" 46 "Sortable"
50]; 47];
51 48
52(function () { 49(function () {
53 if (typeof(document) == "undefined") { 50 if (typeof(document) == "undefined") {
54 return; 51 return;
55 } 52 }
56 var scripts = document.getElementsByTagName("script"); 53 var scripts = document.getElementsByTagName("script");
57 var kXHTMLNSURI = "http://www.w3.org/1999/xhtml"; 54 var kXHTMLNSURI = "http://www.w3.org/1999/xhtml";
58 var kSVGNSURI = "http://www.w3.org/2000/svg"; 55 var kSVGNSURI = "http://www.w3.org/2000/svg";
59 var kXLINKNSURI = "http://www.w3.org/1999/xlink"; 56 var kXLINKNSURI = "http://www.w3.org/1999/xlink";
60 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; 57 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
61 var base = null; 58 var base = null;
62 var baseElem = null; 59 var baseElem = null;
63 var allScripts = {}; 60 var allScripts = {};
64 var i; 61 var i;
65 var src; 62 var src;
66 for (i = 0; i < scripts.length; i++) { 63 for (i = 0; i < scripts.length; i++) {
67 src = null; 64 src = null;
68 switch (scripts[i].namespaceURI) { 65 switch (scripts[i].namespaceURI) {
69 case kSVGNSURI: 66 case kSVGNSURI:
70 src = scripts[i].getAttributeNS(kXLINKNSURI, "href"); 67 src = scripts[i].getAttributeNS(kXLINKNSURI, "href");
71 break; 68 break;
72 /* 69 /*
73 case null: // HTML 70 case null: // HTML
74 case '': // HTML 71 case '': // HTML
75 case kXHTMLNSURI: 72 case kXHTMLNSURI:
76 case kXULNSURI: 73 case kXULNSURI:
77 */ 74 */
78 default: 75 default:
79 src = scripts[i].getAttribute("src"); 76 src = scripts[i].getAttribute("src");
80 break; 77 break;
81 } 78 }
82 if (!src) { 79 if (!src) {
83 continue; 80 continue;
84 } 81 }
85 allScripts[src] = true; 82 allScripts[src] = true;
diff --git a/frontend/gamma/js/MochiKit/MockDOM.js b/frontend/gamma/js/MochiKit/MockDOM.js
index abdb54a..7e6d60b 100644
--- a/frontend/gamma/js/MochiKit/MockDOM.js
+++ b/frontend/gamma/js/MochiKit/MockDOM.js
@@ -1,84 +1,81 @@
1/*** 1/***
2 2
3MochiKit.MockDOM 1.5 3MochiKit.MockDOM 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11if (typeof(MochiKit) == "undefined") { 11var MochiKit = MochiKit || {};
12 MochiKit = {};
13}
14 12
15if (typeof(MochiKit.MockDOM) == "undefined") { 13MochiKit.MockDOM = MochiKit.MockDOM || {};
16 MochiKit.MockDOM = {};
17}
18 14
19MochiKit.MockDOM.NAME = "MochiKit.MockDOM"; 15MochiKit.MockDOM.NAME = "MochiKit.MockDOM";
20MochiKit.MockDOM.VERSION = "1.5"; 16MochiKit.MockDOM.VERSION = "1.5";
17MochiKit.MockDOM.__export__ = false;
21 18
22MochiKit.MockDOM.__repr__ = function () { 19MochiKit.MockDOM.__repr__ = function () {
23 return "[" + this.NAME + " " + this.VERSION + "]"; 20 return "[" + this.NAME + " " + this.VERSION + "]";
24}; 21};
25 22
26/** @id MochiKit.MockDOM.toString */ 23/** @id MochiKit.MockDOM.toString */
27MochiKit.MockDOM.toString = function () { 24MochiKit.MockDOM.toString = function () {
28 return this.__repr__(); 25 return this.__repr__();
29}; 26};
30 27
31/** @id MochiKit.MockDOM.createDocument */ 28/** @id MochiKit.MockDOM.createDocument */
32MochiKit.MockDOM.createDocument = function () { 29MochiKit.MockDOM.createDocument = function () {
33 var doc = new MochiKit.MockDOM.MockElement("DOCUMENT"); 30 var doc = new MochiKit.MockDOM.MockElement("DOCUMENT");
34 doc.body = doc.createElement("BODY"); 31 doc.body = doc.createElement("BODY");
35 doc.appendChild(doc.body); 32 doc.appendChild(doc.body);
36 return doc; 33 return doc;
37}; 34};
38 35
39/** @id MochiKit.MockDOM.MockElement */ 36/** @id MochiKit.MockDOM.MockElement */
40MochiKit.MockDOM.MockElement = function (name, data, ownerDocument) { 37MochiKit.MockDOM.MockElement = function (name, data, ownerDocument) {
41 this.tagName = this.nodeName = name.toUpperCase(); 38 this.tagName = this.nodeName = name.toUpperCase();
42 this.ownerDocument = ownerDocument || null; 39 this.ownerDocument = ownerDocument || null;
43 if (name == "DOCUMENT") { 40 if (name == "DOCUMENT") {
44 this.nodeType = 9; 41 this.nodeType = 9;
45 this.childNodes = []; 42 this.childNodes = [];
46 } else if (typeof(data) == "string") { 43 } else if (typeof(data) == "string") {
47 this.nodeValue = data; 44 this.nodeValue = data;
48 this.nodeType = 3; 45 this.nodeType = 3;
49 } else { 46 } else {
50 this.nodeType = 1; 47 this.nodeType = 1;
51 this.childNodes = []; 48 this.childNodes = [];
52 } 49 }
53 if (name.substring(0, 1) == "<") { 50 if (name.substring(0, 1) == "<") {
54 var nameattr = name.substring( 51 var nameattr = name.substring(
55 name.indexOf('"') + 1, name.lastIndexOf('"')); 52 name.indexOf('"') + 1, name.lastIndexOf('"'));
56 name = name.substring(1, name.indexOf(" ")); 53 name = name.substring(1, name.indexOf(" "));
57 this.tagName = this.nodeName = name.toUpperCase(); 54 this.tagName = this.nodeName = name.toUpperCase();
58 this.setAttribute("name", nameattr); 55 this.setAttribute("name", nameattr);
59 } 56 }
60}; 57};
61 58
62MochiKit.MockDOM.MockElement.prototype = { 59MochiKit.MockDOM.MockElement.prototype = {
63 /** @id MochiKit.MockDOM.MockElement.prototype.createElement */ 60 /** @id MochiKit.MockDOM.MockElement.prototype.createElement */
64 createElement: function (tagName) { 61 createElement: function (tagName) {
65 return new MochiKit.MockDOM.MockElement(tagName, null, this.nodeType == 9 ? this : this.ownerDocument); 62 return new MochiKit.MockDOM.MockElement(tagName, null, this.nodeType == 9 ? this : this.ownerDocument);
66 }, 63 },
67 /** @id MochiKit.MockDOM.MockElement.prototype.createTextNode */ 64 /** @id MochiKit.MockDOM.MockElement.prototype.createTextNode */
68 createTextNode: function (text) { 65 createTextNode: function (text) {
69 return new MochiKit.MockDOM.MockElement("text", text, this.nodeType == 9 ? this : this.ownerDocument); 66 return new MochiKit.MockDOM.MockElement("text", text, this.nodeType == 9 ? this : this.ownerDocument);
70 }, 67 },
71 /** @id MochiKit.MockDOM.MockElement.prototype.setAttribute */ 68 /** @id MochiKit.MockDOM.MockElement.prototype.setAttribute */
72 setAttribute: function (name, value) { 69 setAttribute: function (name, value) {
73 this[name] = value; 70 this[name] = value;
74 }, 71 },
75 /** @id MochiKit.MockDOM.MockElement.prototype.getAttribute */ 72 /** @id MochiKit.MockDOM.MockElement.prototype.getAttribute */
76 getAttribute: function (name) { 73 getAttribute: function (name) {
77 return this[name]; 74 return this[name];
78 }, 75 },
79 /** @id MochiKit.MockDOM.MockElement.prototype.appendChild */ 76 /** @id MochiKit.MockDOM.MockElement.prototype.appendChild */
80 appendChild: function (child) { 77 appendChild: function (child) {
81 this.childNodes.push(child); 78 this.childNodes.push(child);
82 }, 79 },
83 /** @id MochiKit.MockDOM.MockElement.prototype.toString */ 80 /** @id MochiKit.MockDOM.MockElement.prototype.toString */
84 toString: function () { 81 toString: function () {
diff --git a/frontend/gamma/js/MochiKit/Position.js b/frontend/gamma/js/MochiKit/Position.js
index 6bc5b39..2680507 100644
--- a/frontend/gamma/js/MochiKit/Position.js
+++ b/frontend/gamma/js/MochiKit/Position.js
@@ -1,75 +1,75 @@
1/*** 1/***
2 2
3MochiKit.Position 1.5 3MochiKit.Position 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005-2006 Bob Ippolito and others. All rights Reserved. 7(c) 2005-2006 Bob Ippolito and others. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Position', '1.5', ['Base', 'DOM', 'Style']); 11MochiKit.Base.module(MochiKit, 'Position', '1.5', ['Base', 'DOM', 'Style']);
12 12
13MochiKit.Base.update(MochiKit.Position, { 13MochiKit.Base.update(MochiKit.Position, {
14 // Don't export from this module 14 // Don't export from this module
15 __export__: false, 15 __export__: false,
16 16
17 // set to true if needed, warning: firefox performance problems 17 // set to true if needed, warning: firefox performance problems
18 // NOT neeeded for page scrolling, only if draggable contained in 18 // NOT neeeded for page scrolling, only if draggable contained in
19 // scrollable elements 19 // scrollable elements
20 includeScrollOffsets: false, 20 includeScrollOffsets: false,
21 21
22 /** @id MochiKit.Position.prepare */ 22 /** @id MochiKit.Position.prepare */
23 prepare: function () { 23 prepare: function () {
24 var deltaX = window.pageXOffset 24 var deltaX = window.pageXOffset
25 || document.documentElement.scrollLeft 25 || document.documentElement.scrollLeft
26 || document.body.scrollLeft 26 || document.body.scrollLeft
27 || 0; 27 || 0;
28 var deltaY = window.pageYOffset 28 var deltaY = window.pageYOffset
29 || document.documentElement.scrollTop 29 || document.documentElement.scrollTop
30 || document.body.scrollTop 30 || document.body.scrollTop
31 || 0; 31 || 0;
32 this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); 32 this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY);
33 }, 33 },
34 34
35 /** @id MochiKit.Position.cumulativeOffset */ 35 /** @id MochiKit.Position.cumulativeOffset */
36 cumulativeOffset: function (element) { 36 cumulativeOffset: function (element) {
37 var valueT = 0; 37 var valueT = 0;
38 var valueL = 0; 38 var valueL = 0;
39 do { 39 do {
40 valueT += element.offsetTop || 0; 40 valueT += element.offsetTop || 0;
41 valueL += element.offsetLeft || 0; 41 valueL += element.offsetLeft || 0;
42 element = element.offsetParent; 42 element = element.offsetParent;
43 } while (element); 43 } while (element);
44 return new MochiKit.Style.Coordinates(valueL, valueT); 44 return new MochiKit.Style.Coordinates(valueL, valueT);
45 }, 45 },
46 46
47 /** @id MochiKit.Position.realOffset */ 47 /** @id MochiKit.Position.realOffset */
48 realOffset: function (element) { 48 realOffset: function (element) {
49 var valueT = 0; 49 var valueT = 0;
50 var valueL = 0; 50 var valueL = 0;
51 do { 51 do {
52 valueT += element.scrollTop || 0; 52 valueT += element.scrollTop || 0;
53 valueL += element.scrollLeft || 0; 53 valueL += element.scrollLeft || 0;
54 element = element.parentNode; 54 element = element.parentNode;
55 } while (element); 55 } while (element);
56 return new MochiKit.Style.Coordinates(valueL, valueT); 56 return new MochiKit.Style.Coordinates(valueL, valueT);
57 }, 57 },
58 58
59 /** @id MochiKit.Position.within */ 59 /** @id MochiKit.Position.within */
60 within: function (element, x, y) { 60 within: function (element, x, y) {
61 if (this.includeScrollOffsets) { 61 if (this.includeScrollOffsets) {
62 return this.withinIncludingScrolloffsets(element, x, y); 62 return this.withinIncludingScrolloffsets(element, x, y);
63 } 63 }
64 this.xcomp = x; 64 this.xcomp = x;
65 this.ycomp = y; 65 this.ycomp = y;
66 this.offset = this.cumulativeOffset(element); 66 this.offset = this.cumulativeOffset(element);
67 if (element.style.position == "fixed") { 67 if (element.style.position == "fixed") {
68 this.offset.x += this.windowOffset.x; 68 this.offset.x += this.windowOffset.x;
69 this.offset.y += this.windowOffset.y; 69 this.offset.y += this.windowOffset.y;
70 } 70 }
71 71
72 return (y >= this.offset.y && 72 return (y >= this.offset.y &&
73 y < this.offset.y + element.offsetHeight && 73 y < this.offset.y + element.offsetHeight &&
74 x >= this.offset.x && 74 x >= this.offset.x &&
75 x < this.offset.x + element.offsetWidth); 75 x < this.offset.x + element.offsetWidth);
diff --git a/frontend/gamma/js/MochiKit/Selector.js b/frontend/gamma/js/MochiKit/Selector.js
index 6aec892..3187fe9 100644
--- a/frontend/gamma/js/MochiKit/Selector.js
+++ b/frontend/gamma/js/MochiKit/Selector.js
@@ -1,244 +1,244 @@
1/*** 1/***
2 2
3MochiKit.Selector 1.5 3MochiKit.Selector 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito and others. All rights Reserved. 7(c) 2005 Bob Ippolito and others. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Selector', '1.5', ['Base', 'DOM', 'Iter']); 11MochiKit.Base.module(MochiKit, 'Selector', '1.5', ['Base', 'DOM', 'Iter']);
12 12
13MochiKit.Selector.Selector = function (expression) { 13MochiKit.Selector.Selector = function (expression) {
14 this.params = {classNames: [], pseudoClassNames: []}; 14 this.params = {classNames: [], pseudoClassNames: []};
15 this.expression = expression.toString().replace(/(^\s+|\s+$)/g, ''); 15 this.expression = expression.toString().replace(/(^\s+|\s+$)/g, '');
16 this.parseExpression(); 16 this.parseExpression();
17 this.compileMatcher(); 17 this.compileMatcher();
18}; 18};
19 19
20MochiKit.Selector.Selector.prototype = { 20MochiKit.Selector.Selector.prototype = {
21 /*** 21 /***
22 22
23 Selector class: convenient object to make CSS selections. 23 Selector class: convenient object to make CSS selections.
24 24
25 ***/ 25 ***/
26 __class__: MochiKit.Selector.Selector, 26 __class__: MochiKit.Selector.Selector,
27 27
28 /** @id MochiKit.Selector.Selector.prototype.parseExpression */ 28 /** @id MochiKit.Selector.Selector.prototype.parseExpression */
29 parseExpression: function () { 29 parseExpression: function () {
30 function abort(message) { 30 function abort(message) {
31 throw 'Parse error in selector: ' + message; 31 throw 'Parse error in selector: ' + message;
32 } 32 }
33 33
34 if (this.expression == '') { 34 if (this.expression == '') {
35 abort('empty expression'); 35 abort('empty expression');
36 } 36 }
37 37
38 var repr = MochiKit.Base.repr; 38 var repr = MochiKit.Base.repr;
39 var params = this.params; 39 var params = this.params;
40 var expr = this.expression; 40 var expr = this.expression;
41 var match, modifier, clause, rest; 41 var match, modifier, clause, rest;
42 while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { 42 while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
43 params.attributes = params.attributes || []; 43 params.attributes = params.attributes || [];
44 params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); 44 params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
45 expr = match[1]; 45 expr = match[1];
46 } 46 }
47 47
48 if (expr == '*') { 48 if (expr == '*') {
49 return this.params.wildcard = true; 49 return this.params.wildcard = true;
50 } 50 }
51 51
52 while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)) { 52 while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)) {
53 modifier = match[1]; 53 modifier = match[1];
54 clause = match[2]; 54 clause = match[2];
55 rest = match[3]; 55 rest = match[3];
56 switch (modifier) { 56 switch (modifier) {
57 case '#': 57 case '#':
58 params.id = clause; 58 params.id = clause;
59 break; 59 break;
60 case '.': 60 case '.':
61 params.classNames.push(clause); 61 params.classNames.push(clause);
62 break; 62 break;
63 case ':': 63 case ':':
64 params.pseudoClassNames.push(clause); 64 params.pseudoClassNames.push(clause);
65 break; 65 break;
66 case '': 66 case '':
67 case undefined: 67 case undefined:
68 params.tagName = clause.toUpperCase(); 68 params.tagName = clause.toUpperCase();
69 break; 69 break;
70 default: 70 default:
71 abort(repr(expr)); 71 abort(repr(expr));
72 } 72 }
73 expr = rest; 73 expr = rest;
74 } 74 }
75 75
76 if (expr.length > 0) { 76 if (expr.length > 0) {
77 abort(repr(expr)); 77 abort(repr(expr));
78 } 78 }
79 }, 79 },
80 80
81 /** @id MochiKit.Selector.Selector.prototype.buildMatchExpression */ 81 /** @id MochiKit.Selector.Selector.prototype.buildMatchExpression */
82 buildMatchExpression: function () { 82 buildMatchExpression: function () {
83 var repr = MochiKit.Base.repr; 83 var repr = MochiKit.Base.repr;
84 var params = this.params; 84 var params = this.params;
85 var conditions = []; 85 var conditions = [];
86 var clause, i; 86 var clause, i;
87 87
88 function childElements(element) { 88 function childElements(element) {
89 return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, " + element + ".childNodes)"; 89 return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, " + element + ".childNodes)";
90 } 90 }
91 91
92 if (params.wildcard) { 92 if (params.wildcard) {
93 conditions.push('true'); 93 conditions.push('true');
94 } 94 }
95 if (clause = params.id) { 95 if (clause = params.id) {
96 conditions.push('element.id == ' + repr(clause)); 96 conditions.push('element.id == ' + repr(clause));
97 } 97 }
98 if (clause = params.tagName) { 98 if (clause = params.tagName) {
99 conditions.push('element.tagName.toUpperCase() == ' + repr(clause)); 99 conditions.push('element.tagName.toUpperCase() == ' + repr(clause));
100 } 100 }
101 if ((clause = params.classNames).length > 0) { 101 if ((clause = params.classNames).length > 0) {
102 for (i = 0; i < clause.length; i++) { 102 for (i = 0; i < clause.length; i++) {
103 conditions.push('MochiKit.DOM.hasElementClass(element, ' + repr(clause[i]) + ')'); 103 conditions.push('MochiKit.DOM.hasElementClass(element, ' + repr(clause[i]) + ')');
104 } 104 }
105 } 105 }
106 if ((clause = params.pseudoClassNames).length > 0) { 106 if ((clause = params.pseudoClassNames).length > 0) {
107 for (i = 0; i < clause.length; i++) { 107 for (i = 0; i < clause.length; i++) {
108 var match = clause[i].match(/^([^(]+)(?:\((.*)\))?$/); 108 var match = clause[i].match(/^([^(]+)(?:\((.*)\))?$/);
109 var pseudoClass = match[1]; 109 var pseudoClass = match[1];
110 var pseudoClassArgument = match[2]; 110 var pseudoClassArgument = match[2];
111 switch (pseudoClass) { 111 switch (pseudoClass) {
112 case 'root': 112 case 'root':
113 conditions.push('element.nodeType == 9 || element === element.ownerDocument.documentElement'); break; 113 conditions.push('element.nodeType == 9 || element === element.ownerDocument.documentElement'); break;
114 case 'nth-child': 114 case 'nth-child':
115 case 'nth-last-child': 115 case 'nth-last-child':
116 case 'nth-of-type': 116 case 'nth-of-type':
117 case 'nth-last-of-type': 117 case 'nth-last-of-type':
118 match = pseudoClassArgument.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/); 118 match = pseudoClassArgument.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/);
119 if (!match) { 119 if (!match) {
120 throw "Invalid argument to pseudo element nth-child: " + pseudoClassArgument; 120 throw "Invalid argument to pseudo element nth-child: " + pseudoClassArgument;
121 } 121 }
122 var a, b; 122 var a, b;
123 if (match[0] == 'odd') { 123 if (match[0] == 'odd') {
124 a = 2; 124 a = 2;
125 b = 1; 125 b = 1;
126 } else if (match[0] == 'even') { 126 } else if (match[0] == 'even') {
127 a = 2; 127 a = 2;
128 b = 0; 128 b = 0;
129 } else { 129 } else {
130 a = match[2] && parseInt(match) || null; 130 a = match[2] && parseInt(match, 10) || null;
131 b = parseInt(match[3]); 131 b = parseInt(match[3], 10);
132 } 132 }
133 conditions.push('this.nthChild(element,' + a + ',' + b 133 conditions.push('this.nthChild(element,' + a + ',' + b
134 + ',' + !!pseudoClass.match('^nth-last') // Reverse 134 + ',' + !!pseudoClass.match('^nth-last') // Reverse
135 + ',' + !!pseudoClass.match('of-type$') // Restrict to same tagName 135 + ',' + !!pseudoClass.match('of-type$') // Restrict to same tagName
136 + ')'); 136 + ')');
137 break; 137 break;
138 case 'first-child': 138 case 'first-child':
139 conditions.push('this.nthChild(element, null, 1)'); 139 conditions.push('this.nthChild(element, null, 1)');
140 break; 140 break;
141 case 'last-child': 141 case 'last-child':
142 conditions.push('this.nthChild(element, null, 1, true)'); 142 conditions.push('this.nthChild(element, null, 1, true)');
143 break; 143 break;
144 case 'first-of-type': 144 case 'first-of-type':
145 conditions.push('this.nthChild(element, null, 1, false, true)'); 145 conditions.push('this.nthChild(element, null, 1, false, true)');
146 break; 146 break;
147 case 'last-of-type': 147 case 'last-of-type':
148 conditions.push('this.nthChild(element, null, 1, true, true)'); 148 conditions.push('this.nthChild(element, null, 1, true, true)');
149 break; 149 break;
150 case 'only-child': 150 case 'only-child':
151 conditions.push(childElements('element.parentNode') + '.length == 1'); 151 conditions.push(childElements('element.parentNode') + '.length == 1');
152 break; 152 break;
153 case 'only-of-type': 153 case 'only-of-type':
154 conditions.push('MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, ' + childElements('element.parentNode') + ').length == 1'); 154 conditions.push('MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, ' + childElements('element.parentNode') + ').length == 1');
155 break; 155 break;
156 case 'empty': 156 case 'empty':
157 conditions.push('element.childNodes.length == 0'); 157 conditions.push('element.childNodes.length == 0');
158 break; 158 break;
159 case 'enabled': 159 case 'enabled':
160 conditions.push('(this.isUIElement(element) && element.disabled === false)'); 160 conditions.push('(this.isUIElement(element) && element.disabled === false)');
161 break; 161 break;
162 case 'disabled': 162 case 'disabled':
163 conditions.push('(this.isUIElement(element) && element.disabled === true)'); 163 conditions.push('(this.isUIElement(element) && element.disabled === true)');
164 break; 164 break;
165 case 'checked': 165 case 'checked':
166 conditions.push('(this.isUIElement(element) && element.checked === true)'); 166 conditions.push('(this.isUIElement(element) && element.checked === true)');
167 break; 167 break;
168 case 'not': 168 case 'not':
169 var subselector = new MochiKit.Selector.Selector(pseudoClassArgument); 169 var subselector = new MochiKit.Selector.Selector(pseudoClassArgument);
170 conditions.push('!( ' + subselector.buildMatchExpression() + ')') 170 conditions.push('!( ' + subselector.buildMatchExpression() + ')');
171 break; 171 break;
172 } 172 }
173 } 173 }
174 } 174 }
175 if (clause = params.attributes) { 175 if (clause = params.attributes) {
176 MochiKit.Base.map(function (attribute) { 176 MochiKit.Base.map(function (attribute) {
177 var value = 'MochiKit.DOM.getNodeAttribute(element, ' + repr(attribute.name) + ')'; 177 var value = 'MochiKit.DOM.getNodeAttribute(element, ' + repr(attribute.name) + ')';
178 var splitValueBy = function (delimiter) { 178 var splitValueBy = function (delimiter) {
179 return value + '.split(' + repr(delimiter) + ')'; 179 return value + '.split(' + repr(delimiter) + ')';
180 } 180 };
181 conditions.push(value + ' != null'); 181 conditions.push(value + ' != null');
182 switch (attribute.operator) { 182 switch (attribute.operator) {
183 case '=': 183 case '=':
184 conditions.push(value + ' == ' + repr(attribute.value)); 184 conditions.push(value + ' == ' + repr(attribute.value));
185 break; 185 break;
186 case '~=': 186 case '~=':
187 conditions.push('MochiKit.Base.findValue(' + splitValueBy(' ') + ', ' + repr(attribute.value) + ') > -1'); 187 conditions.push('MochiKit.Base.findValue(' + splitValueBy(' ') + ', ' + repr(attribute.value) + ') > -1');
188 break; 188 break;
189 case '^=': 189 case '^=':
190 conditions.push(value + '.substring(0, ' + attribute.value.length + ') == ' + repr(attribute.value)); 190 conditions.push(value + '.substring(0, ' + attribute.value.length + ') == ' + repr(attribute.value));
191 break; 191 break;
192 case '$=': 192 case '$=':
193 conditions.push(value + '.substring(' + value + '.length - ' + attribute.value.length + ') == ' + repr(attribute.value)); 193 conditions.push(value + '.substring(' + value + '.length - ' + attribute.value.length + ') == ' + repr(attribute.value));
194 break; 194 break;
195 case '*=': 195 case '*=':
196 conditions.push(value + '.match(' + repr(attribute.value) + ')'); 196 conditions.push(value + '.match(' + repr(attribute.value) + ')');
197 break; 197 break;
198 case '|=': 198 case '|=':
199 conditions.push(splitValueBy('-') + '[0].toUpperCase() == ' + repr(attribute.value.toUpperCase())); 199 conditions.push(splitValueBy('-') + '[0].toUpperCase() == ' + repr(attribute.value.toUpperCase()));
200 break; 200 break;
201 case '!=': 201 case '!=':
202 conditions.push(value + ' != ' + repr(attribute.value)); 202 conditions.push(value + ' != ' + repr(attribute.value));
203 break; 203 break;
204 case '': 204 case '':
205 case undefined: 205 case undefined:
206 // Condition already added above 206 // Condition already added above
207 break; 207 break;
208 default: 208 default:
209 throw 'Unknown operator ' + attribute.operator + ' in selector'; 209 throw 'Unknown operator ' + attribute.operator + ' in selector';
210 } 210 }
211 }, clause); 211 }, clause);
212 } 212 }
213 213
214 return conditions.join(' && '); 214 return conditions.join(' && ');
215 }, 215 },
216 216
217 /** @id MochiKit.Selector.Selector.prototype.compileMatcher */ 217 /** @id MochiKit.Selector.Selector.prototype.compileMatcher */
218 compileMatcher: function () { 218 compileMatcher: function () {
219 var code = 'return (!element.tagName) ? false : ' + 219 var code = 'return (!element.tagName) ? false : ' +
220 this.buildMatchExpression() + ';'; 220 this.buildMatchExpression() + ';';
221 this.match = new Function('element', code); 221 this.match = new Function('element', code);
222 }, 222 },
223 223
224 /** @id MochiKit.Selector.Selector.prototype.nthChild */ 224 /** @id MochiKit.Selector.Selector.prototype.nthChild */
225 nthChild: function (element, a, b, reverse, sametag){ 225 nthChild: function (element, a, b, reverse, sametag){
226 var siblings = MochiKit.Base.filter(function (node) { 226 var siblings = MochiKit.Base.filter(function (node) {
227 return node.nodeType == 1; 227 return node.nodeType == 1;
228 }, element.parentNode.childNodes); 228 }, element.parentNode.childNodes);
229 if (sametag) { 229 if (sametag) {
230 siblings = MochiKit.Base.filter(function (node) { 230 siblings = MochiKit.Base.filter(function (node) {
231 return node.tagName == element.tagName; 231 return node.tagName == element.tagName;
232 }, siblings); 232 }, siblings);
233 } 233 }
234 if (reverse) { 234 if (reverse) {
235 siblings = MochiKit.Iter.reversed(siblings); 235 siblings = MochiKit.Iter.reversed(siblings);
236 } 236 }
237 if (a) { 237 if (a) {
238 var actualIndex = MochiKit.Base.findIdentical(siblings, element); 238 var actualIndex = MochiKit.Base.findIdentical(siblings, element);
239 return ((actualIndex + 1 - b) / a) % 1 == 0; 239 return ((actualIndex + 1 - b) / a) % 1 == 0;
240 } else { 240 } else {
241 return b == MochiKit.Base.findIdentical(siblings, element) + 1; 241 return b == MochiKit.Base.findIdentical(siblings, element) + 1;
242 } 242 }
243 }, 243 },
244 244
@@ -291,97 +291,103 @@ MochiKit.Selector.Selector.prototype = {
291 } 291 }
292 return node; 292 return node;
293 } 293 }
294 294
295 if (axis == "") { 295 if (axis == "") {
296 scope = (scope || MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName || '*'); 296 scope = (scope || MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName || '*');
297 } else if (axis == ">") { 297 } else if (axis == ">") {
298 if (!scope) { 298 if (!scope) {
299 throw "> combinator not allowed without preceeding expression"; 299 throw "> combinator not allowed without preceeding expression";
300 } 300 }
301 scope = MochiKit.Base.filter(function (node) { 301 scope = MochiKit.Base.filter(function (node) {
302 return node.nodeType == 1; 302 return node.nodeType == 1;
303 }, scope.childNodes); 303 }, scope.childNodes);
304 } else if (axis == "+") { 304 } else if (axis == "+") {
305 if (!scope) { 305 if (!scope) {
306 throw "+ combinator not allowed without preceeding expression"; 306 throw "+ combinator not allowed without preceeding expression";
307 } 307 }
308 scope = nextSiblingElement(scope) && [nextSiblingElement(scope)]; 308 scope = nextSiblingElement(scope) && [nextSiblingElement(scope)];
309 } else if (axis == "~") { 309 } else if (axis == "~") {
310 if (!scope) { 310 if (!scope) {
311 throw "~ combinator not allowed without preceeding expression"; 311 throw "~ combinator not allowed without preceeding expression";
312 } 312 }
313 var newscope = []; 313 var newscope = [];
314 while (nextSiblingElement(scope)) { 314 while (nextSiblingElement(scope)) {
315 scope = nextSiblingElement(scope); 315 scope = nextSiblingElement(scope);
316 newscope.push(scope); 316 newscope.push(scope);
317 } 317 }
318 scope = newscope; 318 scope = newscope;
319 } 319 }
320 320
321 if (!scope) { 321 if (!scope) {
322 return []; 322 return [];
323 } 323 }
324 324
325 var results = MochiKit.Base.filter(MochiKit.Base.bind(function (scopeElt) { 325 var results = MochiKit.Base.filter(MochiKit.Base.bind(function (scopeElt) {
326 return this.match(scopeElt); 326 return this.match(scopeElt);
327 }, this), scope); 327 }, this), scope);
328 328
329 return results; 329 return results;
330 }, 330 },
331 331
332 /** @id MochiKit.Selector.Selector.prototype.repr */ 332 /** @id MochiKit.Selector.Selector.prototype.repr */
333 repr: function () { 333 repr: function () {
334 return 'Selector(' + this.expression + ')'; 334 return 'Selector(' + this.expression + ')';
335 }, 335 },
336 336
337 toString: MochiKit.Base.forwardCall("repr") 337 toString: MochiKit.Base.forwardCall("repr")
338}; 338};
339 339
340MochiKit.Base.update(MochiKit.Selector, { 340MochiKit.Base.update(MochiKit.Selector, {
341 341
342 /** @id MochiKit.Selector.findChildElements */ 342 /** @id MochiKit.Selector.findChildElements */
343 findChildElements: function (element, expressions) { 343 findChildElements: function (element, expressions) {
344 element = MochiKit.DOM.getElement(element); 344 element = MochiKit.DOM.getElement(element);
345 var uniq = function(arr) { 345 var uniq = function(arr) {
346 var res = []; 346 var res = [];
347 for (var i = 0; i < arr.length; i++) { 347 for (var i = 0; i < arr.length; i++) {
348 if (MochiKit.Base.findIdentical(res, arr[i]) < 0) { 348 if (MochiKit.Base.findIdentical(res, arr[i]) < 0) {
349 res.push(arr[i]); 349 res.push(arr[i]);
350 } 350 }
351 } 351 }
352 return res; 352 return res;
353 }; 353 };
354 return MochiKit.Base.flattenArray(MochiKit.Base.map(function (expression) { 354 return MochiKit.Base.flattenArray(MochiKit.Base.map(function (expression) {
355 try {
356 var res = element.querySelectorAll(expression);
357 return Array.prototype.slice.call(res, 0);
358 } catch (ignore) {
359 // No querySelectorAll or extended expression syntax used
360 }
355 var nextScope = ""; 361 var nextScope = "";
356 var reducer = function (results, expr) { 362 var reducer = function (results, expr) {
357 var match = expr.match(/^[>+~]$/); 363 var match = expr.match(/^[>+~]$/);
358 if (match) { 364 if (match) {
359 nextScope = match[0]; 365 nextScope = match[0];
360 return results; 366 return results;
361 } else { 367 } else {
362 var selector = new MochiKit.Selector.Selector(expr); 368 var selector = new MochiKit.Selector.Selector(expr);
363 var elements = MochiKit.Iter.reduce(function (elements, result) { 369 var elements = MochiKit.Iter.reduce(function (elements, result) {
364 return MochiKit.Base.extend(elements, selector.findElements(result || element, nextScope)); 370 return MochiKit.Base.extend(elements, selector.findElements(result || element, nextScope));
365 }, results, []); 371 }, results, []);
366 nextScope = ""; 372 nextScope = "";
367 return elements; 373 return elements;
368 } 374 }
369 }; 375 };
370 var exprs = expression.replace(/(^\s+|\s+$)/g, '').split(/\s+/); 376 var exprs = expression.replace(/(^\s+|\s+$)/g, '').split(/\s+/);
371 return uniq(MochiKit.Iter.reduce(reducer, exprs, [null])); 377 return uniq(MochiKit.Iter.reduce(reducer, exprs, [null]));
372 }, expressions)); 378 }, expressions));
373 }, 379 },
374 380
375 findDocElements: function () { 381 findDocElements: function () {
376 return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(), arguments); 382 return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(), arguments);
377 }, 383 },
378 384
379 __new__: function () { 385 __new__: function () {
380 this.$$ = this.findDocElements; 386 this.$$ = this.findDocElements;
381 MochiKit.Base.nameFunctions(this); 387 MochiKit.Base.nameFunctions(this);
382 } 388 }
383}); 389});
384 390
385MochiKit.Selector.__new__(); 391MochiKit.Selector.__new__();
386 392
387MochiKit.Base._exportSymbols(this, MochiKit.Selector); 393MochiKit.Base._exportSymbols(this, MochiKit.Selector);
diff --git a/frontend/gamma/js/MochiKit/Signal.js b/frontend/gamma/js/MochiKit/Signal.js
index 7df5619..11590c1 100644
--- a/frontend/gamma/js/MochiKit/Signal.js
+++ b/frontend/gamma/js/MochiKit/Signal.js
@@ -1,75 +1,75 @@
1/*** 1/***
2 2
3MochiKit.Signal 1.5 3MochiKit.Signal 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved. 7(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Signal', '1.5', ['Base', 'DOM', 'Style']); 11MochiKit.Base.module(MochiKit, 'Signal', '1.5', ['Base', 'DOM']);
12 12
13MochiKit.Signal._observers = []; 13MochiKit.Signal._observers = [];
14 14
15/** @id MochiKit.Signal.Event */ 15/** @id MochiKit.Signal.Event */
16MochiKit.Signal.Event = function (src, e) { 16MochiKit.Signal.Event = function (src, e) {
17 this._event = e || window.event; 17 this._event = e || window.event;
18 this._src = src; 18 this._src = src;
19}; 19};
20MochiKit.Signal.Event.__export__ = false; 20MochiKit.Signal.Event.__export__ = false;
21 21
22MochiKit.Base.update(MochiKit.Signal.Event.prototype, { 22MochiKit.Base.update(MochiKit.Signal.Event.prototype, {
23 23
24 __repr__: function () { 24 __repr__: function () {
25 var repr = MochiKit.Base.repr; 25 var repr = MochiKit.Base.repr;
26 var str = '{event(): ' + repr(this.event()) + 26 var str = '{event(): ' + repr(this.event()) +
27 ', src(): ' + repr(this.src()) + 27 ', src(): ' + repr(this.src()) +
28 ', type(): ' + repr(this.type()) + 28 ', type(): ' + repr(this.type()) +
29 ', target(): ' + repr(this.target()); 29 ', target(): ' + repr(this.target());
30 30
31 if (this.type() && 31 if (this.type() &&
32 this.type().indexOf('key') === 0 || 32 this.type().indexOf('key') === 0 ||
33 this.type().indexOf('mouse') === 0 || 33 this.type().indexOf('mouse') === 0 ||
34 this.type().indexOf('click') != -1 || 34 this.type().indexOf('click') != -1 ||
35 this.type() == 'contextmenu') { 35 this.type() == 'contextmenu') {
36 str += ', modifier(): ' + '{alt: ' + repr(this.modifier().alt) + 36 str += ', modifier(): ' + '{alt: ' + repr(this.modifier().alt) +
37 ', ctrl: ' + repr(this.modifier().ctrl) + 37 ', ctrl: ' + repr(this.modifier().ctrl) +
38 ', meta: ' + repr(this.modifier().meta) + 38 ', meta: ' + repr(this.modifier().meta) +
39 ', shift: ' + repr(this.modifier().shift) + 39 ', shift: ' + repr(this.modifier().shift) +
40 ', any: ' + repr(this.modifier().any) + '}'; 40 ', any: ' + repr(this.modifier().any) + '}';
41 } 41 }
42 42
43 if (this.type() && this.type().indexOf('key') === 0) { 43 if (this.type() && this.type().indexOf('key') === 0) {
44 str += ', key(): {code: ' + repr(this.key().code) + 44 str += ', key(): {code: ' + repr(this.key().code) +
45 ', string: ' + repr(this.key().string) + '}'; 45 ', string: ' + repr(this.key().string) + '}';
46 } 46 }
47 47
48 if (this.type() && ( 48 if (this.type() && (
49 this.type().indexOf('mouse') === 0 || 49 this.type().indexOf('mouse') === 0 ||
50 this.type().indexOf('click') != -1 || 50 this.type().indexOf('click') != -1 ||
51 this.type() == 'contextmenu')) { 51 this.type() == 'contextmenu')) {
52 52
53 str += ', mouse(): {page: ' + repr(this.mouse().page) + 53 str += ', mouse(): {page: ' + repr(this.mouse().page) +
54 ', client: ' + repr(this.mouse().client); 54 ', client: ' + repr(this.mouse().client);
55 55
56 if (this.type() != 'mousemove' && this.type() != 'mousewheel') { 56 if (this.type() != 'mousemove' && this.type() != 'mousewheel') {
57 str += ', button: {left: ' + repr(this.mouse().button.left) + 57 str += ', button: {left: ' + repr(this.mouse().button.left) +
58 ', middle: ' + repr(this.mouse().button.middle) + 58 ', middle: ' + repr(this.mouse().button.middle) +
59 ', right: ' + repr(this.mouse().button.right) + '}'; 59 ', right: ' + repr(this.mouse().button.right) + '}';
60 } 60 }
61 if (this.type() == 'mousewheel') { 61 if (this.type() == 'mousewheel') {
62 str += ', wheel: ' + repr(this.mouse().wheel); 62 str += ', wheel: ' + repr(this.mouse().wheel);
63 } 63 }
64 str += '}'; 64 str += '}';
65 } 65 }
66 if (this.type() == 'mouseover' || this.type() == 'mouseout' || 66 if (this.type() == 'mouseover' || this.type() == 'mouseout' ||
67 this.type() == 'mouseenter' || this.type() == 'mouseleave') { 67 this.type() == 'mouseenter' || this.type() == 'mouseleave') {
68 str += ', relatedTarget(): ' + repr(this.relatedTarget()); 68 str += ', relatedTarget(): ' + repr(this.relatedTarget());
69 } 69 }
70 str += '}'; 70 str += '}';
71 return str; 71 return str;
72 }, 72 },
73 73
74 /** @id MochiKit.Signal.Event.prototype.toString */ 74 /** @id MochiKit.Signal.Event.prototype.toString */
75 toString: function () { 75 toString: function () {
@@ -205,200 +205,201 @@ MochiKit.Base.update(MochiKit.Signal.Event.prototype, {
205 a kp 97 97 205 a kp 97 97
206 shift+a ku,kd 65 65 206 shift+a ku,kd 65 65
207 shift+a kp 65 65 207 shift+a kp 65 65
208 1 ku,kd 49 49 208 1 ku,kd 49 49
209 1 kp 49 49 209 1 kp 49 49
210 shift+1 ku,kd 33 49 210 shift+1 ku,kd 33 49
211 shift+1 kp 33 33 211 shift+1 kp 33 33
212 212
213 */ 213 */
214 214
215 /* look for special keys here */ 215 /* look for special keys here */
216 if (this.type() == 'keydown' || this.type() == 'keyup') { 216 if (this.type() == 'keydown' || this.type() == 'keyup') {
217 k.code = this._event.keyCode; 217 k.code = this._event.keyCode;
218 k.string = (MochiKit.Signal._specialKeys[k.code] || 218 k.string = (MochiKit.Signal._specialKeys[k.code] ||
219 'KEY_UNKNOWN'); 219 'KEY_UNKNOWN');
220 this._key = k; 220 this._key = k;
221 return k; 221 return k;
222 222
223 /* look for characters here */ 223 /* look for characters here */
224 } else if (this.type() == 'keypress') { 224 } else if (this.type() == 'keypress') {
225 225
226 /* 226 /*
227 227
228 Special key behavior: 228 Special key behavior:
229 229
230 IE: does not fire keypress events for special keys 230 IE: does not fire keypress events for special keys
231 FF: sets charCode to 0, and sets the correct keyCode 231 FF: sets charCode to 0, and sets the correct keyCode
232 Safari: sets keyCode and charCode to something stupid 232 Safari: sets keyCode and charCode to something stupid
233 233
234 */ 234 */
235 235
236 k.code = 0; 236 k.code = 0;
237 k.string = ''; 237 k.string = '';
238 238
239 if (typeof(this._event.charCode) != 'undefined' && 239 if (typeof(this._event.charCode) != 'undefined' &&
240 this._event.charCode !== 0 && 240 this._event.charCode !== 0 &&
241 !MochiKit.Signal._specialMacKeys[this._event.charCode]) { 241 !MochiKit.Signal._specialMacKeys[this._event.charCode]) {
242 k.code = this._event.charCode; 242 k.code = this._event.charCode;
243 k.string = String.fromCharCode(k.code); 243 k.string = String.fromCharCode(k.code);
244 } else if (this._event.keyCode && 244 } else if (this._event.keyCode &&
245 typeof(this._event.charCode) == 'undefined') { // IE 245 typeof(this._event.charCode) == 'undefined') { // IE
246 k.code = this._event.keyCode; 246 k.code = this._event.keyCode;
247 k.string = String.fromCharCode(k.code); 247 k.string = String.fromCharCode(k.code);
248 } 248 }
249 249
250 this._key = k; 250 this._key = k;
251 return k; 251 return k;
252 } 252 }
253 } 253 }
254 return undefined; 254 return undefined;
255 }, 255 },
256 256
257 _mouse: null, 257 _mouse: null,
258 /** @id MochiKit.Signal.Event.prototype.mouse */ 258 /** @id MochiKit.Signal.Event.prototype.mouse */
259 mouse: function () { 259 mouse: function () {
260 if (this._mouse !== null) { 260 if (this._mouse !== null) {
261 return this._mouse; 261 return this._mouse;
262 } 262 }
263 263
264 var m = {}; 264 var m = {};
265 var e = this._event; 265 var e = this._event;
266 266
267 if (this.type() && ( 267 if (this.type() && (
268 this.type().indexOf('mouse') === 0 || 268 this.type().indexOf('mouse') === 0 ||
269 this.type().indexOf('drag') === 0 ||
269 this.type().indexOf('click') != -1 || 270 this.type().indexOf('click') != -1 ||
270 this.type() == 'contextmenu')) { 271 this.type() == 'contextmenu')) {
271 272
272 m.client = new MochiKit.Style.Coordinates(0, 0); 273 m.client = { x: 0, y: 0 };
273 if (e.clientX || e.clientY) { 274 if (e.clientX || e.clientY) {
274 m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX; 275 m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX;
275 m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY; 276 m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY;
276 } 277 }
277 278
278 m.page = new MochiKit.Style.Coordinates(0, 0); 279 m.page = { x: 0, y: 0 };
279 if (e.pageX || e.pageY) { 280 if (e.pageX || e.pageY) {
280 m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX; 281 m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX;
281 m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY; 282 m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY;
282 } else { 283 } else {
283 /* 284 /*
284 285
285 The IE shortcut can be off by two. We fix it. See: 286 The IE shortcut can be off by two. We fix it. See:
286 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp 287 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp
287 288
288 This is similar to the method used in 289 This is similar to the method used in
289 MochiKit.Style.getElementPosition(). 290 MochiKit.Style.getElementPosition().
290 291
291 */ 292 */
292 var de = MochiKit.DOM._document.documentElement; 293 var de = MochiKit.DOM._document.documentElement;
293 var b = MochiKit.DOM._document.body; 294 var b = MochiKit.DOM._document.body;
294 295
295 m.page.x = e.clientX + 296 m.page.x = e.clientX +
296 (de.scrollLeft || b.scrollLeft) - 297 (de.scrollLeft || b.scrollLeft) -
297 (de.clientLeft || 0); 298 (de.clientLeft || 0);
298 299
299 m.page.y = e.clientY + 300 m.page.y = e.clientY +
300 (de.scrollTop || b.scrollTop) - 301 (de.scrollTop || b.scrollTop) -
301 (de.clientTop || 0); 302 (de.clientTop || 0);
302 303
303 } 304 }
304 if (this.type() != 'mousemove' && this.type() != 'mousewheel') { 305 if (this.type() != 'mousemove' && this.type() != 'mousewheel') {
305 m.button = {}; 306 m.button = {};
306 m.button.left = false; 307 m.button.left = false;
307 m.button.right = false; 308 m.button.right = false;
308 m.button.middle = false; 309 m.button.middle = false;
309 310
310 /* we could check e.button, but which is more consistent */ 311 /* we could check e.button, but which is more consistent */
311 if (e.which) { 312 if (e.which) {
312 m.button.left = (e.which == 1); 313 m.button.left = (e.which == 1);
313 m.button.middle = (e.which == 2); 314 m.button.middle = (e.which == 2);
314 m.button.right = (e.which == 3); 315 m.button.right = (e.which == 3);
315 316
316 /* 317 /*
317 318
318 Mac browsers and right click: 319 Mac browsers and right click:
319 320
320 - Safari doesn't fire any click events on a right 321 - Safari doesn't fire any click events on a right
321 click: 322 click:
322 http://bugs.webkit.org/show_bug.cgi?id=6595 323 http://bugs.webkit.org/show_bug.cgi?id=6595
323 324
324 - Firefox fires the event, and sets ctrlKey = true 325 - Firefox fires the event, and sets ctrlKey = true
325 326
326 - Opera fires the event, and sets metaKey = true 327 - Opera fires the event, and sets metaKey = true
327 328
328 oncontextmenu is fired on right clicks between 329 oncontextmenu is fired on right clicks between
329 browsers and across platforms. 330 browsers and across platforms.
330 331
331 */ 332 */
332 333
333 } else { 334 } else {
334 m.button.left = !!(e.button & 1); 335 m.button.left = !!(e.button & 1);
335 m.button.right = !!(e.button & 2); 336 m.button.right = !!(e.button & 2);
336 m.button.middle = !!(e.button & 4); 337 m.button.middle = !!(e.button & 4);
337 } 338 }
338 } 339 }
339 if (this.type() == 'mousewheel') { 340 if (this.type() == 'mousewheel') {
340 m.wheel = new MochiKit.Style.Coordinates(0, 0); 341 m.wheel = { x: 0, y: 0 };
341 if (e.wheelDeltaX || e.wheelDeltaY) { 342 if (e.wheelDeltaX || e.wheelDeltaY) {
342 m.wheel.x = e.wheelDeltaX / -40 || 0; 343 m.wheel.x = e.wheelDeltaX / -40 || 0;
343 m.wheel.y = e.wheelDeltaY / -40 || 0; 344 m.wheel.y = e.wheelDeltaY / -40 || 0;
344 } else if (e.wheelDelta) { 345 } else if (e.wheelDelta) {
345 m.wheel.y = e.wheelDelta / -40; 346 m.wheel.y = e.wheelDelta / -40;
346 } else { 347 } else {
347 m.wheel.y = e.detail || 0; 348 m.wheel.y = e.detail || 0;
348 } 349 }
349 } 350 }
350 this._mouse = m; 351 this._mouse = m;
351 return m; 352 return m;
352 } 353 }
353 return undefined; 354 return undefined;
354 }, 355 },
355 356
356 /** @id MochiKit.Signal.Event.prototype.stop */ 357 /** @id MochiKit.Signal.Event.prototype.stop */
357 stop: function () { 358 stop: function () {
358 this.stopPropagation(); 359 this.stopPropagation();
359 this.preventDefault(); 360 this.preventDefault();
360 }, 361 },
361 362
362 /** @id MochiKit.Signal.Event.prototype.stopPropagation */ 363 /** @id MochiKit.Signal.Event.prototype.stopPropagation */
363 stopPropagation: function () { 364 stopPropagation: function () {
364 if (this._event.stopPropagation) { 365 if (this._event.stopPropagation) {
365 this._event.stopPropagation(); 366 this._event.stopPropagation();
366 } else { 367 } else {
367 this._event.cancelBubble = true; 368 this._event.cancelBubble = true;
368 } 369 }
369 }, 370 },
370 371
371 /** @id MochiKit.Signal.Event.prototype.preventDefault */ 372 /** @id MochiKit.Signal.Event.prototype.preventDefault */
372 preventDefault: function () { 373 preventDefault: function () {
373 if (this._event.preventDefault) { 374 if (this._event.preventDefault) {
374 this._event.preventDefault(); 375 this._event.preventDefault();
375 } else if (this._confirmUnload === null) { 376 } else if (this._confirmUnload === null) {
376 this._event.returnValue = false; 377 this._event.returnValue = false;
377 } 378 }
378 }, 379 },
379 380
380 _confirmUnload: null, 381 _confirmUnload: null,
381 382
382 /** @id MochiKit.Signal.Event.prototype.confirmUnload */ 383 /** @id MochiKit.Signal.Event.prototype.confirmUnload */
383 confirmUnload: function (msg) { 384 confirmUnload: function (msg) {
384 if (this.type() == 'beforeunload') { 385 if (this.type() == 'beforeunload') {
385 this._confirmUnload = msg; 386 this._confirmUnload = msg;
386 this._event.returnValue = msg; 387 this._event.returnValue = msg;
387 } 388 }
388 } 389 }
389}); 390});
390 391
391/* Safari sets keyCode to these special values onkeypress. */ 392/* Safari sets keyCode to these special values onkeypress. */
392MochiKit.Signal._specialMacKeys = { 393MochiKit.Signal._specialMacKeys = {
393 3: 'KEY_ENTER', 394 3: 'KEY_ENTER',
394 63289: 'KEY_NUM_PAD_CLEAR', 395 63289: 'KEY_NUM_PAD_CLEAR',
395 63276: 'KEY_PAGE_UP', 396 63276: 'KEY_PAGE_UP',
396 63277: 'KEY_PAGE_DOWN', 397 63277: 'KEY_PAGE_DOWN',
397 63275: 'KEY_END', 398 63275: 'KEY_END',
398 63273: 'KEY_HOME', 399 63273: 'KEY_HOME',
399 63234: 'KEY_ARROW_LEFT', 400 63234: 'KEY_ARROW_LEFT',
400 63232: 'KEY_ARROW_UP', 401 63232: 'KEY_ARROW_UP',
401 63235: 'KEY_ARROW_RIGHT', 402 63235: 'KEY_ARROW_RIGHT',
402 63233: 'KEY_ARROW_DOWN', 403 63233: 'KEY_ARROW_DOWN',
403 63302: 'KEY_INSERT', 404 63302: 'KEY_INSERT',
404 63272: 'KEY_DELETE' 405 63272: 'KEY_DELETE'
@@ -611,278 +612,290 @@ MochiKit.Base.update(MochiKit.Signal, {
611 func = objOrFunc; 612 func = objOrFunc;
612 } 613 }
613 return [obj, func]; 614 return [obj, func];
614 }, 615 },
615 616
616 /** @id MochiKit.Signal.connect */ 617 /** @id MochiKit.Signal.connect */
617 connect: function (src, sig, objOrFunc/* optional */, funcOrStr) { 618 connect: function (src, sig, objOrFunc/* optional */, funcOrStr) {
618 if (typeof(src) == "string") { 619 if (typeof(src) == "string") {
619 src = MochiKit.DOM.getElement(src); 620 src = MochiKit.DOM.getElement(src);
620 } 621 }
621 var self = MochiKit.Signal; 622 var self = MochiKit.Signal;
622 623
623 if (typeof(sig) != 'string') { 624 if (typeof(sig) != 'string') {
624 throw new Error("'sig' must be a string"); 625 throw new Error("'sig' must be a string");
625 } 626 }
626 627
627 var destPair = self._getDestPair(objOrFunc, funcOrStr); 628 var destPair = self._getDestPair(objOrFunc, funcOrStr);
628 var obj = destPair[0]; 629 var obj = destPair[0];
629 var func = destPair[1]; 630 var func = destPair[1];
630 if (typeof(obj) == 'undefined' || obj === null) { 631 if (typeof(obj) == 'undefined' || obj === null) {
631 obj = src; 632 obj = src;
632 } 633 }
633 634
634 var isDOM = !!(src.addEventListener || src.attachEvent); 635 var isDOM = !!(src.addEventListener || src.attachEvent);
635 if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave") 636 if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave")
636 && !self._browserAlreadyHasMouseEnterAndLeave()) { 637 && !self._browserAlreadyHasMouseEnterAndLeave()) {
637 var listener = self._mouseEnterListener(src, sig.substr(2), func, obj); 638 var listener = self._mouseEnterListener(src, sig.substr(2), func, obj);
638 if (sig === "onmouseenter") { 639 if (sig === "onmouseenter") {
639 sig = "onmouseover"; 640 sig = "onmouseover";
640 } else { 641 } else {
641 sig = "onmouseout"; 642 sig = "onmouseout";
642 } 643 }
643 } else if (isDOM && sig == "onmousewheel" && self._browserLacksMouseWheelEvent()) { 644 } else if (isDOM && sig == "onmousewheel" && self._browserLacksMouseWheelEvent()) {
644 var listener = self._listener(src, sig, func, obj, isDOM); 645 var listener = self._listener(src, sig, func, obj, isDOM);
645 sig = "onDOMMouseScroll"; 646 sig = "onDOMMouseScroll";
646 } else { 647 } else {
647 var listener = self._listener(src, sig, func, obj, isDOM); 648 var listener = self._listener(src, sig, func, obj, isDOM);
648 } 649 }
649 650
650 if (src.addEventListener) { 651 if (src.addEventListener) {
651 src.addEventListener(sig.substr(2), listener, false); 652 src.addEventListener(sig.substr(2), listener, false);
652 } else if (src.attachEvent) { 653 } else if (src.attachEvent) {
653 src.attachEvent(sig, listener); // useCapture unsupported 654 src.attachEvent(sig, listener); // useCapture unsupported
654 } 655 }
655 656
656 var ident = new MochiKit.Signal.Ident({ 657 var ident = new MochiKit.Signal.Ident({
657 source: src, 658 source: src,
658 signal: sig, 659 signal: sig,
659 listener: listener, 660 listener: listener,
660 isDOM: isDOM, 661 isDOM: isDOM,
661 objOrFunc: objOrFunc, 662 objOrFunc: objOrFunc,
662 funcOrStr: funcOrStr, 663 funcOrStr: funcOrStr,
663 connected: true 664 connected: true
664 }); 665 });
665 self._observers.push(ident); 666 self._observers.push(ident);
666 667
667 if (!isDOM && typeof(src.__connect__) == 'function') { 668 if (!isDOM && typeof(src.__connect__) == 'function') {
668 var args = MochiKit.Base.extend([ident], arguments, 1); 669 var args = MochiKit.Base.extend([ident], arguments, 1);
669 src.__connect__.apply(src, args); 670 src.__connect__.apply(src, args);
670 } 671 }
671 672
672 return ident; 673 return ident;
673 }, 674 },
674 675
676 /** @id MochiKit.Signal.connectOnce */
677 connectOnce: function (src, sig, objOrFunc/* optional */, funcOrStr) {
678 var self = MochiKit.Signal;
679 var ident1 = self.connect(src, sig, objOrFunc, funcOrStr);
680 var ident2;
681 ident2 = self.connect(src, sig, function() {
682 self.disconnect(ident1);
683 self.disconnect(ident2);
684 });
685 return ident1;
686 },
687
675 _disconnect: function (ident) { 688 _disconnect: function (ident) {
676 // already disconnected 689 // already disconnected
677 if (!ident.connected) { 690 if (!ident.connected) {
678 return; 691 return;
679 } 692 }
680 ident.connected = false; 693 ident.connected = false;
681 var src = ident.source; 694 var src = ident.source;
682 var sig = ident.signal; 695 var sig = ident.signal;
683 var listener = ident.listener; 696 var listener = ident.listener;
684 // check isDOM 697 // check isDOM
685 if (!ident.isDOM) { 698 if (!ident.isDOM) {
686 if (typeof(src.__disconnect__) == 'function') { 699 if (typeof(src.__disconnect__) == 'function') {
687 src.__disconnect__(ident, sig, ident.objOrFunc, ident.funcOrStr); 700 src.__disconnect__(ident, sig, ident.objOrFunc, ident.funcOrStr);
688 } 701 }
689 return; 702 return;
690 } 703 }
691 if (src.removeEventListener) { 704 if (src.removeEventListener) {
692 src.removeEventListener(sig.substr(2), listener, false); 705 src.removeEventListener(sig.substr(2), listener, false);
693 } else if (src.detachEvent) { 706 } else if (src.detachEvent) {
694 src.detachEvent(sig, listener); // useCapture unsupported 707 src.detachEvent(sig, listener); // useCapture unsupported
695 } else { 708 } else {
696 throw new Error("'src' must be a DOM element"); 709 throw new Error("'src' must be a DOM element");
697 } 710 }
698 }, 711 },
699 712
700 /** @id MochiKit.Signal.disconnect */ 713 /** @id MochiKit.Signal.disconnect */
701 disconnect: function (ident) { 714 disconnect: function (ident) {
702 var self = MochiKit.Signal; 715 var self = MochiKit.Signal;
703 var observers = self._observers; 716 var observers = self._observers;
704 var m = MochiKit.Base; 717 var m = MochiKit.Base;
705 if (arguments.length > 1) { 718 if (arguments.length > 1) {
706 // compatibility API 719 // compatibility API
707 var src = arguments[0]; 720 var src = arguments[0];
708 if (typeof(src) == "string") { 721 if (typeof(src) == "string") {
709 src = MochiKit.DOM.getElement(src); 722 src = MochiKit.DOM.getElement(src);
710 } 723 }
711 var sig = arguments[1]; 724 var sig = arguments[1];
712 var obj = arguments[2]; 725 var obj = arguments[2];
713 var func = arguments[3]; 726 var func = arguments[3];
714 for (var i = observers.length - 1; i >= 0; i--) { 727 for (var i = observers.length - 1; i >= 0; i--) {
715 var o = observers[i]; 728 var o = observers[i];
716 if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) { 729 if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) {
717 self._disconnect(o); 730 self._disconnect(o);
718 if (!self._lock) { 731 if (self._lock === 0) {
719 observers.splice(i, 1); 732 observers.splice(i, 1);
720 } else { 733 } else {
721 self._dirty = true; 734 self._dirty = true;
722 } 735 }
723 return true; 736 return true;
724 } 737 }
725 } 738 }
726 } else { 739 } else {
727 var idx = m.findIdentical(observers, ident); 740 var idx = m.findIdentical(observers, ident);
728 if (idx >= 0) { 741 if (idx >= 0) {
729 self._disconnect(ident); 742 self._disconnect(ident);
730 if (!self._lock) { 743 if (self._lock === 0) {
731 observers.splice(idx, 1); 744 observers.splice(idx, 1);
732 } else { 745 } else {
733 self._dirty = true; 746 self._dirty = true;
734 } 747 }
735 return true; 748 return true;
736 } 749 }
737 } 750 }
738 return false; 751 return false;
739 }, 752 },
740 753
741 /** @id MochiKit.Signal.disconnectAllTo */ 754 /** @id MochiKit.Signal.disconnectAllTo */
742 disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) { 755 disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) {
743 var self = MochiKit.Signal; 756 var self = MochiKit.Signal;
744 var observers = self._observers; 757 var observers = self._observers;
745 var disconnect = self._disconnect; 758 var disconnect = self._disconnect;
746 var locked = self._lock; 759 var lock = self._lock;
747 var dirty = self._dirty; 760 var dirty = self._dirty;
748 if (typeof(funcOrStr) === 'undefined') { 761 if (typeof(funcOrStr) === 'undefined') {
749 funcOrStr = null; 762 funcOrStr = null;
750 } 763 }
751 for (var i = observers.length - 1; i >= 0; i--) { 764 for (var i = observers.length - 1; i >= 0; i--) {
752 var ident = observers[i]; 765 var ident = observers[i];
753 if (ident.objOrFunc === objOrFunc && 766 if (ident.objOrFunc === objOrFunc &&
754 (funcOrStr === null || ident.funcOrStr === funcOrStr)) { 767 (funcOrStr === null || ident.funcOrStr === funcOrStr)) {
755 disconnect(ident); 768 disconnect(ident);
756 if (locked) { 769 if (lock === 0) {
757 dirty = true;
758 } else {
759 observers.splice(i, 1); 770 observers.splice(i, 1);
771 } else {
772 dirty = true;
760 } 773 }
761 } 774 }
762 } 775 }
763 self._dirty = dirty; 776 self._dirty = dirty;
764 }, 777 },
765 778
766 /** @id MochiKit.Signal.disconnectAll */ 779 /** @id MochiKit.Signal.disconnectAll */
767 disconnectAll: function (src/* optional */, sig) { 780 disconnectAll: function (src/* optional */, sig) {
768 if (typeof(src) == "string") { 781 if (typeof(src) == "string") {
769 src = MochiKit.DOM.getElement(src); 782 src = MochiKit.DOM.getElement(src);
770 } 783 }
771 var m = MochiKit.Base; 784 var m = MochiKit.Base;
772 var signals = m.flattenArguments(m.extend(null, arguments, 1)); 785 var signals = m.flattenArguments(m.extend(null, arguments, 1));
773 var self = MochiKit.Signal; 786 var self = MochiKit.Signal;
774 var disconnect = self._disconnect; 787 var disconnect = self._disconnect;
775 var observers = self._observers; 788 var observers = self._observers;
776 var i, ident; 789 var i, ident;
777 var locked = self._lock; 790 var lock = self._lock;
778 var dirty = self._dirty; 791 var dirty = self._dirty;
779 if (signals.length === 0) { 792 if (signals.length === 0) {
780 // disconnect all 793 // disconnect all
781 for (i = observers.length - 1; i >= 0; i--) { 794 for (i = observers.length - 1; i >= 0; i--) {
782 ident = observers[i]; 795 ident = observers[i];
783 if (ident.source === src) { 796 if (ident.source === src) {
784 disconnect(ident); 797 disconnect(ident);
785 if (!locked) { 798 if (lock === 0) {
786 observers.splice(i, 1); 799 observers.splice(i, 1);
787 } else { 800 } else {
788 dirty = true; 801 dirty = true;
789 } 802 }
790 } 803 }
791 } 804 }
792 } else { 805 } else {
793 var sigs = {}; 806 var sigs = {};
794 for (i = 0; i < signals.length; i++) { 807 for (i = 0; i < signals.length; i++) {
795 sigs[signals[i]] = true; 808 sigs[signals[i]] = true;
796 } 809 }
797 for (i = observers.length - 1; i >= 0; i--) { 810 for (i = observers.length - 1; i >= 0; i--) {
798 ident = observers[i]; 811 ident = observers[i];
799 if (ident.source === src && ident.signal in sigs) { 812 if (ident.source === src && ident.signal in sigs) {
800 disconnect(ident); 813 disconnect(ident);
801 if (!locked) { 814 if (lock === 0) {
802 observers.splice(i, 1); 815 observers.splice(i, 1);
803 } else { 816 } else {
804 dirty = true; 817 dirty = true;
805 } 818 }
806 } 819 }
807 } 820 }
808 } 821 }
809 self._dirty = dirty; 822 self._dirty = dirty;
810 }, 823 },
811 824
812 /** @id MochiKit.Signal.signal */ 825 /** @id MochiKit.Signal.signal */
813 signal: function (src, sig) { 826 signal: function (src, sig) {
814 var self = MochiKit.Signal; 827 var self = MochiKit.Signal;
815 var observers = self._observers; 828 var observers = self._observers;
816 if (typeof(src) == "string") { 829 if (typeof(src) == "string") {
817 src = MochiKit.DOM.getElement(src); 830 src = MochiKit.DOM.getElement(src);
818 } 831 }
819 var args = MochiKit.Base.extend(null, arguments, 2); 832 var args = MochiKit.Base.extend(null, arguments, 2);
820 var errors = []; 833 var errors = [];
821 self._lock = true; 834 self._lock++;
822 for (var i = 0; i < observers.length; i++) { 835 for (var i = 0; i < observers.length; i++) {
823 var ident = observers[i]; 836 var ident = observers[i];
824 if (ident.source === src && ident.signal === sig && 837 if (ident.source === src && ident.signal === sig &&
825 ident.connected) { 838 ident.connected) {
826 try { 839 try {
827 if (ident.isDOM && ident.funcOrStr != null) { 840 if (ident.isDOM && ident.funcOrStr != null) {
828 var obj = ident.objOrFunc; 841 var obj = ident.objOrFunc;
829 obj[ident.funcOrStr].apply(obj, args); 842 obj[ident.funcOrStr].apply(obj, args);
830 } else if (ident.isDOM) { 843 } else if (ident.isDOM) {
831 ident.objOrFunc.apply(src, args); 844 ident.objOrFunc.apply(src, args);
832 } else { 845 } else {
833 ident.listener.apply(src, args); 846 ident.listener.apply(src, args);
834 } 847 }
835 } catch (e) { 848 } catch (e) {
836 errors.push(e); 849 errors.push(e);
837 } 850 }
838 } 851 }
839 } 852 }
840 self._lock = false; 853 self._lock--;
841 if (self._dirty) { 854 if (self._lock === 0 && self._dirty) {
842 self._dirty = false; 855 self._dirty = false;
843 for (var i = observers.length - 1; i >= 0; i--) { 856 for (var i = observers.length - 1; i >= 0; i--) {
844 if (!observers[i].connected) { 857 if (!observers[i].connected) {
845 observers.splice(i, 1); 858 observers.splice(i, 1);
846 } 859 }
847 } 860 }
848 } 861 }
849 if (errors.length == 1) { 862 if (errors.length == 1) {
850 throw errors[0]; 863 throw errors[0];
851 } else if (errors.length > 1) { 864 } else if (errors.length > 1) {
852 var e = new Error("Multiple errors thrown in handling 'sig', see errors property"); 865 var e = new Error("Multiple errors thrown in handling 'sig', see errors property");
853 e.errors = errors; 866 e.errors = errors;
854 throw e; 867 throw e;
855 } 868 }
856 } 869 }
857 870
858}); 871});
859 872
860MochiKit.Signal.__new__ = function (win) { 873MochiKit.Signal.__new__ = function (win) {
861 var m = MochiKit.Base; 874 var m = MochiKit.Base;
862 this._document = document; 875 this._document = document;
863 this._window = win; 876 this._window = win;
864 this._lock = false; 877 this._lock = 0;
865 this._dirty = false; 878 this._dirty = false;
866 879
867 try { 880 try {
868 this.connect(window, 'onunload', this._unloadCache); 881 this.connect(window, 'onunload', this._unloadCache);
869 } catch (e) { 882 } catch (e) {
870 // pass: might not be a browser 883 // pass: might not be a browser
871 } 884 }
872 885
873 m.nameFunctions(this); 886 m.nameFunctions(this);
874}; 887};
875 888
876MochiKit.Signal.__new__(this); 889MochiKit.Signal.__new__(this);
877 890
878// 891//
879// XXX: Internet Explorer blows 892// XXX: Internet Explorer blows
880// 893//
881if (MochiKit.__export__) { 894if (MochiKit.__export__) {
882 connect = MochiKit.Signal.connect; 895 connect = MochiKit.Signal.connect;
883 disconnect = MochiKit.Signal.disconnect; 896 disconnect = MochiKit.Signal.disconnect;
884 disconnectAll = MochiKit.Signal.disconnectAll; 897 disconnectAll = MochiKit.Signal.disconnectAll;
885 signal = MochiKit.Signal.signal; 898 signal = MochiKit.Signal.signal;
886} 899}
887 900
888MochiKit.Base._exportSymbols(this, MochiKit.Signal); 901MochiKit.Base._exportSymbols(this, MochiKit.Signal);
diff --git a/frontend/gamma/js/MochiKit/Sortable.js b/frontend/gamma/js/MochiKit/Sortable.js
index 863b506..ca9db21 100644
--- a/frontend/gamma/js/MochiKit/Sortable.js
+++ b/frontend/gamma/js/MochiKit/Sortable.js
@@ -1,73 +1,73 @@
1/*** 1/***
2Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
3 Mochi-ized By Thomas Herve (_firstname_@nimail.org) 3 Mochi-ized By Thomas Herve (_firstname_@nimail.org)
4 4
5See scriptaculous.js for full license. 5See scriptaculous.js for full license.
6 6
7***/ 7***/
8 8
9MochiKit.Base._module('Sortable', '1.5', ['Base', 'Iter', 'DOM', 'Position', 'DragAndDrop']); 9MochiKit.Base.module(MochiKit, 'Sortable', '1.5', ['Base', 'Iter', 'DOM', 'Position', 'DragAndDrop']);
10 10
11MochiKit.Base.update(MochiKit.Sortable, { 11MochiKit.Base.update(MochiKit.Sortable, {
12 __export__: false, 12 __export__: false,
13 13
14 /*** 14 /***
15 15
16 Manage sortables. Mainly use the create function to add a sortable. 16 Manage sortables. Mainly use the create function to add a sortable.
17 17
18 ***/ 18 ***/
19 sortables: {}, 19 sortables: {},
20 20
21 _findRootElement: function (element) { 21 _findRootElement: function (element) {
22 while (element.tagName.toUpperCase() != "BODY") { 22 while (element.tagName.toUpperCase() != "BODY") {
23 if (element.id && MochiKit.Sortable.sortables[element.id]) { 23 if (element.id && MochiKit.Sortable.sortables[element.id]) {
24 return element; 24 return element;
25 } 25 }
26 element = element.parentNode; 26 element = element.parentNode;
27 } 27 }
28 }, 28 },
29 29
30 _createElementId: function(element) { 30 _createElementId: function(element) {
31 if (element.id == null || element.id == "") { 31 if (element.id == null || element.id == "") {
32 var d = MochiKit.DOM; 32 var d = MochiKit.DOM;
33 var id; 33 var id;
34 var count = 1; 34 var count = 1;
35 while (d.getElement(id = "sortable" + count) != null) { 35 while (d.getElement(id = "sortable" + count) != null) {
36 count += 1; 36 count += 1;
37 } 37 }
38 d.setNodeAttribute(element, "id", id); 38 d.setNodeAttribute(element, "id", id);
39 } 39 }
40 }, 40 },
41 41
42 /** @id MochiKit.Sortable.options */ 42 /** @id MochiKit.Sortable.options */
43 options: function (element) { 43 options: function (element) {
44 element = MochiKit.Sortable._findRootElement(MochiKit.DOM.getElement(element)); 44 element = MochiKit.Sortable._findRootElement(MochiKit.DOM.getElement(element));
45 if (!element) { 45 if (!element) {
46 return; 46 return;
47 } 47 }
48 return MochiKit.Sortable.sortables[element.id]; 48 return MochiKit.Sortable.sortables[element.id];
49 }, 49 },
50 50
51 /** @id MochiKit.Sortable.destroy */ 51 /** @id MochiKit.Sortable.destroy */
52 destroy: function (element){ 52 destroy: function (element){
53 var s = MochiKit.Sortable.options(element); 53 var s = MochiKit.Sortable.options(element);
54 var b = MochiKit.Base; 54 var b = MochiKit.Base;
55 var d = MochiKit.DragAndDrop; 55 var d = MochiKit.DragAndDrop;
56 56
57 if (s) { 57 if (s) {
58 MochiKit.Signal.disconnect(s.startHandle); 58 MochiKit.Signal.disconnect(s.startHandle);
59 MochiKit.Signal.disconnect(s.endHandle); 59 MochiKit.Signal.disconnect(s.endHandle);
60 b.map(function (dr) { 60 b.map(function (dr) {
61 d.Droppables.remove(dr); 61 d.Droppables.remove(dr);
62 }, s.droppables); 62 }, s.droppables);
63 b.map(function (dr) { 63 b.map(function (dr) {
64 dr.destroy(); 64 dr.destroy();
65 }, s.draggables); 65 }, s.draggables);
66 66
67 delete MochiKit.Sortable.sortables[s.element.id]; 67 delete MochiKit.Sortable.sortables[s.element.id];
68 } 68 }
69 }, 69 },
70 70
71 /** @id MochiKit.Sortable.create */ 71 /** @id MochiKit.Sortable.create */
72 create: function (element, options) { 72 create: function (element, options) {
73 element = MochiKit.DOM.getElement(element); 73 element = MochiKit.DOM.getElement(element);
@@ -118,137 +118,137 @@ MochiKit.Base.update(MochiKit.Sortable, {
118 scroll: false, 118 scroll: false,
119 119
120 /** @id MochiKit.Sortable.scrollSensitivity */ 120 /** @id MochiKit.Sortable.scrollSensitivity */
121 scrollSensitivity: 20, 121 scrollSensitivity: 20,
122 122
123 /** @id MochiKit.Sortable.scrollSpeed */ 123 /** @id MochiKit.Sortable.scrollSpeed */
124 scrollSpeed: 15, 124 scrollSpeed: 15,
125 125
126 /** @id MochiKit.Sortable.format */ 126 /** @id MochiKit.Sortable.format */
127 format: /^[^_]*_(.*)$/, 127 format: /^[^_]*_(.*)$/,
128 128
129 /** @id MochiKit.Sortable.onChange */ 129 /** @id MochiKit.Sortable.onChange */
130 onChange: MochiKit.Base.noop, 130 onChange: MochiKit.Base.noop,
131 131
132 /** @id MochiKit.Sortable.onUpdate */ 132 /** @id MochiKit.Sortable.onUpdate */
133 onUpdate: MochiKit.Base.noop, 133 onUpdate: MochiKit.Base.noop,
134 134
135 /** @id MochiKit.Sortable.accept */ 135 /** @id MochiKit.Sortable.accept */
136 accept: null 136 accept: null
137 }, options); 137 }, options);
138 138
139 // clear any old sortable with same element 139 // clear any old sortable with same element
140 self.destroy(element); 140 self.destroy(element);
141 141
142 // build options for the draggables 142 // build options for the draggables
143 var options_for_draggable = { 143 var options_for_draggable = {
144 revert: true, 144 revert: true,
145 ghosting: options.ghosting, 145 ghosting: options.ghosting,
146 scroll: options.scroll, 146 scroll: options.scroll,
147 scrollSensitivity: options.scrollSensitivity, 147 scrollSensitivity: options.scrollSensitivity,
148 scrollSpeed: options.scrollSpeed, 148 scrollSpeed: options.scrollSpeed,
149 constraint: options.constraint, 149 constraint: options.constraint,
150 handle: options.handle 150 handle: options.handle
151 }; 151 };
152 152
153 if (options.starteffect) { 153 if (options.starteffect) {
154 options_for_draggable.starteffect = options.starteffect; 154 options_for_draggable.starteffect = options.starteffect;
155 } 155 }
156 156
157 if (options.reverteffect) { 157 if (options.reverteffect) {
158 options_for_draggable.reverteffect = options.reverteffect; 158 options_for_draggable.reverteffect = options.reverteffect;
159 } else if (options.ghosting) { 159 } else if (options.ghosting) {
160 options_for_draggable.reverteffect = function (innerelement) { 160 options_for_draggable.reverteffect = function (innerelement) {
161 innerelement.style.top = 0; 161 innerelement.style.top = 0;
162 innerelement.style.left = 0; 162 innerelement.style.left = 0;
163 }; 163 };
164 } 164 }
165 165
166 if (options.endeffect) { 166 if (options.endeffect) {
167 options_for_draggable.endeffect = options.endeffect; 167 options_for_draggable.endeffect = options.endeffect;
168 } 168 }
169 169
170 if (options.zindex) { 170 if (options.zindex) {
171 options_for_draggable.zindex = options.zindex; 171 options_for_draggable.zindex = options.zindex;
172 } 172 }
173 173
174 // build options for the droppables 174 // build options for the droppables
175 var options_for_droppable = { 175 var options_for_droppable = {
176 overlap: options.overlap, 176 overlap: options.overlap,
177 containment: options.containment, 177 containment: options.containment,
178 hoverclass: options.hoverclass, 178 hoverclass: options.hoverclass,
179 onhover: self.onHover, 179 onhover: self.onHover,
180 tree: options.tree, 180 tree: options.tree,
181 accept: options.accept 181 accept: options.accept
182 } 182 };
183 183
184 var options_for_tree = { 184 var options_for_tree = {
185 onhover: self.onEmptyHover, 185 onhover: self.onEmptyHover,
186 overlap: options.overlap, 186 overlap: options.overlap,
187 containment: options.containment, 187 containment: options.containment,
188 hoverclass: options.hoverclass, 188 hoverclass: options.hoverclass,
189 accept: options.accept 189 accept: options.accept
190 } 190 };
191 191
192 // fix for gecko engine 192 // fix for gecko engine
193 MochiKit.DOM.removeEmptyTextNodes(element); 193 MochiKit.DOM.removeEmptyTextNodes(element);
194 194
195 options.draggables = []; 195 options.draggables = [];
196 options.droppables = []; 196 options.droppables = [];
197 197
198 // drop on empty handling 198 // drop on empty handling
199 if (options.dropOnEmpty || options.tree) { 199 if (options.dropOnEmpty || options.tree) {
200 new MochiKit.DragAndDrop.Droppable(element, options_for_tree); 200 new MochiKit.DragAndDrop.Droppable(element, options_for_tree);
201 options.droppables.push(element); 201 options.droppables.push(element);
202 } 202 }
203 MochiKit.Base.map(function (e) { 203 MochiKit.Base.map(function (e) {
204 // handles are per-draggable 204 // handles are per-draggable
205 var handle = options.handle ? 205 var handle = options.handle ?
206 MochiKit.DOM.getFirstElementByTagAndClassName(null, 206 MochiKit.DOM.getFirstElementByTagAndClassName(null,
207 options.handle, e) : e; 207 options.handle, e) : e;
208 options.draggables.push( 208 options.draggables.push(
209 new MochiKit.DragAndDrop.Draggable(e, 209 new MochiKit.DragAndDrop.Draggable(e,
210 MochiKit.Base.update(options_for_draggable, 210 MochiKit.Base.update(options_for_draggable,
211 {handle: handle}))); 211 {handle: handle})));
212 new MochiKit.DragAndDrop.Droppable(e, options_for_droppable); 212 new MochiKit.DragAndDrop.Droppable(e, options_for_droppable);
213 if (options.tree) { 213 if (options.tree) {
214 e.treeNode = element; 214 e.treeNode = element;
215 } 215 }
216 options.droppables.push(e); 216 options.droppables.push(e);
217 }, (self.findElements(element, options) || [])); 217 }, (self.findElements(element, options) || []));
218 218
219 if (options.tree) { 219 if (options.tree) {
220 MochiKit.Base.map(function (e) { 220 MochiKit.Base.map(function (e) {
221 new MochiKit.DragAndDrop.Droppable(e, options_for_tree); 221 new MochiKit.DragAndDrop.Droppable(e, options_for_tree);
222 e.treeNode = element; 222 e.treeNode = element;
223 options.droppables.push(e); 223 options.droppables.push(e);
224 }, (self.findTreeElements(element, options) || [])); 224 }, (self.findTreeElements(element, options) || []));
225 } 225 }
226 226
227 // keep reference 227 // keep reference
228 self.sortables[element.id] = options; 228 self.sortables[element.id] = options;
229 229
230 options.lastValue = self.serialize(element); 230 options.lastValue = self.serialize(element);
231 options.startHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'start', 231 options.startHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'start',
232 MochiKit.Base.partial(self.onStart, element)); 232 MochiKit.Base.partial(self.onStart, element));
233 options.endHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'end', 233 options.endHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'end',
234 MochiKit.Base.partial(self.onEnd, element)); 234 MochiKit.Base.partial(self.onEnd, element));
235 }, 235 },
236 236
237 /** @id MochiKit.Sortable.onStart */ 237 /** @id MochiKit.Sortable.onStart */
238 onStart: function (element, draggable) { 238 onStart: function (element, draggable) {
239 var self = MochiKit.Sortable; 239 var self = MochiKit.Sortable;
240 var options = self.options(element); 240 var options = self.options(element);
241 options.lastValue = self.serialize(options.element); 241 options.lastValue = self.serialize(options.element);
242 }, 242 },
243 243
244 /** @id MochiKit.Sortable.onEnd */ 244 /** @id MochiKit.Sortable.onEnd */
245 onEnd: function (element, draggable) { 245 onEnd: function (element, draggable) {
246 var self = MochiKit.Sortable; 246 var self = MochiKit.Sortable;
247 self.unmark(); 247 self.unmark();
248 var options = self.options(element); 248 var options = self.options(element);
249 if (options.lastValue != self.serialize(options.element)) { 249 if (options.lastValue != self.serialize(options.element)) {
250 options.onUpdate(options.element); 250 options.onUpdate(options.element);
251 } 251 }
252 }, 252 },
253 253
254 // return all suitable-for-sortable elements in a guaranteed order 254 // return all suitable-for-sortable elements in a guaranteed order
@@ -369,174 +369,174 @@ MochiKit.Base.update(MochiKit.Sortable, {
369 369
370 self.options(oldParentNode).onChange(element); 370 self.options(oldParentNode).onChange(element);
371 droponOptions.onChange(element); 371 droponOptions.onChange(element);
372 } 372 }
373 }, 373 },
374 374
375 /** @id MochiKit.Sortable.unmark */ 375 /** @id MochiKit.Sortable.unmark */
376 unmark: function () { 376 unmark: function () {
377 var m = MochiKit.Sortable._marker; 377 var m = MochiKit.Sortable._marker;
378 if (m) { 378 if (m) {
379 MochiKit.Style.hideElement(m); 379 MochiKit.Style.hideElement(m);
380 } 380 }
381 }, 381 },
382 382
383 /** @id MochiKit.Sortable.mark */ 383 /** @id MochiKit.Sortable.mark */
384 mark: function (dropon, position) { 384 mark: function (dropon, position) {
385 // mark on ghosting only 385 // mark on ghosting only
386 var d = MochiKit.DOM; 386 var d = MochiKit.DOM;
387 var self = MochiKit.Sortable; 387 var self = MochiKit.Sortable;
388 var sortable = self.options(dropon.parentNode); 388 var sortable = self.options(dropon.parentNode);
389 if (sortable && !sortable.ghosting) { 389 if (sortable && !sortable.ghosting) {
390 return; 390 return;
391 } 391 }
392 392
393 if (!self._marker) { 393 if (!self._marker) {
394 self._marker = d.getElement('dropmarker') || 394 self._marker = d.getElement('dropmarker') ||
395 document.createElement('DIV'); 395 document.createElement('DIV');
396 MochiKit.Style.hideElement(self._marker); 396 MochiKit.Style.hideElement(self._marker);
397 d.addElementClass(self._marker, 'dropmarker'); 397 d.addElementClass(self._marker, 'dropmarker');
398 self._marker.style.position = 'absolute'; 398 self._marker.style.position = 'absolute';
399 document.getElementsByTagName('body').item(0).appendChild(self._marker); 399 document.getElementsByTagName('body').item(0).appendChild(self._marker);
400 } 400 }
401 var offsets = MochiKit.Position.cumulativeOffset(dropon); 401 var offsets = MochiKit.Position.cumulativeOffset(dropon);
402 self._marker.style.left = offsets.x + 'px'; 402 self._marker.style.left = offsets.x + 'px';
403 self._marker.style.top = offsets.y + 'px'; 403 self._marker.style.top = offsets.y + 'px';
404 404
405 if (position == 'after') { 405 if (position == 'after') {
406 if (sortable.overlap == 'horizontal') { 406 if (sortable.overlap == 'horizontal') {
407 self._marker.style.left = (offsets.x + dropon.clientWidth) + 'px'; 407 self._marker.style.left = (offsets.x + dropon.clientWidth) + 'px';
408 } else { 408 } else {
409 self._marker.style.top = (offsets.y + dropon.clientHeight) + 'px'; 409 self._marker.style.top = (offsets.y + dropon.clientHeight) + 'px';
410 } 410 }
411 } 411 }
412 MochiKit.Style.showElement(self._marker); 412 MochiKit.Style.showElement(self._marker);
413 }, 413 },
414 414
415 _tree: function (element, options, parent) { 415 _tree: function (element, options, parent) {
416 var self = MochiKit.Sortable; 416 var self = MochiKit.Sortable;
417 var children = self.findElements(element, options) || []; 417 var children = self.findElements(element, options) || [];
418 418
419 for (var i = 0; i < children.length; ++i) { 419 for (var i = 0; i < children.length; ++i) {
420 var match = children[i].id.match(options.format); 420 var match = children[i].id.match(options.format);
421 421
422 if (!match) { 422 if (!match) {
423 continue; 423 continue;
424 } 424 }
425 425
426 var child = { 426 var child = {
427 id: encodeURIComponent(match ? match[1] : null), 427 id: encodeURIComponent(match ? match[1] : null),
428 element: element, 428 element: element,
429 parent: parent, 429 parent: parent,
430 children: [], 430 children: [],
431 position: parent.children.length, 431 position: parent.children.length,
432 container: self._findChildrenElement(children[i], options.treeTag.toUpperCase()) 432 container: self._findChildrenElement(children[i], options.treeTag.toUpperCase())
433 } 433 };
434 434
435 /* Get the element containing the children and recurse over it */ 435 /* Get the element containing the children and recurse over it */
436 if (child.container) { 436 if (child.container) {
437 self._tree(child.container, options, child) 437 self._tree(child.container, options, child);
438 } 438 }
439 439
440 parent.children.push (child); 440 parent.children.push (child);
441 } 441 }
442 442
443 return parent; 443 return parent;
444 }, 444 },
445 445
446 /* Finds the first element of the given tag type within a parent element. 446 /* Finds the first element of the given tag type within a parent element.
447 Used for finding the first LI[ST] within a L[IST]I[TEM].*/ 447 Used for finding the first LI[ST] within a L[IST]I[TEM].*/
448 _findChildrenElement: function (element, containerTag) { 448 _findChildrenElement: function (element, containerTag) {
449 if (element && element.hasChildNodes) { 449 if (element && element.hasChildNodes) {
450 containerTag = containerTag.toUpperCase(); 450 containerTag = containerTag.toUpperCase();
451 for (var i = 0; i < element.childNodes.length; ++i) { 451 for (var i = 0; i < element.childNodes.length; ++i) {
452 if (element.childNodes[i].tagName.toUpperCase() == containerTag) { 452 if (element.childNodes[i].tagName.toUpperCase() == containerTag) {
453 return element.childNodes[i]; 453 return element.childNodes[i];
454 } 454 }
455 } 455 }
456 } 456 }
457 return null; 457 return null;
458 }, 458 },
459 459
460 /** @id MochiKit.Sortable.tree */ 460 /** @id MochiKit.Sortable.tree */
461 tree: function (element, options) { 461 tree: function (element, options) {
462 element = MochiKit.DOM.getElement(element); 462 element = MochiKit.DOM.getElement(element);
463 var sortableOptions = MochiKit.Sortable.options(element); 463 var sortableOptions = MochiKit.Sortable.options(element);
464 options = MochiKit.Base.update({ 464 options = MochiKit.Base.update({
465 tag: sortableOptions.tag, 465 tag: sortableOptions.tag,
466 treeTag: sortableOptions.treeTag, 466 treeTag: sortableOptions.treeTag,
467 only: sortableOptions.only, 467 only: sortableOptions.only,
468 name: element.id, 468 name: element.id,
469 format: sortableOptions.format 469 format: sortableOptions.format
470 }, options || {}); 470 }, options || {});
471 471
472 var root = { 472 var root = {
473 id: null, 473 id: null,
474 parent: null, 474 parent: null,
475 children: new Array, 475 children: new Array,
476 container: element, 476 container: element,
477 position: 0 477 position: 0
478 } 478 };
479 479
480 return MochiKit.Sortable._tree(element, options, root); 480 return MochiKit.Sortable._tree(element, options, root);
481 }, 481 },
482 482
483 /** 483 /**
484 * Specifies the sequence for the Sortable. 484 * Specifies the sequence for the Sortable.
485 * @param {Node} element Element to use as the Sortable. 485 * @param {Node} element Element to use as the Sortable.
486 * @param {Object} newSequence New sequence to use. 486 * @param {Object} newSequence New sequence to use.
487 * @param {Object} options Options to use fro the Sortable. 487 * @param {Object} options Options to use fro the Sortable.
488 */ 488 */
489 setSequence: function (element, newSequence, options) { 489 setSequence: function (element, newSequence, options) {
490 var self = MochiKit.Sortable; 490 var self = MochiKit.Sortable;
491 var b = MochiKit.Base; 491 var b = MochiKit.Base;
492 element = MochiKit.DOM.getElement(element); 492 element = MochiKit.DOM.getElement(element);
493 options = b.update(self.options(element), options || {}); 493 options = b.update(self.options(element), options || {});
494 494
495 var nodeMap = {}; 495 var nodeMap = {};
496 b.map(function (n) { 496 b.map(function (n) {
497 var m = n.id.match(options.format); 497 var m = n.id.match(options.format);
498 if (m) { 498 if (m) {
499 nodeMap[m[1]] = [n, n.parentNode]; 499 nodeMap[m[1]] = [n, n.parentNode];
500 } 500 }
501 n.parentNode.removeChild(n); 501 n.parentNode.removeChild(n);
502 }, self.findElements(element, options)); 502 }, self.findElements(element, options));
503 503
504 b.map(function (ident) { 504 b.map(function (ident) {
505 var n = nodeMap[ident]; 505 var n = nodeMap[ident];
506 if (n) { 506 if (n) {
507 n[1].appendChild(n[0]); 507 n[1].appendChild(n[0]);
508 delete nodeMap[ident]; 508 delete nodeMap[ident];
509 } 509 }
510 }, newSequence); 510 }, newSequence);
511 }, 511 },
512 512
513 /* Construct a [i] index for a particular node */ 513 /* Construct a [i] index for a particular node */
514 _constructIndex: function (node) { 514 _constructIndex: function (node) {
515 var index = ''; 515 var index = '';
516 do { 516 do {
517 if (node.id) { 517 if (node.id) {
518 index = '[' + node.position + ']' + index; 518 index = '[' + node.position + ']' + index;
519 } 519 }
520 } while ((node = node.parent) != null); 520 } while ((node = node.parent) != null);
521 return index; 521 return index;
522 }, 522 },
523 523
524 /** @id MochiKit.Sortable.sequence */ 524 /** @id MochiKit.Sortable.sequence */
525 sequence: function (element, options) { 525 sequence: function (element, options) {
526 element = MochiKit.DOM.getElement(element); 526 element = MochiKit.DOM.getElement(element);
527 var self = MochiKit.Sortable; 527 var self = MochiKit.Sortable;
528 var options = MochiKit.Base.update(self.options(element), options || {}); 528 var options = MochiKit.Base.update(self.options(element), options || {});
529 529
530 return MochiKit.Base.map(function (item) { 530 return MochiKit.Base.map(function (item) {
531 return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; 531 return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
532 }, MochiKit.DOM.getElement(self.findElements(element, options) || [])); 532 }, MochiKit.DOM.getElement(self.findElements(element, options) || []));
533 }, 533 },
534 534
535 /** 535 /**
536 * Serializes the content of a Sortable. Useful to send this content through a XMLHTTPRequest. 536 * Serializes the content of a Sortable. Useful to send this content through a XMLHTTPRequest.
537 * These options override the Sortable options for the serialization only. 537 * These options override the Sortable options for the serialization only.
538 * @param {Node} element Element to serialize. 538 * @param {Node} element Element to serialize.
539 * @param {Object} options Serialization options. 539 * @param {Object} options Serialization options.
540 */ 540 */
541 serialize: function (element, options) { 541 serialize: function (element, options) {
542 element = MochiKit.DOM.getElement(element); 542 element = MochiKit.DOM.getElement(element);
diff --git a/frontend/gamma/js/MochiKit/Style.js b/frontend/gamma/js/MochiKit/Style.js
index 7f10117..740fd2f 100644
--- a/frontend/gamma/js/MochiKit/Style.js
+++ b/frontend/gamma/js/MochiKit/Style.js
@@ -1,75 +1,78 @@
1/*** 1/***
2 2
3MochiKit.Style 1.5 3MochiKit.Style 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved. 7(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved.
8 8
9The MochiKit.Style.getElementPosition function is adapted from
10YAHOO.util.Dom.getXY v0.9.0. which is copyrighted by Yahoo! Inc.
11
9***/ 12***/
10 13
11MochiKit.Base._module('Style', '1.5', ['Base', 'DOM']); 14MochiKit.Base.module(MochiKit, 'Style', '1.5', ['Base', 'DOM']);
12 15
13 16
14/** @id MochiKit.Style.Dimensions */ 17/** @id MochiKit.Style.Dimensions */
15MochiKit.Style.Dimensions = function (w, h) { 18MochiKit.Style.Dimensions = function (w, h) {
16 if (!(this instanceof MochiKit.Style.Dimensions)) { 19 if (!(this instanceof MochiKit.Style.Dimensions)) {
17 return new MochiKit.Style.Dimensions(w, h); 20 return new MochiKit.Style.Dimensions(w, h);
18 } 21 }
19 this.w = w; 22 this.w = w;
20 this.h = h; 23 this.h = h;
21}; 24};
22 25
23MochiKit.Style.Dimensions.prototype.__repr__ = function () { 26MochiKit.Style.Dimensions.prototype.__repr__ = function () {
24 var repr = MochiKit.Base.repr; 27 var repr = MochiKit.Base.repr;
25 return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}'; 28 return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}';
26}; 29};
27 30
28MochiKit.Style.Dimensions.prototype.toString = function () { 31MochiKit.Style.Dimensions.prototype.toString = function () {
29 return this.__repr__(); 32 return this.__repr__();
30}; 33};
31 34
32 35
33/** @id MochiKit.Style.Coordinates */ 36/** @id MochiKit.Style.Coordinates */
34MochiKit.Style.Coordinates = function (x, y) { 37MochiKit.Style.Coordinates = function (x, y) {
35 if (!(this instanceof MochiKit.Style.Coordinates)) { 38 if (!(this instanceof MochiKit.Style.Coordinates)) {
36 return new MochiKit.Style.Coordinates(x, y); 39 return new MochiKit.Style.Coordinates(x, y);
37 } 40 }
38 this.x = x; 41 this.x = x;
39 this.y = y; 42 this.y = y;
40}; 43};
41 44
42MochiKit.Style.Coordinates.prototype.__repr__ = function () { 45MochiKit.Style.Coordinates.prototype.__repr__ = function () {
43 var repr = MochiKit.Base.repr; 46 var repr = MochiKit.Base.repr;
44 return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}'; 47 return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}';
45}; 48};
46 49
47MochiKit.Style.Coordinates.prototype.toString = function () { 50MochiKit.Style.Coordinates.prototype.toString = function () {
48 return this.__repr__(); 51 return this.__repr__();
49}; 52};
50 53
51 54
52MochiKit.Base.update(MochiKit.Style, { 55MochiKit.Base.update(MochiKit.Style, {
53 56
54 /** @id MochiKit.Style.getStyle */ 57 /** @id MochiKit.Style.getStyle */
55 getStyle: function (elem, cssProperty) { 58 getStyle: function (elem, cssProperty) {
56 var dom = MochiKit.DOM; 59 var dom = MochiKit.DOM;
57 var d = dom._document; 60 var d = dom._document;
58 61
59 elem = dom.getElement(elem); 62 elem = dom.getElement(elem);
60 cssProperty = MochiKit.Base.camelize(cssProperty); 63 cssProperty = MochiKit.Base.camelize(cssProperty);
61 64
62 if (!elem || elem == d) { 65 if (!elem || elem == d) {
63 return undefined; 66 return undefined;
64 } 67 }
65 if (cssProperty == 'opacity' && typeof(elem.filters) != 'undefined') { 68 if (cssProperty == 'opacity' && typeof(elem.filters) != 'undefined') {
66 var opacity = (MochiKit.Style.getStyle(elem, 'filter') || '').match(/alpha\(opacity=(.*)\)/); 69 var opacity = (MochiKit.Style.getStyle(elem, 'filter') || '').match(/alpha\(opacity=(.*)\)/);
67 if (opacity && opacity[1]) { 70 if (opacity && opacity[1]) {
68 return parseFloat(opacity[1]) / 100; 71 return parseFloat(opacity[1]) / 100;
69 } 72 }
70 return 1.0; 73 return 1.0;
71 } 74 }
72 if (cssProperty == 'float' || cssProperty == 'cssFloat' || cssProperty == 'styleFloat') { 75 if (cssProperty == 'float' || cssProperty == 'cssFloat' || cssProperty == 'styleFloat') {
73 if (elem.style["float"]) { 76 if (elem.style["float"]) {
74 return elem.style["float"]; 77 return elem.style["float"];
75 } else if (elem.style.cssFloat) { 78 } else if (elem.style.cssFloat) {
@@ -118,179 +121,179 @@ MochiKit.Base.update(MochiKit.Style, {
118 setStyle: function (elem, style) { 121 setStyle: function (elem, style) {
119 elem = MochiKit.DOM.getElement(elem); 122 elem = MochiKit.DOM.getElement(elem);
120 for (var name in style) { 123 for (var name in style) {
121 switch (name) { 124 switch (name) {
122 case 'opacity': 125 case 'opacity':
123 MochiKit.Style.setOpacity(elem, style[name]); 126 MochiKit.Style.setOpacity(elem, style[name]);
124 break; 127 break;
125 case 'float': 128 case 'float':
126 case 'cssFloat': 129 case 'cssFloat':
127 case 'styleFloat': 130 case 'styleFloat':
128 if (typeof(elem.style["float"]) != "undefined") { 131 if (typeof(elem.style["float"]) != "undefined") {
129 elem.style["float"] = style[name]; 132 elem.style["float"] = style[name];
130 } else if (typeof(elem.style.cssFloat) != "undefined") { 133 } else if (typeof(elem.style.cssFloat) != "undefined") {
131 elem.style.cssFloat = style[name]; 134 elem.style.cssFloat = style[name];
132 } else { 135 } else {
133 elem.style.styleFloat = style[name]; 136 elem.style.styleFloat = style[name];
134 } 137 }
135 break; 138 break;
136 default: 139 default:
137 elem.style[MochiKit.Base.camelize(name)] = style[name]; 140 elem.style[MochiKit.Base.camelize(name)] = style[name];
138 } 141 }
139 } 142 }
140 }, 143 },
141 144
142 /** @id MochiKit.Style.setOpacity */ 145 /** @id MochiKit.Style.setOpacity */
143 setOpacity: function (elem, o) { 146 setOpacity: function (elem, o) {
144 elem = MochiKit.DOM.getElement(elem); 147 elem = MochiKit.DOM.getElement(elem);
145 var self = MochiKit.Style; 148 var self = MochiKit.Style;
146 if (o == 1) { 149 if (o == 1) {
147 var toSet = /Gecko/.test(navigator.userAgent) && !(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)); 150 var toSet = /Gecko/.test(navigator.userAgent) && !(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
148 elem.style["opacity"] = toSet ? 0.999999 : 1.0; 151 elem.style["opacity"] = toSet ? 0.999999 : 1.0;
149 if (/MSIE/.test(navigator.userAgent)) { 152 if (/MSIE/.test(navigator.userAgent)) {
150 elem.style['filter'] = 153 elem.style['filter'] =
151 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, ''); 154 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '');
152 } 155 }
153 } else { 156 } else {
154 if (o < 0.00001) { 157 if (o < 0.00001) {
155 o = 0; 158 o = 0;
156 } 159 }
157 elem.style["opacity"] = o; 160 elem.style["opacity"] = o;
158 if (/MSIE/.test(navigator.userAgent)) { 161 if (/MSIE/.test(navigator.userAgent)) {
159 elem.style['filter'] = 162 elem.style['filter'] =
160 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + o * 100 + ')'; 163 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + o * 100 + ')';
161 } 164 }
162 } 165 }
163 }, 166 },
164 167
165 /* 168 /*
166 169
167 getElementPosition is adapted from YAHOO.util.Dom.getXY v0.9.0. 170 getElementPosition is adapted from YAHOO.util.Dom.getXY v0.9.0.
168 Copyright: Copyright (c) 2006, Yahoo! Inc. All rights reserved. 171 Copyright: Copyright (c) 2006, Yahoo! Inc. All rights reserved.
169 License: BSD, http://developer.yahoo.net/yui/license.txt 172 License: BSD, http://developer.yahoo.net/yui/license.txt
170 173
171 */ 174 */
172 175
173 /** @id MochiKit.Style.getElementPosition */ 176 /** @id MochiKit.Style.getElementPosition */
174 getElementPosition: function (elem, /* optional */relativeTo) { 177 getElementPosition: function (elem, /* optional */relativeTo) {
175 var self = MochiKit.Style; 178 var self = MochiKit.Style;
176 var dom = MochiKit.DOM; 179 var dom = MochiKit.DOM;
177 var isCoordinates = function (o) { 180 var isCoordinates = function (o) {
178 return o != null && 181 return o != null &&
179 o.nodeType == null && 182 o.nodeType == null &&
180 typeof(o.x) == "number" && 183 typeof(o.x) == "number" &&
181 typeof(o.y) == "number"; 184 typeof(o.y) == "number";
182 } 185 };
183 186
184 if (typeof(elem) == "string") { 187 if (typeof(elem) == "string") {
185 elem = dom.getElement(elem); 188 elem = dom.getElement(elem);
186 } 189 }
187 if (elem == null || 190 if (elem == null ||
188 (!isCoordinates(elem) && self.getStyle(elem, 'display') == 'none')) { 191 (!isCoordinates(elem) && self.getStyle(elem, 'display') == 'none')) {
189 return undefined; 192 return undefined;
190 } 193 }
191 194
192 var c = new self.Coordinates(0, 0); 195 var c = new self.Coordinates(0, 0);
193 var box = null; 196 var box = null;
194 var parent = null; 197 var parent = null;
195 198
196 var d = MochiKit.DOM._document; 199 var d = MochiKit.DOM._document;
197 var de = d.documentElement; 200 var de = d.documentElement;
198 var b = d.body; 201 var b = d.body;
199 202
200 if (!elem.parentNode && elem.x && elem.y) { 203 if (isCoordinates(elem)) {
201 /* it's just a MochiKit.Style.Coordinates object */ 204 /* it's just a MochiKit.Style.Coordinates object */
202 c.x += elem.x || 0; 205 c.x += elem.x || 0;
203 c.y += elem.y || 0; 206 c.y += elem.y || 0;
204 } else if (elem.getBoundingClientRect) { // IE shortcut 207 } else if (elem.getBoundingClientRect) { // IE shortcut
205 /* 208 /*
206 209
207 The IE shortcut can be off by two. We fix it. See: 210 The IE shortcut can be off by two. We fix it. See:
208 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp 211 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp
209 212
210 This is similar to the method used in 213 This is similar to the method used in
211 MochiKit.Signal.Event.mouse(). 214 MochiKit.Signal.Event.mouse().
212 215
213 */ 216 */
214 box = elem.getBoundingClientRect(); 217 box = elem.getBoundingClientRect();
215 218
216 c.x += box.left + 219 c.x += box.left +
217 (de.scrollLeft || b.scrollLeft) - 220 (de.scrollLeft || b.scrollLeft) -
218 (de.clientLeft || 0); 221 (de.clientLeft || 0);
219 222
220 c.y += box.top + 223 c.y += box.top +
221 (de.scrollTop || b.scrollTop) - 224 (de.scrollTop || b.scrollTop) -
222 (de.clientTop || 0); 225 (de.clientTop || 0);
223 226
224 } else if (elem.offsetParent) { 227 } else if (elem.offsetParent) {
225 c.x += elem.offsetLeft; 228 c.x += elem.offsetLeft;
226 c.y += elem.offsetTop; 229 c.y += elem.offsetTop;
227 parent = elem.offsetParent; 230 parent = elem.offsetParent;
228 231
229 if (parent != elem) { 232 if (parent != elem) {
230 while (parent) { 233 while (parent) {
231 c.x += parseInt(parent.style.borderLeftWidth) || 0; 234 c.x += parseInt(parent.style.borderLeftWidth, 10) || 0;
232 c.y += parseInt(parent.style.borderTopWidth) || 0; 235 c.y += parseInt(parent.style.borderTopWidth, 10) || 0;
233 c.x += parent.offsetLeft; 236 c.x += parent.offsetLeft;
234 c.y += parent.offsetTop; 237 c.y += parent.offsetTop;
235 parent = parent.offsetParent; 238 parent = parent.offsetParent;
236 } 239 }
237 } 240 }
238 241
239 /* 242 /*
240 243
241 Opera < 9 and old Safari (absolute) incorrectly account for 244 Opera < 9 and old Safari (absolute) incorrectly account for
242 body offsetTop and offsetLeft. 245 body offsetTop and offsetLeft.
243 246
244 */ 247 */
245 var ua = navigator.userAgent.toLowerCase(); 248 var ua = navigator.userAgent.toLowerCase();
246 if ((typeof(opera) != 'undefined' && 249 if ((typeof(opera) != 'undefined' &&
247 parseFloat(opera.version()) < 9) || 250 parseFloat(opera.version()) < 9) ||
248 (ua.indexOf('AppleWebKit') != -1 && 251 (ua.indexOf('AppleWebKit') != -1 &&
249 self.getStyle(elem, 'position') == 'absolute')) { 252 self.getStyle(elem, 'position') == 'absolute')) {
250 253
251 c.x -= b.offsetLeft; 254 c.x -= b.offsetLeft;
252 c.y -= b.offsetTop; 255 c.y -= b.offsetTop;
253 256
254 } 257 }
255 258
256 // Adjust position for strange Opera scroll bug 259 // Adjust position for strange Opera scroll bug
257 if (elem.parentNode) { 260 if (elem.parentNode) {
258 parent = elem.parentNode; 261 parent = elem.parentNode;
259 } else { 262 } else {
260 parent = null; 263 parent = null;
261 } 264 }
262 while (parent) { 265 while (parent) {
263 var tagName = parent.tagName.toUpperCase(); 266 var tagName = parent.tagName.toUpperCase();
264 if (tagName === 'BODY' || tagName === 'HTML') { 267 if (tagName === 'BODY' || tagName === 'HTML') {
265 break; 268 break;
266 } 269 }
267 var disp = self.getStyle(parent, 'display'); 270 var disp = self.getStyle(parent, 'display');
268 // Handle strange Opera bug for some display 271 // Handle strange Opera bug for some display
269 if (disp.search(/^inline|table-row.*$/i)) { 272 if (disp.search(/^inline|table-row.*$/i)) {
270 c.x -= parent.scrollLeft; 273 c.x -= parent.scrollLeft;
271 c.y -= parent.scrollTop; 274 c.y -= parent.scrollTop;
272 } 275 }
273 if (parent.parentNode) { 276 if (parent.parentNode) {
274 parent = parent.parentNode; 277 parent = parent.parentNode;
275 } else { 278 } else {
276 parent = null; 279 parent = null;
277 } 280 }
278 } 281 }
279 } 282 }
280 283
281 if (relativeTo) { 284 if (relativeTo) {
282 relativeTo = arguments.callee(relativeTo); 285 relativeTo = arguments.callee(relativeTo);
283 if (relativeTo) { 286 if (relativeTo) {
284 c.x -= (relativeTo.x || 0); 287 c.x -= (relativeTo.x || 0);
285 c.y -= (relativeTo.y || 0); 288 c.y -= (relativeTo.y || 0);
286 } 289 }
287 } 290 }
288 291
289 return c; 292 return c;
290 }, 293 },
291 294
292 /** @id MochiKit.Style.setElementPosition */ 295 /** @id MochiKit.Style.setElementPosition */
293 setElementPosition: function (elem, newPos/* optional */, units) { 296 setElementPosition: function (elem, newPos/* optional */, units) {
294 elem = MochiKit.DOM.getElement(elem); 297 elem = MochiKit.DOM.getElement(elem);
295 if (typeof(units) == 'undefined') { 298 if (typeof(units) == 'undefined') {
296 units = 'px'; 299 units = 'px';
@@ -329,129 +332,129 @@ MochiKit.Base.update(MochiKit.Style, {
329 element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; 332 element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = '';
330 } 333 }
331 }, 334 },
332 335
333 /** @id MochiKit.Style.makeClipping */ 336 /** @id MochiKit.Style.makeClipping */
334 makeClipping: function (element) { 337 makeClipping: function (element) {
335 element = MochiKit.DOM.getElement(element); 338 element = MochiKit.DOM.getElement(element);
336 var s = element.style; 339 var s = element.style;
337 var oldOverflow = { 'overflow': s.overflow, 340 var oldOverflow = { 'overflow': s.overflow,
338 'overflow-x': s.overflowX, 341 'overflow-x': s.overflowX,
339 'overflow-y': s.overflowY }; 342 'overflow-y': s.overflowY };
340 if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') { 343 if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') {
341 element.style.overflow = 'hidden'; 344 element.style.overflow = 'hidden';
342 element.style.overflowX = 'hidden'; 345 element.style.overflowX = 'hidden';
343 element.style.overflowY = 'hidden'; 346 element.style.overflowY = 'hidden';
344 } 347 }
345 return oldOverflow; 348 return oldOverflow;
346 }, 349 },
347 350
348 /** @id MochiKit.Style.undoClipping */ 351 /** @id MochiKit.Style.undoClipping */
349 undoClipping: function (element, overflow) { 352 undoClipping: function (element, overflow) {
350 element = MochiKit.DOM.getElement(element); 353 element = MochiKit.DOM.getElement(element);
351 if (typeof(overflow) == 'string') { 354 if (typeof(overflow) == 'string') {
352 element.style.overflow = overflow; 355 element.style.overflow = overflow;
353 } else if (overflow != null) { 356 } else if (overflow != null) {
354 element.style.overflow = overflow['overflow']; 357 element.style.overflow = overflow['overflow'];
355 element.style.overflowX = overflow['overflow-x']; 358 element.style.overflowX = overflow['overflow-x'];
356 element.style.overflowY = overflow['overflow-y']; 359 element.style.overflowY = overflow['overflow-y'];
357 } 360 }
358 }, 361 },
359 362
360 /** @id MochiKit.Style.getElementDimensions */ 363 /** @id MochiKit.Style.getElementDimensions */
361 getElementDimensions: function (elem, contentSize/*optional*/) { 364 getElementDimensions: function (elem, contentSize/*optional*/) {
362 var self = MochiKit.Style; 365 var self = MochiKit.Style;
363 var dom = MochiKit.DOM; 366 var dom = MochiKit.DOM;
364 if (typeof(elem.w) == 'number' || typeof(elem.h) == 'number') { 367 if (typeof(elem.w) == 'number' || typeof(elem.h) == 'number') {
365 return new self.Dimensions(elem.w || 0, elem.h || 0); 368 return new self.Dimensions(elem.w || 0, elem.h || 0);
366 } 369 }
367 elem = dom.getElement(elem); 370 elem = dom.getElement(elem);
368 if (!elem) { 371 if (!elem) {
369 return undefined; 372 return undefined;
370 } 373 }
371 var disp = self.getStyle(elem, 'display'); 374 var disp = self.getStyle(elem, 'display');
372 // display can be empty/undefined on WebKit/KHTML 375 // display can be empty/undefined on WebKit/KHTML
373 if (disp == 'none' || disp == '' || typeof(disp) == 'undefined') { 376 if (disp == 'none' || disp == '' || typeof(disp) == 'undefined') {
374 var s = elem.style; 377 var s = elem.style;
375 var originalVisibility = s.visibility; 378 var originalVisibility = s.visibility;
376 var originalPosition = s.position; 379 var originalPosition = s.position;
377 var originalDisplay = s.display; 380 var originalDisplay = s.display;
378 s.visibility = 'hidden'; 381 s.visibility = 'hidden';
379 s.position = 'absolute'; 382 s.position = 'absolute';
380 s.display = self._getDefaultDisplay(elem); 383 s.display = self._getDefaultDisplay(elem);
381 var originalWidth = elem.offsetWidth; 384 var originalWidth = elem.offsetWidth;
382 var originalHeight = elem.offsetHeight; 385 var originalHeight = elem.offsetHeight;
383 s.display = originalDisplay; 386 s.display = originalDisplay;
384 s.position = originalPosition; 387 s.position = originalPosition;
385 s.visibility = originalVisibility; 388 s.visibility = originalVisibility;
386 } else { 389 } else {
387 originalWidth = elem.offsetWidth || 0; 390 originalWidth = elem.offsetWidth || 0;
388 originalHeight = elem.offsetHeight || 0; 391 originalHeight = elem.offsetHeight || 0;
389 } 392 }
390 if (contentSize) { 393 if (contentSize) {
391 var tableCell = 'colSpan' in elem && 'rowSpan' in elem; 394 var tableCell = 'colSpan' in elem && 'rowSpan' in elem;
392 var collapse = (tableCell && elem.parentNode && self.getStyle( 395 var collapse = (tableCell && elem.parentNode && self.getStyle(
393 elem.parentNode, 'borderCollapse') == 'collapse') 396 elem.parentNode, 'borderCollapse') == 'collapse');
394 if (collapse) { 397 if (collapse) {
395 if (/MSIE/.test(navigator.userAgent)) { 398 if (/MSIE/.test(navigator.userAgent)) {
396 var borderLeftQuota = elem.previousSibling? 0.5 : 1; 399 var borderLeftQuota = elem.previousSibling? 0.5 : 1;
397 var borderRightQuota = elem.nextSibling? 0.5 : 1; 400 var borderRightQuota = elem.nextSibling? 0.5 : 1;
398 } 401 }
399 else { 402 else {
400 var borderLeftQuota = 0.5; 403 var borderLeftQuota = 0.5;
401 var borderRightQuota = 0.5; 404 var borderRightQuota = 0.5;
402 } 405 }
403 } else { 406 } else {
404 var borderLeftQuota = 1; 407 var borderLeftQuota = 1;
405 var borderRightQuota = 1; 408 var borderRightQuota = 1;
406 } 409 }
407 originalWidth -= Math.round( 410 originalWidth -= Math.round(
408 (parseFloat(self.getStyle(elem, 'paddingLeft')) || 0) 411 (parseFloat(self.getStyle(elem, 'paddingLeft')) || 0)
409 + (parseFloat(self.getStyle(elem, 'paddingRight')) || 0) 412 + (parseFloat(self.getStyle(elem, 'paddingRight')) || 0)
410 + borderLeftQuota * 413 + borderLeftQuota *
411 (parseFloat(self.getStyle(elem, 'borderLeftWidth')) || 0) 414 (parseFloat(self.getStyle(elem, 'borderLeftWidth')) || 0)
412 + borderRightQuota * 415 + borderRightQuota *
413 (parseFloat(self.getStyle(elem, 'borderRightWidth')) || 0) 416 (parseFloat(self.getStyle(elem, 'borderRightWidth')) || 0)
414 ); 417 );
415 if (tableCell) { 418 if (tableCell) {
416 if (/Gecko|Opera/.test(navigator.userAgent) 419 if (/Gecko|Opera/.test(navigator.userAgent)
417 && !/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)) { 420 && !/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)) {
418 var borderHeightQuota = 0; 421 var borderHeightQuota = 0;
419 } else if (/MSIE/.test(navigator.userAgent)) { 422 } else if (/MSIE/.test(navigator.userAgent)) {
420 var borderHeightQuota = 1; 423 var borderHeightQuota = 1;
421 } else { 424 } else {
422 var borderHeightQuota = collapse? 0.5 : 1; 425 var borderHeightQuota = collapse? 0.5 : 1;
423 } 426 }
424 } else { 427 } else {
425 var borderHeightQuota = 1; 428 var borderHeightQuota = 1;
426 } 429 }
427 originalHeight -= Math.round( 430 originalHeight -= Math.round(
428 (parseFloat(self.getStyle(elem, 'paddingTop')) || 0) 431 (parseFloat(self.getStyle(elem, 'paddingTop')) || 0)
429 + (parseFloat(self.getStyle(elem, 'paddingBottom')) || 0) 432 + (parseFloat(self.getStyle(elem, 'paddingBottom')) || 0)
430 + borderHeightQuota * ( 433 + borderHeightQuota * (
431 (parseFloat(self.getStyle(elem, 'borderTopWidth')) || 0) 434 (parseFloat(self.getStyle(elem, 'borderTopWidth')) || 0)
432 + (parseFloat(self.getStyle(elem, 'borderBottomWidth')) || 0)) 435 + (parseFloat(self.getStyle(elem, 'borderBottomWidth')) || 0))
433 ); 436 );
434 } 437 }
435 return new self.Dimensions(originalWidth, originalHeight); 438 return new self.Dimensions(originalWidth, originalHeight);
436 }, 439 },
437 440
438 /** @id MochiKit.Style.setElementDimensions */ 441 /** @id MochiKit.Style.setElementDimensions */
439 setElementDimensions: function (elem, newSize/* optional */, units) { 442 setElementDimensions: function (elem, newSize/* optional */, units) {
440 elem = MochiKit.DOM.getElement(elem); 443 elem = MochiKit.DOM.getElement(elem);
441 if (typeof(units) == 'undefined') { 444 if (typeof(units) == 'undefined') {
442 units = 'px'; 445 units = 'px';
443 } 446 }
444 var newStyle = {}; 447 var newStyle = {};
445 var isUndefNull = MochiKit.Base.isUndefinedOrNull; 448 var isUndefNull = MochiKit.Base.isUndefinedOrNull;
446 if (!isUndefNull(newSize.w)) { 449 if (!isUndefNull(newSize.w)) {
447 newStyle['width'] = newSize.w + units; 450 newStyle['width'] = newSize.w + units;
448 } 451 }
449 if (!isUndefNull(newSize.h)) { 452 if (!isUndefNull(newSize.h)) {
450 newStyle['height'] = newSize.h + units; 453 newStyle['height'] = newSize.h + units;
451 } 454 }
452 MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle}); 455 MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle});
453 }, 456 },
454 457
455 _getDefaultDisplay: function (elem) { 458 _getDefaultDisplay: function (elem) {
456 var self = MochiKit.Style; 459 var self = MochiKit.Style;
457 var dom = MochiKit.DOM; 460 var dom = MochiKit.DOM;
@@ -482,77 +485,77 @@ MochiKit.Base.update(MochiKit.Style, {
482 var b = MochiKit.DOM._document.body; 485 var b = MochiKit.DOM._document.body;
483 if (w.innerWidth) { 486 if (w.innerWidth) {
484 d.w = w.innerWidth; 487 d.w = w.innerWidth;
485 d.h = w.innerHeight; 488 d.h = w.innerHeight;
486 } else if (b && b.parentElement && b.parentElement.clientWidth) { 489 } else if (b && b.parentElement && b.parentElement.clientWidth) {
487 d.w = b.parentElement.clientWidth; 490 d.w = b.parentElement.clientWidth;
488 d.h = b.parentElement.clientHeight; 491 d.h = b.parentElement.clientHeight;
489 } else if (b && b.clientWidth) { 492 } else if (b && b.clientWidth) {
490 d.w = b.clientWidth; 493 d.w = b.clientWidth;
491 d.h = b.clientHeight; 494 d.h = b.clientHeight;
492 } 495 }
493 return d; 496 return d;
494 }, 497 },
495 498
496 /** @id MochiKit.Style.getViewportPosition */ 499 /** @id MochiKit.Style.getViewportPosition */
497 getViewportPosition: function () { 500 getViewportPosition: function () {
498 var c = new MochiKit.Style.Coordinates(0, 0); 501 var c = new MochiKit.Style.Coordinates(0, 0);
499 var d = MochiKit.DOM._document; 502 var d = MochiKit.DOM._document;
500 var de = d.documentElement; 503 var de = d.documentElement;
501 var db = d.body; 504 var db = d.body;
502 if (de && (de.scrollTop || de.scrollLeft)) { 505 if (de && (de.scrollTop || de.scrollLeft)) {
503 c.x = de.scrollLeft; 506 c.x = de.scrollLeft;
504 c.y = de.scrollTop; 507 c.y = de.scrollTop;
505 } else if (db) { 508 } else if (db) {
506 c.x = db.scrollLeft; 509 c.x = db.scrollLeft;
507 c.y = db.scrollTop; 510 c.y = db.scrollTop;
508 } 511 }
509 return c; 512 return c;
510 }, 513 },
511 514
512 __new__: function () { 515 __new__: function () {
513 var m = MochiKit.Base; 516 var m = MochiKit.Base;
514 517
515 var inlines = ['A','ABBR','ACRONYM','B','BASEFONT','BDO','BIG','BR', 518 var inlines = ['A','ABBR','ACRONYM','B','BASEFONT','BDO','BIG','BR',
516 'CITE','CODE','DFN','EM','FONT','I','IMG','KBD','LABEL', 519 'CITE','CODE','DFN','EM','FONT','I','IMG','KBD','LABEL',
517 'Q','S','SAMP','SMALL','SPAN','STRIKE','STRONG','SUB', 520 'Q','S','SAMP','SMALL','SPAN','STRIKE','STRONG','SUB',
518 'SUP','TEXTAREA','TT','U','VAR']; 521 'SUP','TEXTAREA','TT','U','VAR'];
519 this._defaultDisplay = { 'TABLE': 'table', 522 this._defaultDisplay = { 'TABLE': 'table',
520 'THEAD': 'table-header-group', 523 'THEAD': 'table-header-group',
521 'TBODY': 'table-row-group', 524 'TBODY': 'table-row-group',
522 'TFOOT': 'table-footer-group', 525 'TFOOT': 'table-footer-group',
523 'COLGROUP': 'table-column-group', 526 'COLGROUP': 'table-column-group',
524 'COL': 'table-column', 527 'COL': 'table-column',
525 'TR': 'table-row', 528 'TR': 'table-row',
526 'TD': 'table-cell', 529 'TD': 'table-cell',
527 'TH': 'table-cell', 530 'TH': 'table-cell',
528 'CAPTION': 'table-caption', 531 'CAPTION': 'table-caption',
529 'LI': 'list-item', 532 'LI': 'list-item',
530 'INPUT': 'inline-block', 533 'INPUT': 'inline-block',
531 'SELECT': 'inline-block' }; 534 'SELECT': 'inline-block' };
532 // CSS 'display' support in IE6/7 is just broken... 535 // CSS 'display' support in IE6/7 is just broken...
533 if (/MSIE/.test(navigator.userAgent)) { 536 if (/MSIE/.test(navigator.userAgent)) {
534 for (var k in this._defaultDisplay) { 537 for (var k in this._defaultDisplay) {
535 var v = this._defaultDisplay[k]; 538 var v = this._defaultDisplay[k];
536 if (v.indexOf('table') == 0) { 539 if (v.indexOf('table') == 0) {
537 this._defaultDisplay[k] = 'block'; 540 this._defaultDisplay[k] = 'block';
538 } 541 }
539 } 542 }
540 } 543 }
541 for (var i = 0; i < inlines.length; i++) { 544 for (var i = 0; i < inlines.length; i++) {
542 this._defaultDisplay[inlines[i]] = 'inline'; 545 this._defaultDisplay[inlines[i]] = 'inline';
543 } 546 }
544 547
545 // Backwards compatibility aliases 548 // Backwards compatibility aliases
546 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.3'); 549 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.3', true);
547 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.3'); 550 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.3', true);
548 551
549 this.hideElement = m.partial(this.setDisplayForElement, 'none'); 552 this.hideElement = m.partial(this.setDisplayForElement, 'none');
550 // TODO: showElement could be improved by using getDefaultDisplay. 553 // TODO: showElement could be improved by using getDefaultDisplay.
551 this.showElement = m.partial(this.setDisplayForElement, 'block'); 554 this.showElement = m.partial(this.setDisplayForElement, 'block');
552 555
553 m.nameFunctions(this); 556 m.nameFunctions(this);
554 } 557 }
555}); 558});
556 559
557MochiKit.Style.__new__(); 560MochiKit.Style.__new__();
558MochiKit.Base._exportSymbols(this, MochiKit.Style); 561MochiKit.Base._exportSymbols(this, MochiKit.Style);
diff --git a/frontend/gamma/js/MochiKit/Test.js b/frontend/gamma/js/MochiKit/Test.js
index 9520ab2..f29670f 100644
--- a/frontend/gamma/js/MochiKit/Test.js
+++ b/frontend/gamma/js/MochiKit/Test.js
@@ -1,75 +1,75 @@
1/*** 1/***
2 2
3MochiKit.Test 1.5 3MochiKit.Test 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito. All rights Reserved. 7(c) 2005 Bob Ippolito. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Test', '1.5', ['Base']); 11MochiKit.Base.module(MochiKit, 'Test', '1.5', ['Base']);
12 12
13MochiKit.Test.runTests = function (obj) { 13MochiKit.Test.runTests = function (obj) {
14 if (typeof(obj) == "string") { 14 if (typeof(obj) == "string") {
15 // TODO: Remove this temporary API change advertisement 15 // TODO: Remove this temporary API change advertisement
16 throw new TypeError("Automatic module import not supported, call runTests() with proper object: " + obj); 16 throw new TypeError("Automatic module import not supported, call runTests() with proper object: " + obj);
17 } 17 }
18 var suite = new MochiKit.Test.Suite(); 18 var suite = new MochiKit.Test.Suite();
19 suite.run(obj); 19 suite.run(obj);
20}; 20};
21 21
22MochiKit.Test.Suite = function () { 22MochiKit.Test.Suite = function () {
23 this.testIndex = 0; 23 this.testIndex = 0;
24 MochiKit.Base.bindMethods(this); 24 MochiKit.Base.bindMethods(this);
25}; 25};
26 26
27MochiKit.Test.Suite.prototype = { 27MochiKit.Test.Suite.prototype = {
28 run: function (obj) { 28 run: function (obj) {
29 try { 29 try {
30 obj(this); 30 obj(this);
31 } catch (e) { 31 } catch (e) {
32 this.traceback(e); 32 this.traceback(e);
33 } 33 }
34 }, 34 },
35 traceback: function (e) { 35 traceback: function (e) {
36 var items = MochiKit.Iter.sorted(MochiKit.Base.items(e)); 36 var items = MochiKit.Iter.sorted(MochiKit.Base.items(e));
37 print("not ok " + this.testIndex + " - Error thrown"); 37 print("not ok " + this.testIndex + " - Error thrown");
38 for (var i = 0; i < items.length; i++) { 38 for (var i = 0; i < items.length; i++) {
39 var kv = items[i]; 39 var kv = items[i];
40 if (kv[0] == "stack") { 40 if (kv[0] == "stack") {
41 kv[1] = kv[1].split(/\n/)[0]; 41 kv[1] = kv[1].split(/\n/)[0];
42 } 42 }
43 this.print("# " + kv.join(": ")); 43 this.print("# " + kv.join(": "));
44 } 44 }
45 }, 45 },
46 print: function (s) { 46 print: function (s) {
47 print(s); 47 print(s);
48 }, 48 },
49 is: function (got, expected, /* optional */message) { 49 is: function (got, expected, /* optional */message) {
50 var res = 1; 50 var res = 1;
51 var msg = null; 51 var msg = null;
52 try { 52 try {
53 res = MochiKit.Base.compare(got, expected); 53 res = MochiKit.Base.compare(got, expected);
54 } catch (e) { 54 } catch (e) {
55 msg = "Can not compare " + typeof(got) + ":" + typeof(expected); 55 msg = "Can not compare " + typeof(got) + ":" + typeof(expected);
56 } 56 }
57 if (res) { 57 if (res) {
58 msg = "Expected value did not compare equal"; 58 msg = "Expected value did not compare equal";
59 } 59 }
60 if (!res) { 60 if (!res) {
61 return this.testResult(true, message); 61 return this.testResult(true, message);
62 } 62 }
63 return this.testResult(false, message, 63 return this.testResult(false, message,
64 [[msg], ["got:", got], ["expected:", expected]]); 64 [[msg], ["got:", got], ["expected:", expected]]);
65 }, 65 },
66 66
67 testResult: function (pass, msg, failures) { 67 testResult: function (pass, msg, failures) {
68 this.testIndex += 1; 68 this.testIndex += 1;
69 if (pass) { 69 if (pass) {
70 this.print("ok " + this.testIndex + " - " + msg); 70 this.print("ok " + this.testIndex + " - " + msg);
71 return; 71 return;
72 } 72 }
73 this.print("not ok " + this.testIndex + " - " + msg); 73 this.print("not ok " + this.testIndex + " - " + msg);
74 if (failures) { 74 if (failures) {
75 for (var i = 0; i < failures.length; i++) { 75 for (var i = 0; i < failures.length; i++) {
diff --git a/frontend/gamma/js/MochiKit/Text.js b/frontend/gamma/js/MochiKit/Text.js
index a44f7e4..ff6366d 100644
--- a/frontend/gamma/js/MochiKit/Text.js
+++ b/frontend/gamma/js/MochiKit/Text.js
@@ -1,577 +1,546 @@
1/*** 1/***
2 2
3MochiKit.Text 1.5 3MochiKit.Text 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2008 Per Cederberg. All rights Reserved. 7(c) 2008 Per Cederberg. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Text', '1.5', ['Base', 'Format']); 11MochiKit.Base.module(MochiKit, 'Text', '1.5', ['Base', 'Format']);
12 12
13/** 13/**
14 * Checks if a text string starts with the specified substring. If 14 * Checks if a text string starts with the specified substring. If
15 * either of the two strings is null, false will be returned. 15 * either of the two strings is null, false will be returned.
16 * 16 *
17 * @param {String} substr the substring to search for 17 * @param {String} substr the substring to search for
18 * @param {String} str the string to search in 18 * @param {String} str the string to search in
19 * 19 *
20 * @return {Boolean} true if the string starts with the substring, or 20 * @return {Boolean} true if the string starts with the substring, or
21 * false otherwise 21 * false otherwise
22 */ 22 */
23MochiKit.Text.startsWith = function (substr, str) { 23MochiKit.Text.startsWith = function (substr, str) {
24 return str != null && substr != null && str.indexOf(substr) == 0; 24 return str != null && substr != null && str.indexOf(substr) == 0;
25} 25};
26 26
27/** 27/**
28 * Checks if a text string ends with the specified substring. If 28 * Checks if a text string ends with the specified substring. If
29 * either of the two strings is null, false will be returned. 29 * either of the two strings is null, false will be returned.
30 * 30 *
31 * @param {String} substr the substring to search for 31 * @param {String} substr the substring to search for
32 * @param {String} str the string to search in 32 * @param {String} str the string to search in
33 * 33 *
34 * @return {Boolean} true if the string ends with the substring, or 34 * @return {Boolean} true if the string ends with the substring, or
35 * false otherwise 35 * false otherwise
36 */ 36 */
37MochiKit.Text.endsWith = function (substr, str) { 37MochiKit.Text.endsWith = function (substr, str) {
38 return str != null && substr != null && 38 return str != null && substr != null &&
39 str.lastIndexOf(substr) == Math.max(str.length - substr.length, 0); 39 str.lastIndexOf(substr) == Math.max(str.length - substr.length, 0);
40} 40};
41 41
42/** 42/**
43 * Checks if a text string contains the specified substring. If 43 * Checks if a text string contains the specified substring. If
44 * either of the two strings is null, false will be returned. 44 * either of the two strings is null, false will be returned.
45 * 45 *
46 * @param {String} substr the substring to search for 46 * @param {String} substr the substring to search for
47 * @param {String} str the string to search in 47 * @param {String} str the string to search in
48 * 48 *
49 * @return {Boolean} true if the string contains the substring, or 49 * @return {Boolean} true if the string contains the substring, or
50 * false otherwise 50 * false otherwise
51 */ 51 */
52MochiKit.Text.contains = function (substr, str) { 52MochiKit.Text.contains = function (substr, str) {
53 return str != null && substr != null && str.indexOf(substr) >= 0; 53 return str != null && substr != null && str.indexOf(substr) >= 0;
54} 54};
55 55
56/** 56/**
57 * Adds a character to the left-hand side of a string until it 57 * Adds a character to the left-hand side of a string until it
58 * reaches the specified minimum length. 58 * reaches the specified minimum length.
59 * 59 *
60 * @param {String} str the string to process 60 * @param {String} str the string to process
61 * @param {Number} minLength the requested minimum length 61 * @param {Number} minLength the requested minimum length
62 * @param {String} fillChar the padding character to add, defaults 62 * @param {String} fillChar the padding character to add, defaults
63 * to a space 63 * to a space
64 * 64 *
65 * @return {String} the padded string 65 * @return {String} the padded string
66 */ 66 */
67MochiKit.Text.padLeft = function (str, minLength, fillChar) { 67MochiKit.Text.padLeft = function (str, minLength, fillChar) {
68 str = str || ""; 68 str = str || "";
69 fillChar = fillChar || " "; 69 fillChar = fillChar || " ";
70 while (str.length < minLength) { 70 while (str.length < minLength) {
71 str = fillChar + str; 71 str = fillChar + str;
72 } 72 }
73 return str; 73 return str;
74} 74};
75 75
76/** 76/**
77 * Adds a character to the right-hand side of a string until it 77 * Adds a character to the right-hand side of a string until it
78 * reaches the specified minimum length. 78 * reaches the specified minimum length.
79 * 79 *
80 * @param {String} str the string to process 80 * @param {String} str the string to process
81 * @param {Number} minLength the requested minimum length 81 * @param {Number} minLength the requested minimum length
82 * @param {String} fillChar the padding character to add, defaults 82 * @param {String} fillChar the padding character to add, defaults
83 * to a space 83 * to a space
84 * 84 *
85 * @return {String} the padded string 85 * @return {String} the padded string
86 */ 86 */
87MochiKit.Text.padRight = function (str, minLength, fillChar) { 87MochiKit.Text.padRight = function (str, minLength, fillChar) {
88 str = str || ""; 88 str = str || "";
89 fillChar = fillChar || " "; 89 fillChar = fillChar || " ";
90 while (str.length < minLength) { 90 while (str.length < minLength) {
91 str += fillChar; 91 str += fillChar;
92 } 92 }
93 return str; 93 return str;
94} 94};
95 95
96/** 96/**
97 * Returns a truncated copy of a string. If the string is shorter 97 * Returns a truncated copy of a string. If the string is shorter
98 * than the specified maximum length, the object will be returned 98 * than the specified maximum length, the object will be returned
99 * unmodified. If an optional tail string is specified, additional 99 * unmodified. If an optional tail string is specified, additional
100 * elements will be removed in order to accomodate the tail (that 100 * elements will be removed in order to accomodate the tail (that
101 * will be appended). This function also works on arrays. 101 * will be appended). This function also works on arrays.
102 * 102 *
103 * @param {String} str the string to truncate 103 * @param {String} str the string to truncate
104 * @param {Number} maxLength the maximum length 104 * @param {Number} maxLength the maximum length
105 * @param {String} [tail] the tail to append on truncation 105 * @param {String} [tail] the tail to append on truncation
106 * 106 *
107 * @return {String} the truncated string 107 * @return {String} the truncated string
108 */ 108 */
109MochiKit.Text.truncate = function (str, maxLength, tail) { 109MochiKit.Text.truncate = function (str, maxLength, tail) {
110 if (str == null || str.length <= maxLength || maxLength < 0) { 110 if (str == null || str.length <= maxLength || maxLength < 0) {
111 return str; 111 return str;
112 } else if (tail != null) { 112 } else if (tail != null) {
113 str = str.slice(0, Math.max(0, maxLength - tail.length)); 113 str = str.slice(0, Math.max(0, maxLength - tail.length));
114 if (typeof(str) == "string") { 114 if (typeof(str) == "string") {
115 return str + tail; 115 return str + tail;
116 } else { 116 } else {
117 return MochiKit.Base.extend(str, tail); 117 return MochiKit.Base.extend(str, tail);
118 } 118 }
119 } else { 119 } else {
120 return str.slice(0, maxLength); 120 return str.slice(0, maxLength);
121 } 121 }
122} 122};
123 123
124/** 124/**
125 * Splits a text string, applies a function and joins the results 125 * Splits a text string using separator as the split point
126 * back together again. This is a convenience function for calling 126 * If max is given, at most max splits are done, giving at most
127 * split(), map() and join() separately. It can be used to easily 127 * max + 1 elements in the returned list.
128 * trim each line in a text string (using the strip function), or to
129 * translate a text word-by-word.
130 * 128 *
131 * @param {Function} func the function to apply
132 * @param {String} str the string to split 129 * @param {String} str the string to split
133 * @param {String} [separator] the separator character to use, 130 * @param {String/RegExp} [separator] the separator char or regexp to use,
134 * defaults to newline 131 * defaults to newline
132 * @param {Number} [max] the maximum number of parts to return
133 * @return {Array} an array of parts of the string
134 */
135MochiKit.Text.split = function (str, separator, max) {
136 if (str == null) {
137 return str;
138 }
139 separator = separator || '\n';
140 var bits = str.split(separator);
141 if ((typeof(max) == "undefined") || max >= bits.length - 1) {
142 return bits;
143 }
144 bits.splice(max, bits.length, bits.slice(max, bits.length).join(separator));
145 return bits;
146};
147
148/**
149 * Splits a text string using separator as the split point
150 * If max is given, at most max splits are done,
151 * using splits from the right
135 * 152 *
136 * @return {String} a string with the joined up results 153 * @param {String} str the string to split
154 * @param {String/RegExp} [separator] the separator char or regexp to use,
155 * defaults to newline
156 * @param {Number} [max] the maximum number of parts to return
157 * @return {Array} an array of parts of the string
137 */ 158 */
138MochiKit.Text.splitJoin = function (func, str, separator) { 159MochiKit.Text.rsplit = function (str, separator, max) {
139 if (str == null || str.length == 0) { 160 if (str == null) {
140 return str; 161 return str;
141 } 162 }
142 separator = separator || '\n' 163 separator = separator || '\n';
143 return MochiKit.Base.map(func, str.split(separator)).join(separator); 164 var bits = str.split(separator);
144} 165 if ((typeof(max) == "undefined") || max >= bits.length - 1){
166 return bits;
167 }
168 bits.splice(0, bits.length-max, bits.slice(0, bits.length-max).join(separator));
169 return bits;
170};
145 171
146/** 172/**
147 * Creates a formatter function for the specified formatter pattern 173 * Creates a formatter function for the specified formatter pattern
148 * and locale. The returned function takes as many arguments as the 174 * and locale. The returned function takes as many arguments as the
149 * formatter pattern requires. See separate documentation for 175 * formatter pattern requires. See separate documentation for
150 * information about the formatter pattern syntax. 176 * information about the formatter pattern syntax.
151 * 177 *
152 * @param {String} pattern the formatter pattern string 178 * @param {String} pattern the formatter pattern string
153 * @param {Object} [locale] the locale to use, defaults to 179 * @param {Object} [locale] the locale to use, defaults to
154 * LOCALE.en_US 180 * LOCALE.en_US
155 * 181 *
156 * @return {Function} the formatter function created 182 * @return {Function} the formatter function created
157 * 183 *
158 * @throws FormatPatternError if the format pattern was invalid 184 * @throws FormatPatternError if the format pattern was invalid
159 */ 185 */
160MochiKit.Text.formatter = function (pattern, locale) { 186MochiKit.Text.formatter = function (pattern, locale) {
161 if (typeof(locale) == "undefined") { 187 if (locale == null) {
162 locale = MochiKit.Format.formatLocale(); 188 locale = MochiKit.Format.formatLocale();
163 } else if (typeof(locale) == "string") { 189 } else if (typeof(locale) == "string") {
164 locale = MochiKit.Format.formatLocale(locale); 190 locale = MochiKit.Format.formatLocale(locale);
165 } 191 }
166 var parts = MochiKit.Text._parsePattern(pattern); 192 var parts = MochiKit.Text._parsePattern(pattern);
167 return function() { 193 return function() {
168 var values = MochiKit.Base.extend([], arguments); 194 var values = MochiKit.Base.extend([], arguments);
169 var res = []; 195 var res = [];
170 for (var i = 0; i < parts.length; i++) { 196 for (var i = 0; i < parts.length; i++) {
171 if (typeof(parts[i]) == "string") { 197 if (typeof(parts[i]) == "string") {
172 res.push(parts[i]); 198 res.push(parts[i]);
173 } else { 199 } else {
174 res.push(MochiKit.Text.formatValue(parts[i], values, locale)); 200 res.push(MochiKit.Text.formatValue(parts[i], values, locale));
175 } 201 }
176 } 202 }
177 return res.join(""); 203 return res.join("");
178 } 204 };
179} 205};
180 206
181/** 207/**
182 * Formats the specified arguments according to a formatter pattern. 208 * Formats the specified arguments according to a formatter pattern.
183 * See separate documentation for information about the formatter 209 * See separate documentation for information about the formatter
184 * pattern syntax. 210 * pattern syntax.
185 * 211 *
186 * @param {String} pattern the formatter pattern string 212 * @param {String} pattern the formatter pattern string
187 * @param {Object} [...] the optional values to format 213 * @param {Object} [...] the optional values to format
188 * 214 *
189 * @return {String} the formatted output string 215 * @return {String} the formatted output string
190 * 216 *
191 * @throws FormatPatternError if the format pattern was invalid 217 * @throws FormatPatternError if the format pattern was invalid
192 */ 218 */
193MochiKit.Text.format = function (pattern/*, ...*/) { 219MochiKit.Text.format = function (pattern/*, ...*/) {
194 var func = MochiKit.Text.formatter(pattern); 220 var func = MochiKit.Text.formatter(pattern);
195 return func.apply(this, MochiKit.Base.extend([], arguments, 1)); 221 return func.apply(this, MochiKit.Base.extend([], arguments, 1));
196} 222};
197 223
198/** 224/**
199 * Format a value with the specified format specifier. 225 * Format a value with the specified format specifier.
200 * 226 *
201 * @param {String/Object} spec the format specifier string or parsed 227 * @param {String/Object} spec the format specifier string or parsed
202 * format specifier object 228 * format specifier object
203 * @param {Object} value the value to format 229 * @param {Object} value the value to format
204 * @param {Object} [locale] the locale to use, defaults to 230 * @param {Object} [locale] the locale to use, defaults to
205 * LOCALE.en_US 231 * LOCALE.en_US
206 * 232 *
207 * @return {String} the formatted output string 233 * @return {String} the formatted output string
234 *
235 * @throws FormatPatternError if the format specifier was invalid
208 */ 236 */
209MochiKit.Text.formatValue = function (spec, value, locale) { 237MochiKit.Text.formatValue = function (spec, value, locale) {
210 var self = MochiKit.Text; 238 var self = MochiKit.Text;
211 if (typeof(spec) === "string") { 239 if (typeof(spec) === "string") {
212 spec = self._parseFormatFlags(spec, 0, spec.length - 1); 240 spec = self._parseFormatFlags(spec, 0, spec.length);
213 } 241 }
214 for (var i = 0; spec.path != null && i < spec.path.length; i++) { 242 for (var i = 0; spec.path != null && i < spec.path.length; i++) {
215 if (value != null) { 243 if (value != null) {
216 value = value[spec.path[i]]; 244 value = value[spec.path[i]];
217 } 245 }
218 } 246 }
219 if (typeof(locale) == "undefined") { 247 if (locale == null) {
220 locale = MochiKit.Format.formatLocale(); 248 locale = MochiKit.Format.formatLocale();
221 } else if (typeof(locale) == "string") { 249 } else if (typeof(locale) == "string") {
222 locale = MochiKit.Format.formatLocale(locale); 250 locale = MochiKit.Format.formatLocale(locale);
223 } 251 }
224 var str = ""; 252 var str = "";
225 if (spec.numeric) { 253 if (spec.type == "number") {
254 if (value instanceof Number) {
255 value = value.valueOf();
256 }
226 if (typeof(value) != "number" || isNaN(value)) { 257 if (typeof(value) != "number" || isNaN(value)) {
227 str = ""; 258 str = "";
228 } else if (value === Number.POSITIVE_INFINITY) { 259 } else if (value === Number.POSITIVE_INFINITY) {
229 str = "\u221e"; 260 str = "\u221e";
230 } else if (value === Number.NEGATIVE_INFINITY) { 261 } else if (value === Number.NEGATIVE_INFINITY) {
231 str = "-\u221e"; 262 str = "-\u221e";
232 } else { 263 } else {
233 var sign = (spec.sign === "-") ? "" : spec.sign; 264 var sign = (value < 0) ? "-" : spec.sign;
234 sign = (value < 0) ? "-" : sign;
235 value = Math.abs(value); 265 value = Math.abs(value);
236 if (spec.format === "%") { 266 if (spec.format === "%") {
237 str = self._truncToPercent(value, spec.precision); 267 str = self._truncToPercent(value, spec.precision);
238 } else if (spec.format === "d") { 268 } else if (spec.format === "d") {
239 str = MochiKit.Format.roundToFixed(value, 0); 269 str = MochiKit.Format.roundToFixed(value, 0);
240 } else if (spec.radix != 10) { 270 } else if (spec.radix != 10) {
241 str = Math.floor(value).toString(spec.radix); 271 str = Math.floor(value).toString(spec.radix);
242 if (spec.format === "x") { 272 if (spec.format === "x") {
243 str = str.toLowerCase(); 273 str = str.toLowerCase();
244 } else if (spec.format === "X") { 274 } else if (spec.format === "X") {
245 str = str.toUpperCase(); 275 str = str.toUpperCase();
246 } 276 }
247 } else if (spec.precision >= 0) { 277 } else if (spec.precision >= 0) {
248 str = MochiKit.Format.roundToFixed(value, spec.precision); 278 str = MochiKit.Format.roundToFixed(value, spec.precision);
249 } else { 279 } else {
250 str = value.toString(); 280 str = value.toString();
251 } 281 }
252 if (spec.padding === "0" && spec.format === "%") { 282 if (spec.padding === "0" && spec.format === "%") {
253 str = self.padLeft(str, spec.width - sign.length - 1, "0"); 283 str = self.padLeft(str, spec.width - sign.length - 1, "0");
254 } else if (spec.padding == "0") { 284 } else if (spec.padding == "0") {
255 str = self.padLeft(str, spec.width - sign.length, "0"); 285 str = self.padLeft(str, spec.width - sign.length, "0");
256 } 286 }
257 str = self._localizeNumber(str, locale, spec.grouping); 287 str = self._localizeNumber(str, locale, spec.group);
258 str = sign + str; 288 str = sign + str;
259 } 289 }
260 if (str !== "" && spec.format === "%") { 290 if (str !== "" && spec.format === "%") {
261 str = str + locale.percent; 291 str = str + locale.percent;
262 } 292 }
263 } else { 293 } else {
264 if (spec.format == "r") { 294 if (spec.format == "r") {
265 str = MochiKit.Base.repr(value); 295 str = MochiKit.Base.repr(value);
266 } else { 296 } else {
267 str = (value == null) ? "null" : value.toString(); 297 str = (value == null) ? "" : value.toString();
268 } 298 }
269 str = self.truncate(str, spec.precision); 299 str = self.truncate(str, spec.precision);
270 } 300 }
271 if (spec.align == "<") { 301 if (spec.align == "<") {
272 str = self.padRight(str, spec.width); 302 str = self.padRight(str, spec.width);
273 } else { 303 } else {
274 str = self.padLeft(str, spec.width); 304 str = self.padLeft(str, spec.width);
275 } 305 }
276 return str; 306 return str;
277} 307};
278 308
279/** 309/**
280 * Adjust an already formatted numeric string for locale-specific 310 * Adjust an already formatted numeric string for locale-specific
281 * grouping and decimal separators. The grouping is optional and 311 * grouping and decimal separators. The grouping is optional and
282 * will attempt to keep the number string length intact by removing 312 * will attempt to keep the number string length intact by removing
283 * padded zeros (if possible). 313 * padded zeros (if possible).
284 * 314 *
285 * @param {String} num the formatted number string 315 * @param {String} num the formatted number string
286 * @param {Object} locale the formatting locale to use 316 * @param {Object} locale the formatting locale to use
287 * @param {Boolean} grouping the grouping flag 317 * @param {Boolean} group the grouping flag
288 * 318 *
289 * @return {String} the localized number string 319 * @return {String} the localized number string
290 */ 320 */
291MochiKit.Text._localizeNumber = function (num, locale, grouping) { 321MochiKit.Text._localizeNumber = function (num, locale, group) {
292 var parts = num.split(/\./); 322 var parts = num.split(/\./);
293 var whole = parts[0]; 323 var whole = parts[0];
294 var frac = (parts.length == 1) ? "" : parts[1]; 324 var frac = (parts.length == 1) ? "" : parts[1];
295 var res = (frac.length > 0) ? locale.decimal : ""; 325 var res = (frac.length > 0) ? locale.decimal : "";
296 while (grouping && frac.length > 3) { 326 while (group && frac.length > 3) {
297 res = res + frac.substring(0, 3) + locale.separator; 327 res = res + frac.substring(0, 3) + locale.separator;
298 frac = frac.substring(3); 328 frac = frac.substring(3);
299 if (whole.charAt(0) == "0") { 329 if (whole.charAt(0) == "0") {
300 whole = whole.substring(1); 330 whole = whole.substring(1);
301 } 331 }
302 } 332 }
303 if (frac.length > 0) { 333 if (frac.length > 0) {
304 res += frac; 334 res = res + frac;
305 } 335 }
306 while (grouping && whole.length > 3) { 336 while (group && whole.length > 3) {
307 var pos = whole.length - 3; 337 var pos = whole.length - 3;
308 res = locale.separator + whole.substring(pos) + res; 338 res = locale.separator + whole.substring(pos) + res;
309 whole = whole.substring((whole.charAt(0) == "0") ? 1 : 0, pos); 339 whole = whole.substring((whole.charAt(0) == "0") ? 1 : 0, pos);
310 } 340 }
311 return whole + res; 341 return whole + res;
312} 342};
313 343
314/** 344/**
315 * Parses a format pattern and returns an array of constant strings 345 * Parses a format pattern and returns an array of constant strings
316 * and format info objects. 346 * and format info objects.
317 * 347 *
318 * @param {String} pattern the format pattern to analyze 348 * @param {String} pattern the format pattern to analyze
319 * 349 *
320 * @return {Array} an array of strings and format info objects 350 * @return {Array} an array of strings and format info objects
321 * 351 *
322 * @throws FormatPatternError if the format pattern was invalid 352 * @throws FormatPatternError if the format pattern was invalid
323 */ 353 */
324MochiKit.Text._parsePattern = function (pattern) { 354MochiKit.Text._parsePattern = function (pattern) {
325 var self = MochiKit.Text; 355 var self = MochiKit.Text;
326 var parts = []; 356 var parts = [];
327 var start = 0; 357 var re = /{[^{}]*}|{{?|}}?/g;
328 var pos = 0; 358 var lastPos = re.lastIndex = 0;
329 for (pos = 0; pos < pattern.length; pos++) { 359 var m;
330 if (pattern.charAt(pos) == "{") { 360 while ((m = re.exec(pattern)) != null) {
331 if (pos + 1 >= pattern.length) { 361 if (lastPos < m.index) {
332 var msg = "unescaped { char, should be escaped as {{"; 362 parts.push(pattern.substring(lastPos, m.index))
333 throw new self.FormatPatternError(pattern, pos, msg); 363 }
334 } else if (pattern.charAt(pos + 1) == "{") { 364 var str = m[0];
335 parts.push(pattern.substring(start, pos + 1)); 365 lastPos = m.index + str.length;
336 start = pos + 2; 366 if (self.startsWith("{", str) && self.endsWith("}", str)) {
337 pos++; 367 parts.push(self._parseFormat(pattern, m.index + 1, lastPos - 1));
338 } else { 368 } else if (self.startsWith("{{", str) || self.startsWith("}}", str)) {
339 if (start < pos) { 369 parts.push(str.substring(1));
340 parts.push(pattern.substring(start, pos)); 370 } else if (self.startsWith("{", str)) {
341 } 371 var msg = "unescaped { char, should be escaped as {{";
342 start = pattern.indexOf("}", pos) + 1; 372 throw new self.FormatPatternError(pattern, m.index, msg);
343 if (start <= 0) { 373 } else if (self.startsWith("}", str)) {
344 var msg = "unmatched { char, not followed by a } char"; 374 var msg = "unescaped } char, should be escaped as }}";
345 throw new self.FormatPatternError(pattern, pos, msg); 375 throw new self.FormatPatternError(pattern, m.index, msg);
346 }
347 parts.push(self._parseFormat(pattern, pos + 1, start - 1));
348 pos = start - 1;
349 }
350 } else if (pattern.charAt(pos) == "}") {
351 if (pos + 1 >= pattern.length || pattern.charAt(pos + 1) != "}") {
352 var msg = "unescaped } char, should be escaped as }}";
353 throw new self.FormatPatternError(pattern, pos, msg);
354 }
355 parts.push(pattern.substring(start, pos + 1));
356 start = pos + 2;
357 pos++;
358 } 376 }
359 } 377 }
360 if (start < pos) { 378 if (lastPos < pattern.length) {
361 parts.push(pattern.substring(start, pos)); 379 parts.push(pattern.substring(lastPos));
362 } 380 }
363 return parts; 381 return parts;
364} 382};
365 383
366/** 384/**
367 * Parses a format instruction and returns a format info object. 385 * Parses a format instruction and returns a format info object.
368 * 386 *
369 * @param {String} pattern the format pattern string 387 * @param {String} pattern the format pattern string
370 * @param {Number} startPos the first index of the format instruction 388 * @param {Number} startPos the first index of the format instruction
371 * @param {Number} endPos the last index of the format instruction 389 * @param {Number} endPos the last index of the format instruction
372 * 390 *
373 * @return {Object} the format info object 391 * @return {Object} the format info object
374 * 392 *
375 * @throws FormatPatternError if the format pattern was invalid 393 * @throws FormatPatternError if the format pattern was invalid
376 */ 394 */
377MochiKit.Text._parseFormat = function (pattern, startPos, endPos) { 395MochiKit.Text._parseFormat = function (pattern, startPos, endPos) {
378 var self = MochiKit.Text; 396 var self = MochiKit.Text;
379 var text = pattern.substring(startPos, endPos); 397 var text = pattern.substring(startPos, endPos);
380 var info; 398 var parts = self.split(text, ":", 1);
381 var pos = text.indexOf(":"); 399 var path = parts[0];
382 if (pos == 0) { 400 var flagsPos = startPos + path.length + ((parts.length == 1) ? 0 : 1);
383 info = self._parseFormatFlags(pattern, startPos + 1, endPos); 401 var info = self._parseFormatFlags(pattern, flagsPos, endPos);
384 info.path = [0]; 402 info.path = (path == "") ? [] : path.split(".");
385 } else if (pos > 0) {
386 info = self._parseFormatFlags(pattern, startPos + pos + 1, endPos);
387 info.path = text.substring(0, pos).split(".");
388 } else {
389 info = self._parseFormatFlags(pattern, endPos, endPos);
390 info.path = text.split(".");
391 }
392 var DIGITS = /^\d+$/;
393 for (var i = 0; i < info.path.length; i++) { 403 for (var i = 0; i < info.path.length; i++) {
394 var e = info.path[i]; 404 var v = info.path[i];
395 if (typeof(e) == "string") { 405 // TODO: replace with MochiKit.Format.strip?
396 // TODO: replace with MochiKit.Format.strip? 406 v = v.replace(/^\s+/, "").replace(/\s+$/, "");
397 e = e.replace(/^\s+/, "").replace(/\s+$/, ""); 407 if (v == "" && info.path.length == 1) {
398 if (e == "" && info.path.length == 1) { 408 v = 0;
399 e = 0; 409 } else if (v == "") {
400 } else if (e == "") { 410 var msg = "format value path contains blanks";
401 var msg = "format value path contains blanks"; 411 throw new self.FormatPatternError(pattern, startPos, msg);
402 throw new self.FormatPatternError(pattern, startPos, msg); 412 } else if (/^\d+$/.test(v)) {
403 } else if (DIGITS.test(e)) { 413 v = parseInt(v, 10);
404 e = parseInt(e);
405 }
406 } 414 }
407 info.path[i] = e; 415 info.path[i] = v;
408 } 416 }
409 if (info.path.length < 0 || typeof(info.path[0]) != "number") { 417 if (info.path.length <= 0 || typeof(info.path[0]) != "number") {
410 info.path.unshift(0); 418 info.path.unshift(0);
411 } 419 }
412 return info; 420 return info;
413} 421};
414 422
415/** 423/**
416 * Parses a string with format flags and returns a format info object. 424 * Parses a string with format flags and returns a format info object.
417 * 425 *
418 * @param {String} pattern the format pattern string 426 * @param {String} pattern the format pattern string
419 * @param {Number} startPos the first index of the format instruction 427 * @param {Number} startPos the first index of the format instruction
420 * @param {Number} endPos the last index of the format instruction 428 * @param {Number} endPos the last index of the format instruction
421 * 429 *
422 * @return {Object} the format info object 430 * @return {Object} the format info object
423 * 431 *
424 * @throws FormatPatternError if the format pattern was invalid 432 * @throws FormatPatternError if the format pattern was invalid
425 */ 433 */
426MochiKit.Text._parseFormatFlags = function (pattern, startPos, endPos) { 434MochiKit.Text._parseFormatFlags = function (pattern, startPos, endPos) {
427 var self = MochiKit.Text; 435 var update = MochiKit.Base.update;
428 var info = { numeric: false, format: "s", width: 0, precision: -1, 436 var info = { type: "string", format: "s", width: 0, precision: -1,
429 align: ">", sign: "-", padding: " ", grouping: false }; 437 align: ">", sign: "", padding: " ", group: false };
430 // TODO: replace with MochiKit.Format.rstrip? 438 // TODO: replace with MochiKit.Format.rstrip?
431 var flags = pattern.substring(startPos, endPos).replace(/\s+$/, ""); 439 var text = pattern.substring(startPos, endPos).replace(/\s+$/, "");
432 while (flags.length > 0) { 440 var m = /^([<>+ 0,-]+)?(\d+)?(\.\d*)?([srbdoxXf%])?(.*)$/.exec(text);
433 switch (flags.charAt(0)) { 441 var flags = m[1];
434 case ">": 442 var width = m[2];
435 case "<": 443 var precision = m[3];
436 info.align = flags.charAt(0); 444 var type = m[4];
437 flags = flags.substring(1); 445 var unmatched = m[5];
438 break; 446 for (var i = 0; flags && i < flags.length; i++) {
439 case "+": 447 var chr = flags.charAt(i);
440 case "-": 448 if (chr == "<" || chr == ">") {
441 case " ": 449 info.align = chr;
442 info.sign = flags.charAt(0); 450 } else if (chr == "+" || chr == "-" || chr == " ") {
443 flags = flags.substring(1); 451 info.sign = (chr == "-") ? "" : chr;
444 break; 452 } else if (chr == "0") {
445 case ",": 453 info.padding = chr;
446 info.grouping = true; 454 } else if (chr == ",") {
447 flags = flags.substring(1); 455 info.group = true;
448 break;
449 case ".":
450 var chars = /^\d*/.exec(flags.substring(1))[0];
451 info.precision = parseInt(chars);
452 flags = flags.substring(1 + chars.length);
453 break;
454 case "0":
455 info.padding = flags.charAt(0);
456 flags = flags.substring(1);
457 break;
458 case "1":
459 case "2":
460 case "3":
461 case "4":
462 case "5":
463 case "6":
464 case "7":
465 case "8":
466 case "9":
467 var chars = /^\d*/.exec(flags)[0];
468 info.width = parseInt(chars);
469 flags = flags.substring(chars.length);
470 break;
471 case "s":
472 case "r":
473 info.format = flags.charAt(0);
474 flags = flags.substring(1);
475 break;
476 case "b":
477 case "d":
478 case "o":
479 case "x":
480 case "X":
481 case "f":
482 case "%":
483 info.numeric = true;
484 info.format = flags.charAt(0);
485 info.radix = 10;
486 if (info.format === "b") {
487 info.radix = 2;
488 } else if (info.format === "o") {
489 info.radix = 8;
490 } else if (info.format === "x" || info.format === "X") {
491 info.radix = 16;
492 }
493 flags = flags.substring(1);
494 break;
495 default:
496 var msg = "unsupported format flag: " + flags.charAt(0);
497 throw new self.FormatPatternError(pattern, startPos, msg);
498 } 456 }
499 } 457 }
458 if (width) {
459 info.width = parseInt(width, 10);
460 }
461 if (precision && precision.length > 1) {
462 info.precision = parseInt(precision.substring(1), 10);
463 }
464 if (type == "s" || type == "r") {
465 info.format = type;
466 } else if (type == "b") {
467 update(info, { type: "number", format: type, radix: 2 });
468 } else if (type == "o") {
469 update(info, { type: "number", format: type, radix: 8 });
470 } else if (type == "x" || type == "X") {
471 update(info, { type: "number", format: type, radix: 16 });
472 } else if (type == "d" || type == "f" || type == "%") {
473 update(info, { type: "number", format: type, radix: 10 });
474 }
475 if (unmatched) {
476 var msg = "unsupported format flag: " + unmatched.charAt(0);
477 throw new MochiKit.Text.FormatPatternError(pattern, startPos, msg);
478 }
500 return info; 479 return info;
501} 480};
502 481
503/** 482/**
504 * Formats a value as a percentage. This method avoids multiplication 483 * Formats a value as a percentage. This method avoids multiplication
505 * by 100 since it leads to weird numeric rounding errors. Instead it 484 * by 100 since it leads to weird numeric rounding errors. Instead it
506 * just move the decimal separator in the text string. It is ugly, 485 * just move the decimal separator in the text string. It is ugly,
507 * but works... 486 * but works...
508 * 487 *
509 * @param {Number} value the value to format 488 * @param {Number} value the value to format
510 * @param {Number} precision the number of precision digits 489 * @param {Number} precision the number of precision digits
511 */ 490 */
512MochiKit.Text._truncToPercent = function (value, precision) { 491MochiKit.Text._truncToPercent = function (value, precision) {
513 // TODO: This can be simplified by using the same helper function 492 // TODO: This can be simplified by using MochiKit.Format._shiftNumber
514 // as roundToFixed now does. 493 // as roundToFixed does.
515 var str; 494 var str;
516 if (precision >= 0) { 495 if (precision >= 0) {
517 str = MochiKit.Format.roundToFixed(value, precision + 2); 496 str = MochiKit.Format.roundToFixed(value, precision + 2);
518 } else { 497 } else {
519 str = (value == null) ? "0" : value.toString(); 498 str = (value == null) ? "0" : value.toString();
520 } 499 }
521 var fracPos = str.indexOf("."); 500 var arr = MochiKit.Text.split(str, ".", 2);
522 if (fracPos < 0) { 501 var frac = MochiKit.Text.padRight(arr[1], 2, "0");
523 str = str + "00"; 502 var whole = arr[0] + frac.substring(0, 2);
524 } else if (fracPos + 3 >= str.length) { 503 frac = frac.substring(2);
525 var fraction = str.substring(fracPos + 1); 504 while (/^0[0-9]/.test(whole)) {
526 while (fraction.length < 2) { 505 whole = whole.substring(1);
527 fraction = fraction + "0";
528 }
529 str = str.substring(0, fracPos) + fraction;
530 } else {
531 var fraction = str.substring(fracPos + 1);
532 str = str.substring(0, fracPos) + fraction.substring(0, 2) +
533 "." + fraction.substring(2);
534 }
535 while (str.length > 1 && str.charAt(0) == "0" && str.charAt(1) != ".") {
536 str = str.substring(1);
537 } 506 }
538 return str; 507 return (frac.length <= 0) ? whole : whole + "." + frac;
539} 508};
540 509
541/** 510/**
542 * Creates a new format pattern error. 511 * Creates a new format pattern error.
543 * 512 *
544 * @param {String} pattern the format pattern string 513 * @param {String} pattern the format pattern string
545 * @param {Number} pos the position of the error 514 * @param {Number} pos the position of the error
546 * @param {String} message the error message text 515 * @param {String} message the error message text
547 * 516 *
548 * @return {Error} the format pattern error 517 * @return {Error} the format pattern error
549 * 518 *
550 * @class The format pattern error class. This error is thrown when 519 * @class The format pattern error class. This error is thrown when
551 * a syntax error is encountered inside a format string. 520 * a syntax error is encountered inside a format string.
552 * @property {String} pattern The format pattern string. 521 * @property {String} pattern The format pattern string.
553 * @property {Number} pos The position of the error. 522 * @property {Number} pos The position of the error.
554 * @property {String} message The error message text. 523 * @property {String} message The error message text.
555 * @extends MochiKit.Base.NamedError 524 * @extends MochiKit.Base.NamedError
556 */ 525 */
557MochiKit.Text.FormatPatternError = function (pattern, pos, message) { 526MochiKit.Text.FormatPatternError = function (pattern, pos, message) {
558 this.pattern = pattern; 527 this.pattern = pattern;
559 this.pos = pos; 528 this.pos = pos;
560 this.message = message; 529 this.message = message;
561} 530};
562MochiKit.Text.FormatPatternError.prototype =
563 new MochiKit.Base.NamedError("MochiKit.Text.FormatPatternError");
564 531
532MochiKit.Text.FormatPatternError.prototype = new MochiKit.Base.NamedError("MochiKit.Text.FormatPatternError");
533MochiKit.Text.FormatPatternError.constructor = MochiKit.Text.FormatPatternError;
565 534
566// 535//
567//XXX: Internet Explorer exception handling blows 536//XXX: Internet Explorer export fix
568// 537//
569if (MochiKit.__export__) { 538if (MochiKit.__export__) {
570 formatter = MochiKit.Text.formatter; 539 formatter = MochiKit.Text.formatter;
571 format = MochiKit.Text.format; 540 format = MochiKit.Text.format;
572 formatValue = MochiKit.Text.formatValue; 541 formatValue = MochiKit.Text.formatValue;
573} 542}
574 543
575 544
576MochiKit.Base.nameFunctions(MochiKit.Text); 545MochiKit.Base.nameFunctions(MochiKit.Text);
577MochiKit.Base._exportSymbols(this, MochiKit.Text); 546MochiKit.Base._exportSymbols(this, MochiKit.Text);
diff --git a/frontend/gamma/js/MochiKit/Visual.js b/frontend/gamma/js/MochiKit/Visual.js
index 648d82a..372d99a 100644
--- a/frontend/gamma/js/MochiKit/Visual.js
+++ b/frontend/gamma/js/MochiKit/Visual.js
@@ -1,75 +1,75 @@
1/*** 1/***
2 2
3MochiKit.Visual 1.5 3MochiKit.Visual 1.5
4 4
5See <http://mochikit.com/> for documentation, downloads, license, etc. 5See <http://mochikit.com/> for documentation, downloads, license, etc.
6 6
7(c) 2005 Bob Ippolito and others. All rights Reserved. 7(c) 2005 Bob Ippolito and others. All rights Reserved.
8 8
9***/ 9***/
10 10
11MochiKit.Base._module('Visual', '1.5', ['Base', 'DOM', 'Style', 'Color', 'Position']); 11MochiKit.Base.module(MochiKit, 'Visual', '1.5', ['Base', 'DOM', 'Style', 'Color', 'Position']);
12 12
13MochiKit.Visual._RoundCorners = function (e, options) { 13MochiKit.Visual._RoundCorners = function (e, options) {
14 e = MochiKit.DOM.getElement(e); 14 e = MochiKit.DOM.getElement(e);
15 this._setOptions(options); 15 this._setOptions(options);
16 if (this.options.__unstable__wrapElement) { 16 if (this.options.__unstable__wrapElement) {
17 e = this._doWrap(e); 17 e = this._doWrap(e);
18 } 18 }
19 19
20 var color = this.options.color; 20 var color = this.options.color;
21 var C = MochiKit.Color.Color; 21 var C = MochiKit.Color.Color;
22 if (this.options.color === "fromElement") { 22 if (this.options.color === "fromElement") {
23 color = C.fromBackground(e); 23 color = C.fromBackground(e);
24 } else if (!(color instanceof C)) { 24 } else if (!(color instanceof C)) {
25 color = C.fromString(color); 25 color = C.fromString(color);
26 } 26 }
27 this.isTransparent = (color.asRGB().a <= 0); 27 this.isTransparent = (color.asRGB().a <= 0);
28 28
29 var bgColor = this.options.bgColor; 29 var bgColor = this.options.bgColor;
30 if (this.options.bgColor === "fromParent") { 30 if (this.options.bgColor === "fromParent") {
31 bgColor = C.fromBackground(e.offsetParent); 31 bgColor = C.fromBackground(e.offsetParent);
32 } else if (!(bgColor instanceof C)) { 32 } else if (!(bgColor instanceof C)) {
33 bgColor = C.fromString(bgColor); 33 bgColor = C.fromString(bgColor);
34 } 34 }
35 35
36 this._roundCornersImpl(e, color, bgColor); 36 this._roundCornersImpl(e, color, bgColor);
37}; 37};
38 38
39MochiKit.Visual._RoundCorners.prototype = { 39MochiKit.Visual._RoundCorners.prototype = {
40 _doWrap: function (e) { 40 _doWrap: function (e) {
41 var parent = e.parentNode; 41 var parent = e.parentNode;
42 var doc = MochiKit.DOM.currentDocument(); 42 var doc = MochiKit.DOM.currentDocument();
43 if (typeof(doc.defaultView) === "undefined" 43 if (typeof(doc.defaultView) === "undefined"
44 || doc.defaultView === null) { 44 || doc.defaultView === null) {
45 return e; 45 return e;
46 } 46 }
47 var style = doc.defaultView.getComputedStyle(e, null); 47 var style = doc.defaultView.getComputedStyle(e, null);
48 if (typeof(style) === "undefined" || style === null) { 48 if (typeof(style) === "undefined" || style === null) {
49 return e; 49 return e;
50 } 50 }
51 var wrapper = MochiKit.DOM.DIV({"style": { 51 var wrapper = MochiKit.DOM.DIV({"style": {
52 display: "block", 52 display: "block",
53 // convert padding to margin 53 // convert padding to margin
54 marginTop: style.getPropertyValue("padding-top"), 54 marginTop: style.getPropertyValue("padding-top"),
55 marginRight: style.getPropertyValue("padding-right"), 55 marginRight: style.getPropertyValue("padding-right"),
56 marginBottom: style.getPropertyValue("padding-bottom"), 56 marginBottom: style.getPropertyValue("padding-bottom"),
57 marginLeft: style.getPropertyValue("padding-left"), 57 marginLeft: style.getPropertyValue("padding-left"),
58 // remove padding so the rounding looks right 58 // remove padding so the rounding looks right
59 padding: "0px" 59 padding: "0px"
60 /* 60 /*
61 paddingRight: "0px", 61 paddingRight: "0px",
62 paddingLeft: "0px" 62 paddingLeft: "0px"
63 */ 63 */
64 }}); 64 }});
65 wrapper.innerHTML = e.innerHTML; 65 wrapper.innerHTML = e.innerHTML;
66 e.innerHTML = ""; 66 e.innerHTML = "";
67 e.appendChild(wrapper); 67 e.appendChild(wrapper);
68 return e; 68 return e;
69 }, 69 },
70 70
71 _roundCornersImpl: function (e, color, bgColor) { 71 _roundCornersImpl: function (e, color, bgColor) {
72 if (this.options.border) { 72 if (this.options.border) {
73 this._renderBorder(e, bgColor); 73 this._renderBorder(e, bgColor);
74 } 74 }
75 if (this._isTopRounded()) { 75 if (this._isTopRounded()) {
@@ -408,323 +408,337 @@ MochiKit.Visual.toggle = function (element, /* optional */effect, /* optional */
408 Toggle an item between two state depending of its visibility, making 408 Toggle an item between two state depending of its visibility, making
409 a effect between these states. Default effect is 'appear', can be 409 a effect between these states. Default effect is 'appear', can be
410 'slide' or 'blind'. 410 'slide' or 'blind'.
411 411
412 ***/ 412 ***/
413 element = MochiKit.DOM.getElement(element); 413 element = MochiKit.DOM.getElement(element);
414 effect = (effect || 'appear').toLowerCase(); 414 effect = (effect || 'appear').toLowerCase();
415 options = MochiKit.Base.update({ 415 options = MochiKit.Base.update({
416 queue: {position: 'end', scope: (element.id || 'global'), limit: 1} 416 queue: {position: 'end', scope: (element.id || 'global'), limit: 1}
417 }, options); 417 }, options);
418 var v = MochiKit.Visual; 418 var v = MochiKit.Visual;
419 v[MochiKit.Style.getStyle(element, 'display') != 'none' ? 419 v[MochiKit.Style.getStyle(element, 'display') != 'none' ?
420 v.PAIRS[effect][1] : v.PAIRS[effect][0]](element, options); 420 v.PAIRS[effect][1] : v.PAIRS[effect][0]](element, options);
421}; 421};
422 422
423/*** 423/***
424 424
425Transitions: define functions calculating variations depending of a position. 425Transitions: define functions calculating variations depending of a position.
426 426
427***/ 427***/
428 428
429MochiKit.Visual.Transitions = { __export__: false }; 429MochiKit.Visual.Transitions = { __export__: false };
430 430
431/** @id MochiKit.Visual.Transitions.linear */ 431/** @id MochiKit.Visual.Transitions.linear */
432MochiKit.Visual.Transitions.linear = function (pos) { 432MochiKit.Visual.Transitions.linear = function (pos) {
433 return pos; 433 return pos;
434}; 434};
435 435
436/** @id MochiKit.Visual.Transitions.sinoidal */ 436/** @id MochiKit.Visual.Transitions.sinoidal */
437MochiKit.Visual.Transitions.sinoidal = function (pos) { 437MochiKit.Visual.Transitions.sinoidal = function (pos) {
438 return 0.5 - Math.cos(pos*Math.PI)/2; 438 return 0.5 - Math.cos(pos*Math.PI)/2;
439}; 439};
440 440
441/** @id MochiKit.Visual.Transitions.reverse */ 441/** @id MochiKit.Visual.Transitions.reverse */
442MochiKit.Visual.Transitions.reverse = function (pos) { 442MochiKit.Visual.Transitions.reverse = function (pos) {
443 return 1 - pos; 443 return 1 - pos;
444}; 444};
445 445
446/** @id MochiKit.Visual.Transitions.flicker */ 446/** @id MochiKit.Visual.Transitions.flicker */
447MochiKit.Visual.Transitions.flicker = function (pos) { 447MochiKit.Visual.Transitions.flicker = function (pos) {
448 return 0.25 - Math.cos(pos*Math.PI)/4 + Math.random()/2; 448 return 0.25 - Math.cos(pos*Math.PI)/4 + Math.random()/2;
449}; 449};
450 450
451/** @id MochiKit.Visual.Transitions.wobble */ 451/** @id MochiKit.Visual.Transitions.wobble */
452MochiKit.Visual.Transitions.wobble = function (pos) { 452MochiKit.Visual.Transitions.wobble = function (pos) {
453 return 0.5 - Math.cos(9*pos*Math.PI)/2; 453 return 0.5 - Math.cos(9*pos*Math.PI)/2;
454}; 454};
455 455
456/** @id MochiKit.Visual.Transitions.pulse */ 456/** @id MochiKit.Visual.Transitions.pulse */
457MochiKit.Visual.Transitions.pulse = function (pos, pulses) { 457MochiKit.Visual.Transitions.pulse = function (pos, pulses) {
458 if (pulses) { 458 if (pulses) {
459 pos *= 2 * pulses; 459 pos *= 2 * pulses;
460 } else { 460 } else {
461 pos *= 10; 461 pos *= 10;
462 } 462 }
463 var decimals = pos - Math.floor(pos); 463 var decimals = pos - Math.floor(pos);
464 return (Math.floor(pos) % 2 == 0) ? decimals : 1 - decimals; 464 return (Math.floor(pos) % 2 == 0) ? decimals : 1 - decimals;
465}; 465};
466 466
467/** @id MochiKit.Visual.Transitions.parabolic */ 467/** @id MochiKit.Visual.Transitions.parabolic */
468MochiKit.Visual.Transitions.parabolic = function (pos) { 468MochiKit.Visual.Transitions.parabolic = function (pos) {
469 return pos * pos; 469 return pos * pos;
470}; 470};
471 471
472/** @id MochiKit.Visual.Transitions.spring */
473MochiKit.Visual.Transitions.spring = function (pos) {
474 return 1 - (Math.cos(pos * 2.5 * Math.PI) * Math.exp(-pos * 6));
475};
476
472/** @id MochiKit.Visual.Transitions.none */ 477/** @id MochiKit.Visual.Transitions.none */
473MochiKit.Visual.Transitions.none = function (pos) { 478MochiKit.Visual.Transitions.none = function (pos) {
474 return 0; 479 return 0;
475}; 480};
476 481
477/** @id MochiKit.Visual.Transitions.full */ 482/** @id MochiKit.Visual.Transitions.full */
478MochiKit.Visual.Transitions.full = function (pos) { 483MochiKit.Visual.Transitions.full = function (pos) {
479 return 1; 484 return 1;
480}; 485};
481 486
482/*** 487/***
483 488
484Core effects 489Core effects
485 490
486***/ 491***/
487 492
488MochiKit.Visual.ScopedQueue = function () { 493MochiKit.Visual.ScopedQueue = function () {
489 var cls = arguments.callee; 494 var cls = arguments.callee;
490 if (!(this instanceof cls)) { 495 if (!(this instanceof cls)) {
491 return new cls(); 496 return new cls();
492 } 497 }
493 this.__init__(); 498 this.__init__();
494}; 499};
495MochiKit.Visual.ScopedQueue.__export__ = false; 500MochiKit.Visual.ScopedQueue.__export__ = false;
496 501
497MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype, { 502MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype, {
498 __init__: function () { 503 __init__: function () {
499 this.effects = []; 504 this.effects = [];
500 this.interval = null; 505 this.interval = null;
501 }, 506 },
502 507
503 /** @id MochiKit.Visual.ScopedQueue.prototype.add */ 508 /** @id MochiKit.Visual.ScopedQueue.prototype.add */
504 add: function (effect) { 509 add: function (effect) {
505 var timestamp = new Date().getTime(); 510 var timestamp = new Date().getTime();
506 511
507 var position = (typeof(effect.options.queue) == 'string') ? 512 var position = (typeof(effect.options.queue) == 'string') ?
508 effect.options.queue : effect.options.queue.position; 513 effect.options.queue : effect.options.queue.position;
509 514
510 var ma = MochiKit.Base.map; 515 var ma = MochiKit.Base.map;
511 switch (position) { 516 switch (position) {
512 case 'front': 517 case 'front':
513 // move unstarted effects after this effect 518 // move unstarted effects after this effect
514 ma(function (e) { 519 ma(function (e) {
515 if (e.state == 'idle') { 520 if (e.state == 'idle') {
516 e.startOn += effect.finishOn; 521 e.startOn += effect.finishOn;
517 e.finishOn += effect.finishOn; 522 e.finishOn += effect.finishOn;
518 } 523 }
519 }, this.effects); 524 }, this.effects);
520 break; 525 break;
521 case 'end': 526 case 'end':
522 var finish; 527 var finish;
523 // start effect after last queued effect has finished 528 // start effect after last queued effect has finished
524 ma(function (e) { 529 ma(function (e) {
525 var i = e.finishOn; 530 var i = e.finishOn;
526 if (i >= (finish || i)) { 531 if (i >= (finish || i)) {
527 finish = i; 532 finish = i;
528 } 533 }
529 }, this.effects); 534 }, this.effects);
530 timestamp = finish || timestamp; 535 timestamp = finish || timestamp;
531 break; 536 break;
532 case 'break': 537 case 'break':
533 ma(function (e) { 538 ma(function (e) {
534 e.finalize(); 539 e.finalize();
535 }, this.effects); 540 }, this.effects);
536 break; 541 break;
542 case 'replace':
543 ma(function (e) {
544 e.cancel();
545 }, this.effects);
546 break;
537 } 547 }
538 548
539 effect.startOn += timestamp; 549 effect.startOn += timestamp;
540 effect.finishOn += timestamp; 550 effect.finishOn += timestamp;
541 if (!effect.options.queue.limit || 551 if (!effect.options.queue.limit ||
542 this.effects.length < effect.options.queue.limit) { 552 this.effects.length < effect.options.queue.limit) {
543 this.effects.push(effect); 553 this.effects.push(effect);
544 } 554 }
545 555
546 if (!this.interval) { 556 if (!this.interval) {
547 this.interval = this.startLoop(MochiKit.Base.bind(this.loop, this), 557 this.interval = this.startLoop(MochiKit.Base.bind(this.loop, this),
548 40); 558 40);
549 } 559 }
550 }, 560 },
551 561
552 /** @id MochiKit.Visual.ScopedQueue.prototype.startLoop */ 562 /** @id MochiKit.Visual.ScopedQueue.prototype.startLoop */
553 startLoop: function (func, interval) { 563 startLoop: function (func, interval) {
554 return setInterval(func, interval); 564 return setInterval(func, interval);
555 }, 565 },
556 566
557 /** @id MochiKit.Visual.ScopedQueue.prototype.remove */ 567 /** @id MochiKit.Visual.ScopedQueue.prototype.remove */
558 remove: function (effect) { 568 remove: function (effect) {
559 this.effects = MochiKit.Base.filter(function (e) { 569 this.effects = MochiKit.Base.filter(function (e) {
560 return e != effect; 570 return e != effect;
561 }, this.effects); 571 }, this.effects);
562 if (!this.effects.length) { 572 if (!this.effects.length) {
563 this.stopLoop(this.interval); 573 this.stopLoop(this.interval);
564 this.interval = null; 574 this.interval = null;
565 } 575 }
566 }, 576 },
567 577
568 /** @id MochiKit.Visual.ScopedQueue.prototype.stopLoop */ 578 /** @id MochiKit.Visual.ScopedQueue.prototype.stopLoop */
569 stopLoop: function (interval) { 579 stopLoop: function (interval) {
570 clearInterval(interval); 580 clearInterval(interval);
571 }, 581 },
572 582
573 /** @id MochiKit.Visual.ScopedQueue.prototype.loop */ 583 /** @id MochiKit.Visual.ScopedQueue.prototype.loop */
574 loop: function () { 584 loop: function () {
575 var timePos = new Date().getTime(); 585 var timePos = new Date().getTime();
576 MochiKit.Base.map(function (effect) { 586 MochiKit.Base.map(function (effect) {
577 effect.loop(timePos); 587 effect.loop(timePos);
578 }, this.effects); 588 }, this.effects);
579 } 589 }
580}); 590});
581 591
582MochiKit.Visual.Queues = { 592MochiKit.Visual.Queues = {
583 __export__: false, 593 __export__: false,
584 instances: {}, 594 instances: {},
585 get: function (queueName) { 595 get: function (queueName) {
586 if (typeof(queueName) != 'string') { 596 if (typeof(queueName) != 'string') {
587 return queueName; 597 return queueName;
588 } 598 }
589 599
590 if (!this.instances[queueName]) { 600 if (!this.instances[queueName]) {
591 this.instances[queueName] = new MochiKit.Visual.ScopedQueue(); 601 this.instances[queueName] = new MochiKit.Visual.ScopedQueue();
592 } 602 }
593 return this.instances[queueName]; 603 return this.instances[queueName];
594 } 604 }
595}; 605};
596 606
597MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global'); 607MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global');
598MochiKit.Visual.Queue.__export__ = false; 608MochiKit.Visual.Queue.__export__ = false;
599 609
600MochiKit.Visual.DefaultOptions = { 610MochiKit.Visual.DefaultOptions = {
601 __export__: false, 611 __export__: false,
602 transition: MochiKit.Visual.Transitions.sinoidal, 612 transition: MochiKit.Visual.Transitions.sinoidal,
603 duration: 1.0, // seconds 613 duration: 1.0, // seconds
604 fps: 25.0, // max. 25fps due to MochiKit.Visual.Queue implementation 614 fps: 25.0, // max. 25fps due to MochiKit.Visual.Queue implementation
605 sync: false, // true for combining 615 sync: false, // true for combining
606 from: 0.0, 616 from: 0.0,
607 to: 1.0, 617 to: 1.0,
608 delay: 0.0, 618 delay: 0.0,
609 queue: 'parallel' 619 queue: 'parallel'
610}; 620};
611 621
612MochiKit.Visual.Base = function () {}; 622MochiKit.Visual.Base = function () {};
613 623
614MochiKit.Visual.Base.prototype = { 624MochiKit.Visual.Base.prototype = {
615 /*** 625 /***
616 626
617 Basic class for all Effects. Define a looping mechanism called for each step 627 Basic class for all Effects. Define a looping mechanism called for each step
618 of an effect. Don't instantiate it, only subclass it. 628 of an effect. Don't instantiate it, only subclass it.
619 629
620 ***/ 630 ***/
621 631
622 __class__ : MochiKit.Visual.Base, 632 __class__ : MochiKit.Visual.Base,
623 633
624 /** @id MochiKit.Visual.Base.prototype.start */ 634 /** @id MochiKit.Visual.Base.prototype.start */
625 start: function (options) { 635 start: function (options) {
626 var v = MochiKit.Visual; 636 var v = MochiKit.Visual;
627 this.options = MochiKit.Base.setdefault(options, 637 this.options = MochiKit.Base.setdefault(options,
628 v.DefaultOptions); 638 v.DefaultOptions);
629 this.currentFrame = 0; 639 this.currentFrame = 0;
630 this.state = 'idle'; 640 this.state = 'idle';
631 this.startOn = this.options.delay*1000; 641 this.startOn = this.options.delay*1000;
632 this.finishOn = this.startOn + (this.options.duration*1000); 642 this.finishOn = this.startOn + (this.options.duration*1000);
633 this.event('beforeStart'); 643 this.event('beforeStart');
634 if (!this.options.sync) { 644 if (!this.options.sync) {
635 v.Queues.get(typeof(this.options.queue) == 'string' ? 645 v.Queues.get(typeof(this.options.queue) == 'string' ?
636 'global' : this.options.queue.scope).add(this); 646 'global' : this.options.queue.scope).add(this);
637 } 647 }
638 }, 648 },
639 649
640 /** @id MochiKit.Visual.Base.prototype.loop */ 650 /** @id MochiKit.Visual.Base.prototype.loop */
641 loop: function (timePos) { 651 loop: function (timePos) {
642 if (timePos >= this.startOn) { 652 if (timePos >= this.startOn) {
643 if (timePos >= this.finishOn) { 653 if (timePos >= this.finishOn) {
644 return this.finalize(); 654 return this.finalize();
645 } 655 }
646 var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); 656 var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
647 var frame = 657 var frame =
648 Math.round(pos * this.options.fps * this.options.duration); 658 Math.round(pos * this.options.fps * this.options.duration);
649 if (frame > this.currentFrame) { 659 if (frame > this.currentFrame) {
650 this.render(pos); 660 this.render(pos);
651 this.currentFrame = frame; 661 this.currentFrame = frame;
652 } 662 }
653 } 663 }
654 }, 664 },
655 665
656 /** @id MochiKit.Visual.Base.prototype.render */ 666 /** @id MochiKit.Visual.Base.prototype.render */
657 render: function (pos) { 667 render: function (pos) {
658 if (this.state == 'idle') { 668 if (this.state == 'idle') {
659 this.state = 'running'; 669 this.state = 'running';
660 this.event('beforeSetup'); 670 this.event('beforeSetup');
661 this.setup(); 671 this.setup();
662 this.event('afterSetup'); 672 this.event('afterSetup');
663 } 673 }
664 if (this.state == 'running') { 674 if (this.state == 'running') {
665 if (this.options.transition) { 675 var trans = this.options.transition;
666 pos = this.options.transition(pos); 676 if (typeof(trans) == "string") {
677 trans = MochiKit.Visual.Transitions[trans];
678 }
679 if (typeof(trans) == "function") {
680 pos = trans(pos);
667 } 681 }
668 pos *= (this.options.to - this.options.from); 682 pos *= (this.options.to - this.options.from);
669 pos += this.options.from; 683 pos += this.options.from;
670 this.event('beforeUpdate'); 684 this.event('beforeUpdate');
671 this.update(pos); 685 this.update(pos);
672 this.event('afterUpdate'); 686 this.event('afterUpdate');
673 } 687 }
674 }, 688 },
675 689
676 /** @id MochiKit.Visual.Base.prototype.cancel */ 690 /** @id MochiKit.Visual.Base.prototype.cancel */
677 cancel: function () { 691 cancel: function () {
678 if (!this.options.sync) { 692 if (!this.options.sync) {
679 MochiKit.Visual.Queues.get(typeof(this.options.queue) == 'string' ? 693 MochiKit.Visual.Queues.get(typeof(this.options.queue) == 'string' ?
680 'global' : this.options.queue.scope).remove(this); 694 'global' : this.options.queue.scope).remove(this);
681 } 695 }
682 this.state = 'finished'; 696 this.state = 'finished';
683 }, 697 },
684 698
685 /** @id MochiKit.Visual.Base.prototype.finalize */ 699 /** @id MochiKit.Visual.Base.prototype.finalize */
686 finalize: function () { 700 finalize: function () {
687 this.render(1.0); 701 this.render(1.0);
688 this.cancel(); 702 this.cancel();
689 this.event('beforeFinish'); 703 this.event('beforeFinish');
690 this.finish(); 704 this.finish();
691 this.event('afterFinish'); 705 this.event('afterFinish');
692 }, 706 },
693 707
694 setup: function () { 708 setup: function () {
695 }, 709 },
696 710
697 finish: function () { 711 finish: function () {
698 }, 712 },
699 713
700 update: function (position) { 714 update: function (position) {
701 }, 715 },
702 716
703 /** @id MochiKit.Visual.Base.prototype.event */ 717 /** @id MochiKit.Visual.Base.prototype.event */
704 event: function (eventName) { 718 event: function (eventName) {
705 if (this.options[eventName + 'Internal']) { 719 if (this.options[eventName + 'Internal']) {
706 this.options[eventName + 'Internal'](this); 720 this.options[eventName + 'Internal'](this);
707 } 721 }
708 if (this.options[eventName]) { 722 if (this.options[eventName]) {
709 this.options[eventName](this); 723 this.options[eventName](this);
710 } 724 }
711 }, 725 },
712 726
713 /** @id MochiKit.Visual.Base.prototype.repr */ 727 /** @id MochiKit.Visual.Base.prototype.repr */
714 repr: function () { 728 repr: function () {
715 return '[' + this.__class__.NAME + ', options:' + 729 return '[' + this.__class__.NAME + ', options:' +
716 MochiKit.Base.repr(this.options) + ']'; 730 MochiKit.Base.repr(this.options) + ']';
717 } 731 }
718}; 732};
719 733
720/** @id MochiKit.Visual.Parallel */ 734/** @id MochiKit.Visual.Parallel */
721MochiKit.Visual.Parallel = function (effects, options) { 735MochiKit.Visual.Parallel = function (effects, options) {
722 var cls = arguments.callee; 736 var cls = arguments.callee;
723 if (!(this instanceof cls)) { 737 if (!(this instanceof cls)) {
724 return new cls(effects, options); 738 return new cls(effects, options);
725 } 739 }
726 740
727 this.__init__(effects, options); 741 this.__init__(effects, options);
728}; 742};
729 743
730MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base(); 744MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base();
@@ -1625,130 +1639,130 @@ MochiKit.Visual.slideUp = function (element, /* optional */ options) {
1625 Slide an element up. 1639 Slide an element up.
1626 It needs to have the content of the element wrapped in a container 1640 It needs to have the content of the element wrapped in a container
1627 element with fixed height. 1641 element with fixed height.
1628 1642
1629 ***/ 1643 ***/
1630 var d = MochiKit.DOM; 1644 var d = MochiKit.DOM;
1631 var b = MochiKit.Base; 1645 var b = MochiKit.Base;
1632 var s = MochiKit.Style; 1646 var s = MochiKit.Style;
1633 element = d.getElement(element); 1647 element = d.getElement(element);
1634 if (!element.firstChild) { 1648 if (!element.firstChild) {
1635 throw new Error("MochiKit.Visual.slideUp must be used on a element with a child"); 1649 throw new Error("MochiKit.Visual.slideUp must be used on a element with a child");
1636 } 1650 }
1637 d.removeEmptyTextNodes(element); 1651 d.removeEmptyTextNodes(element);
1638 var oldInnerBottom = s.getStyle(element.firstChild, 'bottom'); 1652 var oldInnerBottom = s.getStyle(element.firstChild, 'bottom');
1639 var elementDimensions = s.getElementDimensions(element, true); 1653 var elementDimensions = s.getElementDimensions(element, true);
1640 var elemClip; 1654 var elemClip;
1641 options = b.update({ 1655 options = b.update({
1642 scaleContent: false, 1656 scaleContent: false,
1643 scaleX: false, 1657 scaleX: false,
1644 scaleMode: {originalHeight: elementDimensions.h, 1658 scaleMode: {originalHeight: elementDimensions.h,
1645 originalWidth: elementDimensions.w}, 1659 originalWidth: elementDimensions.w},
1646 scaleFrom: 100, 1660 scaleFrom: 100,
1647 restoreAfterFinish: true, 1661 restoreAfterFinish: true,
1648 beforeStartInternal: function (effect) { 1662 beforeStartInternal: function (effect) {
1649 s.makePositioned(effect.element); 1663 s.makePositioned(effect.element);
1650 s.makePositioned(effect.element.firstChild); 1664 s.makePositioned(effect.element.firstChild);
1651 if (/Opera/.test(navigator.userAgent)) { 1665 if (/Opera/.test(navigator.userAgent)) {
1652 s.setStyle(effect.element, {top: ''}); 1666 s.setStyle(effect.element, {top: ''});
1653 } 1667 }
1654 elemClip = s.makeClipping(effect.element); 1668 elemClip = s.makeClipping(effect.element);
1655 s.showElement(effect.element); 1669 s.showElement(effect.element);
1656 }, 1670 },
1657 afterUpdateInternal: function (effect) { 1671 afterUpdateInternal: function (effect) {
1658 var elementDimensions = s.getElementDimensions(effect.element, true); 1672 var elementDimensions = s.getElementDimensions(effect.element, true);
1659 s.setStyle(effect.element.firstChild, 1673 s.setStyle(effect.element.firstChild,
1660 {bottom: (effect.dims[0] - elementDimensions.h) + 'px'}); 1674 {bottom: (effect.dims[0] - elementDimensions.h) + 'px'});
1661 }, 1675 },
1662 afterFinishInternal: function (effect) { 1676 afterFinishInternal: function (effect) {
1663 s.hideElement(effect.element); 1677 s.hideElement(effect.element);
1664 s.undoClipping(effect.element, elemClip); 1678 s.undoClipping(effect.element, elemClip);
1665 s.undoPositioned(effect.element.firstChild); 1679 s.undoPositioned(effect.element.firstChild);
1666 s.undoPositioned(effect.element); 1680 s.undoPositioned(effect.element);
1667 s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); 1681 s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom});
1668 } 1682 }
1669 }, options); 1683 }, options);
1670 return new MochiKit.Visual.Scale(element, 0, options); 1684 return new MochiKit.Visual.Scale(element, 0, options);
1671}; 1685};
1672 1686
1673// Bug in opera makes the TD containing this element expand for a instance 1687// Bug in opera makes the TD containing this element expand for a instance
1674// after finish 1688// after finish
1675/** @id MochiKit.Visual.squish */ 1689/** @id MochiKit.Visual.squish */
1676MochiKit.Visual.squish = function (element, /* optional */ options) { 1690MochiKit.Visual.squish = function (element, /* optional */ options) {
1677 /*** 1691 /***
1678 1692
1679 Reduce an element and make it disappear. 1693 Reduce an element and make it disappear.
1680 1694
1681 ***/ 1695 ***/
1682 var d = MochiKit.DOM; 1696 var d = MochiKit.DOM;
1683 var b = MochiKit.Base; 1697 var b = MochiKit.Base;
1684 var s = MochiKit.Style; 1698 var s = MochiKit.Style;
1685 var elementDimensions = s.getElementDimensions(element, true); 1699 var elementDimensions = s.getElementDimensions(element, true);
1686 var elemClip; 1700 var elemClip;
1687 options = b.update({ 1701 options = b.update({
1688 restoreAfterFinish: true, 1702 restoreAfterFinish: true,
1689 scaleMode: {originalHeight: elementDimensions.w, 1703 scaleMode: {originalHeight: elementDimensions.h,
1690 originalWidth: elementDimensions.h}, 1704 originalWidth: elementDimensions.w},
1691 beforeSetupInternal: function (effect) { 1705 beforeSetupInternal: function (effect) {
1692 elemClip = s.makeClipping(effect.element); 1706 elemClip = s.makeClipping(effect.element);
1693 }, 1707 },
1694 afterFinishInternal: function (effect) { 1708 afterFinishInternal: function (effect) {
1695 s.hideElement(effect.element); 1709 s.hideElement(effect.element);
1696 s.undoClipping(effect.element, elemClip); 1710 s.undoClipping(effect.element, elemClip);
1697 } 1711 }
1698 }, options); 1712 }, options);
1699 1713
1700 return new MochiKit.Visual.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, options); 1714 return new MochiKit.Visual.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, options);
1701}; 1715};
1702 1716
1703/** @id MochiKit.Visual.grow */ 1717/** @id MochiKit.Visual.grow */
1704MochiKit.Visual.grow = function (element, /* optional */ options) { 1718MochiKit.Visual.grow = function (element, /* optional */ options) {
1705 /*** 1719 /***
1706 1720
1707 Grow an element to its original size. Make it zero-sized before 1721 Grow an element to its original size. Make it zero-sized before
1708 if necessary. 1722 if necessary.
1709 1723
1710 ***/ 1724 ***/
1711 var d = MochiKit.DOM; 1725 var d = MochiKit.DOM;
1712 var v = MochiKit.Visual; 1726 var v = MochiKit.Visual;
1713 var s = MochiKit.Style; 1727 var s = MochiKit.Style;
1714 element = d.getElement(element); 1728 element = d.getElement(element);
1715 options = MochiKit.Base.update({ 1729 options = MochiKit.Base.update({
1716 direction: 'center', 1730 direction: 'center',
1717 moveTransition: v.Transitions.sinoidal, 1731 moveTransition: v.Transitions.sinoidal,
1718 scaleTransition: v.Transitions.sinoidal, 1732 scaleTransition: v.Transitions.sinoidal,
1719 opacityTransition: v.Transitions.full, 1733 opacityTransition: v.Transitions.full,
1720 scaleContent: true, 1734 scaleContent: true,
1721 scaleFromCenter: false 1735 scaleFromCenter: false
1722 }, options); 1736 }, options);
1723 var oldStyle = { 1737 var oldStyle = {
1724 top: element.style.top, 1738 top: element.style.top,
1725 left: element.style.left, 1739 left: element.style.left,
1726 height: element.style.height, 1740 height: element.style.height,
1727 width: element.style.width, 1741 width: element.style.width,
1728 opacity: s.getStyle(element, 'opacity') 1742 opacity: s.getStyle(element, 'opacity')
1729 }; 1743 };
1730 var dims = s.getElementDimensions(element, true); 1744 var dims = s.getElementDimensions(element, true);
1731 var initialMoveX, initialMoveY; 1745 var initialMoveX, initialMoveY;
1732 var moveX, moveY; 1746 var moveX, moveY;
1733 1747
1734 switch (options.direction) { 1748 switch (options.direction) {
1735 case 'top-left': 1749 case 'top-left':
1736 initialMoveX = initialMoveY = moveX = moveY = 0; 1750 initialMoveX = initialMoveY = moveX = moveY = 0;
1737 break; 1751 break;
1738 case 'top-right': 1752 case 'top-right':
1739 initialMoveX = dims.w; 1753 initialMoveX = dims.w;
1740 initialMoveY = moveY = 0; 1754 initialMoveY = moveY = 0;
1741 moveX = -dims.w; 1755 moveX = -dims.w;
1742 break; 1756 break;
1743 case 'bottom-left': 1757 case 'bottom-left':
1744 initialMoveX = moveX = 0; 1758 initialMoveX = moveX = 0;
1745 initialMoveY = dims.h; 1759 initialMoveY = dims.h;
1746 moveY = -dims.h; 1760 moveY = -dims.h;
1747 break; 1761 break;
1748 case 'bottom-right': 1762 case 'bottom-right':
1749 initialMoveX = dims.w; 1763 initialMoveX = dims.w;
1750 initialMoveY = dims.h; 1764 initialMoveY = dims.h;
1751 moveX = -dims.w; 1765 moveX = -dims.w;
1752 moveY = -dims.h; 1766 moveY = -dims.h;
1753 break; 1767 break;
1754 case 'center': 1768 case 'center':
@@ -1897,79 +1911,66 @@ MochiKit.Visual.pulsate = function (element, /* optional */ options) {
1897 1911
1898 Pulse an element between appear/fade. 1912 Pulse an element between appear/fade.
1899 1913
1900 ***/ 1914 ***/
1901 var d = MochiKit.DOM; 1915 var d = MochiKit.DOM;
1902 var v = MochiKit.Visual; 1916 var v = MochiKit.Visual;
1903 var b = MochiKit.Base; 1917 var b = MochiKit.Base;
1904 var oldOpacity = MochiKit.Style.getStyle(element, 'opacity'); 1918 var oldOpacity = MochiKit.Style.getStyle(element, 'opacity');
1905 options = b.update({ 1919 options = b.update({
1906 duration: 3.0, 1920 duration: 3.0,
1907 from: 0, 1921 from: 0,
1908 afterFinishInternal: function (effect) { 1922 afterFinishInternal: function (effect) {
1909 MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity}); 1923 MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity});
1910 } 1924 }
1911 }, options); 1925 }, options);
1912 var transition = options.transition || v.Transitions.sinoidal; 1926 var transition = options.transition || v.Transitions.sinoidal;
1913 options.transition = function (pos) { 1927 options.transition = function (pos) {
1914 return transition(1 - v.Transitions.pulse(pos, options.pulses)); 1928 return transition(1 - v.Transitions.pulse(pos, options.pulses));
1915 }; 1929 };
1916 return new v.Opacity(element, options); 1930 return new v.Opacity(element, options);
1917}; 1931};
1918 1932
1919/** @id MochiKit.Visual.fold */ 1933/** @id MochiKit.Visual.fold */
1920MochiKit.Visual.fold = function (element, /* optional */ options) { 1934MochiKit.Visual.fold = function (element, /* optional */ options) {
1921 /*** 1935 /***
1922 1936
1923 Fold an element, first vertically, then horizontally. 1937 Fold an element, first vertically, then horizontally.
1924 1938
1925 ***/ 1939 ***/
1926 var d = MochiKit.DOM; 1940 var d = MochiKit.DOM;
1927 var v = MochiKit.Visual; 1941 var v = MochiKit.Visual;
1928 var s = MochiKit.Style; 1942 var s = MochiKit.Style;
1929 element = d.getElement(element); 1943 element = d.getElement(element);
1930 var elementDimensions = s.getElementDimensions(element, true); 1944 var elementDimensions = s.getElementDimensions(element, true);
1931 var oldStyle = { 1945 var oldStyle = {
1932 top: element.style.top, 1946 top: element.style.top,
1933 left: element.style.left, 1947 left: element.style.left,
1934 width: element.style.width, 1948 width: element.style.width,
1935 height: element.style.height 1949 height: element.style.height
1936 }; 1950 };
1937 var elemClip = s.makeClipping(element); 1951 var elemClip = s.makeClipping(element);
1938 options = MochiKit.Base.update({ 1952 options = MochiKit.Base.update({
1939 scaleContent: false, 1953 scaleContent: false,
1940 scaleX: false, 1954 scaleX: false,
1941 scaleMode: {originalHeight: elementDimensions.h, 1955 scaleMode: {originalHeight: elementDimensions.h,
1942 originalWidth: elementDimensions.w}, 1956 originalWidth: elementDimensions.w},
1943 afterFinishInternal: function (effect) { 1957 afterFinishInternal: function (effect) {
1944 new v.Scale(element, 1, { 1958 new v.Scale(element, 1, {
1945 scaleContent: false, 1959 scaleContent: false,
1946 scaleY: false, 1960 scaleY: false,
1947 scaleMode: {originalHeight: elementDimensions.h, 1961 scaleMode: {originalHeight: elementDimensions.h,
1948 originalWidth: elementDimensions.w}, 1962 originalWidth: elementDimensions.w},
1949 afterFinishInternal: function (effect) { 1963 afterFinishInternal: function (effect) {
1950 s.hideElement(effect.element); 1964 s.hideElement(effect.element);
1951 s.undoClipping(effect.element, elemClip); 1965 s.undoClipping(effect.element, elemClip);
1952 s.setStyle(effect.element, oldStyle); 1966 s.setStyle(effect.element, oldStyle);
1953 } 1967 }
1954 }); 1968 });
1955 } 1969 }
1956 }, options); 1970 }, options);
1957 return new v.Scale(element, 5, options); 1971 return new v.Scale(element, 5, options);
1958}; 1972};
1959 1973
1960 1974
1961/* end of Rico adaptation */ 1975MochiKit.Base.nameFunctions(MochiKit.Visual);
1962
1963MochiKit.Visual.__new__ = function () {
1964 var m = MochiKit.Base;
1965
1966 // Backwards compatibility aliases
1967 m._deprecated(this, 'Color', 'MochiKit.Color.Color', '1.1');
1968 m._deprecated(this, 'getElementsComputedStyle', 'MochiKit.Style.getStyle', '1.1');
1969
1970 m.nameFunctions(this);
1971};
1972
1973MochiKit.Visual.__new__();
1974
1975MochiKit.Base._exportSymbols(this, MochiKit.Visual); 1976MochiKit.Base._exportSymbols(this, MochiKit.Visual);
diff --git a/frontend/gamma/js/MochiKit/__package__.js b/frontend/gamma/js/MochiKit/__package__.js
deleted file mode 100644
index 8d644b1..0000000
--- a/frontend/gamma/js/MochiKit/__package__.js
+++ b/dev/null
@@ -1,18 +0,0 @@
1dojo.kwCompoundRequire({
2 "common": [
3 "MochiKit.Base",
4 "MochiKit.Iter",
5 "MochiKit.Logging",
6 "MochiKit.DateTime",
7 "MochiKit.Format",
8 "MochiKit.Async",
9 "MochiKit.DOM",
10 "MochiKit.Style",
11 "MochiKit.LoggingPane",
12 "MochiKit.Color",
13 "MochiKit.Signal",
14 "MochiKit.Position",
15 "MochiKit.Visual"
16 ]
17});
18dojo.provide("MochiKit.*");
diff --git a/frontend/gamma/js/main.js b/frontend/gamma/js/main.js
index a9fd65e..934b325 100644
--- a/frontend/gamma/js/main.js
+++ b/frontend/gamma/js/main.js
@@ -20,74 +20,74 @@ refer to http://www.clipperz.com.
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24*/ 24*/
25 25
26function _pm_logEvent(anEvent) { 26function _pm_logEvent(anEvent) {
27 //console.log("####", anEvent); 27 //console.log("####", anEvent);
28 28
29 anEvent.preventDefault(); 29 anEvent.preventDefault();
30} 30}
31 31
32function handleGenericDeferredError(anError) { 32function handleGenericDeferredError(anError) {
33 var result; 33 var result;
34 34
35 if (anError instanceof MochiKit.Async.CancelledError) { 35 if (anError instanceof MochiKit.Async.CancelledError) {
36 result = anError; 36 result = anError;
37 } else { 37 } else {
38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
39//console.log(anError); 39//console.log(anError);
40 result = new MochiKit.Async.CancelledError(anError); 40 result = new MochiKit.Async.CancelledError(anError);
41 } 41 }
42 42
43 return result; 43 return result;
44} 44}
45 45
46 46
47Clipperz.PM.RunTime = {}; 47Clipperz.PM.RunTime = {};
48 48
49 49
50function run() { 50function run() {
51 var shouldShowRegistrationForm; 51 var shouldShowRegistrationForm;
52 var useCompactDesign; 52 var useCompactDesign;
53 var controllerParameters; 53 var controllerParameters;
54 54
55 controllerParameters = {}; 55 controllerParameters = {};
56 56
57 //MochiKit.DOM.removeElement('javaScriptAlert'); 57 //MochiKit.DOM.removeElement('javaScriptAlert');
58 Clipperz.PM.Strings.Languages.initSetup(); 58 Clipperz.PM.Strings.Languages.initSetup();
59 59
60 if (window.location.search.indexOf('registration') != -1) { 60 if (window.location.search.indexOf('registration') != -1) {
61 shouldShowRegistrationForm = true; 61 shouldShowRegistrationForm = true;
62 } else { 62 } else {
63 shouldShowRegistrationForm = false; 63 shouldShowRegistrationForm = false;
64 } 64 }
65 65
66 if (window.location.search.indexOf('autocomplete') != -1) { 66 if (window.location.search.indexOf('autocomplete') != -1) {
67 controllerParameters['autocomplete'] = 'on' 67 controllerParameters['autocomplete'] = 'on'
68 } 68 }
69 69
70 if (window.location.search.indexOf('compact') != -1) { 70 if (window.location.search.indexOf('compact') != -1) {
71 useCompactDesign = true; 71 useCompactDesign = true;
72 } else { 72 } else {
73 useCompactDesign = false; 73 useCompactDesign = false;
74 } 74 }
75 75
76 if (useCompactDesign == true) { 76 if (useCompactDesign == true) {
77 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters); 77 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters);
78 } else { 78 } else {
79 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters); 79 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters);
80 } 80 }
81 81
82 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm); 82 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm);
83 83
84//Clipperz.log("HASH: " + window.location.hash); 84 //Clipperz.log("HASH: " + window.location.hash);
85if (window.location.hash != "") { 85 //if (window.location.hash != "") {
86 window.location.hash = "" 86 // window.location.hash = ""
87} 87 //}
88//Clipperz.log("HASH cleaned"); 88 //Clipperz.log("HASH cleaned");
89 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'}) 89 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'})
90 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); 90 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
91} 91}
92 92
93MochiKit.DOM.addLoadEvent(run); 93MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/properties/gamma.properties.json b/frontend/gamma/properties/gamma.properties.json
index 8f2d98e..0a513e8 100644
--- a/frontend/gamma/properties/gamma.properties.json
+++ b/frontend/gamma/properties/gamma.properties.json
@@ -1,69 +1,72 @@
1{ 1{
2 "copyright.values": { 2 "copyright.values": {
3 "mochikit.repository": "http://svn.mochikit.com/mochikit/trunk/", 3 "mochikit.repository": "https://github.com/mochi/mochikit.git",
4 "mochikit.version": "1506" 4 "mochikit.version": "fe8d17bb9ac0a4e5ad4a8d5c2c94a6fac1c92d75"
5 }, 5 },
6
7 "html.template": "index_template.html",
8
6 "js": [ 9 "js": [
7 "MochiKit/Base.js", 10 "MochiKit/Base.js",
8 "MochiKit/Iter.js", 11 "MochiKit/Iter.js",
9 "MochiKit/Logging.js", 12 "MochiKit/Logging.js",
10 "-- MochiKit/DateTime.js", 13 "-- MochiKit/DateTime.js",
11 "MochiKit/Format.js", 14 "MochiKit/Format.js",
12 "MochiKit/Async.js", 15 "MochiKit/Async.js",
13 "MochiKit/DOM.js", 16 "MochiKit/DOM.js",
14 "MochiKit/Style.js", 17 "MochiKit/Style.js",
15 "MochiKit/LoggingPane.js", 18 "MochiKit/LoggingPane.js",
16 "MochiKit/Color.js", 19 "MochiKit/Color.js",
17 "MochiKit/Signal.js", 20 "MochiKit/Signal.js",
18 "MochiKit/Position.js", 21 "MochiKit/Position.js",
19 "MochiKit/Selector.js", 22 "MochiKit/Selector.js",
20 "MochiKit/Visual.js", 23 "MochiKit/Visual.js",
21 24
22 "JSON/json2.js", 25 "JSON/json2.js",
23 26
24 "Clipperz/YUI/Utils.js", 27 "Clipperz/YUI/Utils.js",
25 "Clipperz/YUI/DomHelper.js", 28 "Clipperz/YUI/DomHelper.js",
26 29
27 "Clipperz/ByteArray.js", 30 "Clipperz/ByteArray.js",
28 "Clipperz/Base.js", 31 "Clipperz/Base.js",
29 "Clipperz/Async.js", 32 "Clipperz/Async.js",
30 "Clipperz/CSVProcessor.js", 33 "Clipperz/CSVProcessor.js",
31 "Clipperz/KeePassExportProcessor.js", 34 "Clipperz/KeePassExportProcessor.js",
32 "Clipperz/Date.js", 35 "Clipperz/Date.js",
33 "Clipperz/DOM.js", 36 "Clipperz/DOM.js",
34 "Clipperz/Logging.js", 37 "Clipperz/Logging.js",
35 "Clipperz/Signal.js", 38 "Clipperz/Signal.js",
36 "Clipperz/Style.js", 39 "Clipperz/Style.js",
37 "Clipperz/Visual.js", 40 "Clipperz/Visual.js",
38 "Clipperz/Set.js", 41 "Clipperz/Set.js",
39 "-- Clipperz/Profile.js", 42 "-- Clipperz/Profile.js",
40 "Clipperz/KeyValueObjectStore.js", 43 "Clipperz/KeyValueObjectStore.js",
41 44
42 "Clipperz/Crypto/SHA.js", 45 "Clipperz/Crypto/SHA.js",
43 "Clipperz/Crypto/AES.js", 46 "Clipperz/Crypto/AES.js",
44 "Clipperz/Crypto/PRNG.js", 47 "Clipperz/Crypto/PRNG.js",
45 "Clipperz/Crypto/BigInt.js", 48 "Clipperz/Crypto/BigInt.js",
46 "Clipperz/Crypto/Base.js", 49 "Clipperz/Crypto/Base.js",
47 "Clipperz/Crypto/SRP.js", 50 "Clipperz/Crypto/SRP.js",
48 "Clipperz/Crypto/RSA.js", 51 "Clipperz/Crypto/RSA.js",
49 52
50 "Clipperz/PM/Strings/Strings_defaults.js", 53 "Clipperz/PM/Strings/Strings_defaults.js",
51 "Clipperz/PM/Strings/Strings_en-US.js", 54 "Clipperz/PM/Strings/Strings_en-US.js",
52 "-- # Clipperz/PM/Strings/Strings_en-GB.js", 55 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
53 "-- # Clipperz/PM/Strings/Strings_en-CA.js", 56 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
54 "-- Clipperz/PM/Strings/Strings_it-IT.js", 57 "-- Clipperz/PM/Strings/Strings_it-IT.js",
55 "-- Clipperz/PM/Strings/Strings_pt-BR.js", 58 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
56 "-- # Clipperz/PM/Strings/Strings_pt-PT.js", 59 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
57 "-- Clipperz/PM/Strings/Strings_ja-JP.js", 60 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
58 "-- Clipperz/PM/Strings/Strings_zh-CN.js", 61 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
59 "-- Clipperz/PM/Strings/Strings_es-ES.js", 62 "-- Clipperz/PM/Strings/Strings_es-ES.js",
60 "-- Clipperz/PM/Strings/Strings_fr-FR.js", 63 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
61 "-- # Clipperz/PM/Strings/Strings_de-DE.js", 64 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
62 "-- # Clipperz/PM/Strings/Strings_el-GR.js", 65 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
63 "-- # Clipperz/PM/Strings/Strings_ru-RU.js", 66 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
64 "-- # Clipperz/PM/Strings/Strings_he-IL.js", 67 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
65 "Clipperz/PM/Strings.js", 68 "Clipperz/PM/Strings.js",
66 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js", 69 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js",
67 70
68 "Clipperz/PM/Date.js", 71 "Clipperz/PM/Date.js",
69 72
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
index 828ccb8..16f64d0 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
@@ -1,95 +1,94 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.Crypto.AES_v3 - TEST</title> 28 <title>Clipperz.Crypto.AES_v3 - TEST</title>
29 29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
34 33
35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
36 35
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 40
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
44 43
45</head> 44</head>
46<body> 45<body>
47<pre id="test"> 46<pre id="test">
48<script type="text/javascript"> 47<script type="text/javascript">
49 48
50try { 49try {
51 var block; 50 var block;
52 var keyValue; 51 var keyValue;
53 varkey; 52 varkey;
54 var encryptedBlock; 53 var encryptedBlock;
55 var startTime, endTime; 54 var startTime, endTime;
56 55
57 startTime = new Date(); 56 startTime = new Date();
58 57
59 keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526"); 58 keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526");
60 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 59 key = new Clipperz.Crypto.AES.Key({key:keyValue});
61 block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab"); 60 block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab");
62 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 61 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
63 is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1"); 62 is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1");
64 63
65 keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e"); 64 keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e");
66 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 65 key = new Clipperz.Crypto.AES.Key({key:keyValue});
67 block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1"); 66 block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1");
68 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 67 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
69 is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2"); 68 is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2");
70 69
71 keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576"); 70 keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576");
72 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 71 key = new Clipperz.Crypto.AES.Key({key:keyValue});
73 block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c"); 72 block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c");
74 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 73 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
75 is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3"); 74 is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3");
76 75
77 keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e"); 76 keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e");
78 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 77 key = new Clipperz.Crypto.AES.Key({key:keyValue});
79 block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390"); 78 block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390");
80 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 79 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
81 is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4"); 80 is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4");
82 81
83 keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6"); 82 keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6");
84 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 83 key = new Clipperz.Crypto.AES.Key({key:keyValue});
85 block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6"); 84 block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6");
86 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 85 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
87 is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5"); 86 is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5");
88 87
89 keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee"); 88 keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee");
90 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 89 key = new Clipperz.Crypto.AES.Key({key:keyValue});
91 block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77"); 90 block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77");
92 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 91 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
93 is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6"); 92 is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6");
94 93
95 keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516"); 94 keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516");
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
index 4817096..a90d815 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
@@ -1,99 +1,98 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.Crypto.AES_performance - TEST</title> 28 <title>Clipperz.Crypto.AES_performance - TEST</title>
29 29
30 <script> 30 <script>
31 jslog_config_enabled = true; 31 jslog_config_enabled = true;
32 </script> 32 </script>
33 33
34 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 34 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
35 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
36 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
37 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
38 37
39 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
40 39
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
46 45
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 49
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
55 54
56</head> 55</head>
57<body> 56<body>
58<pre id="test"> 57<pre id="test">
59<script type="text/javascript"> 58<script type="text/javascript">
60Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 59Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
61 60
62try { 61try {
63 62
64 var password; 63 var password;
65 varplainText; 64 varplainText;
66 varencryptedText; 65 varencryptedText;
67 var decryptedText; 66 var decryptedText;
68 /* 67 /*
69 password = "trustno1"; 68 password = "trustno1";
70 plainText = "The quick brown fox jumps over the lazy dog"; 69 plainText = "The quick brown fox jumps over the lazy dog";
71//console.profile("encrypt"); 70//console.profile("encrypt");
72 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText); 71 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText);
73//console.profileEnd(); 72//console.profileEnd();
74//console.profile("decrypt"); 73//console.profile("decrypt");
75 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText); 74 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText);
76//console.profileEnd(); 75//console.profileEnd();
77 is(decryptedText, plainText, "simple string encrypted/decrypted"); 76 is(decryptedText, plainText, "simple string encrypted/decrypted");
78*/ 77*/
79 78
80 password = "L7bd9fQMhborMbYcHtlr"; 79 password = "L7bd9fQMhborMbYcHtlr";
81 plainText = {"records":{"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6":{"label":"imap4all [no]", "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", "notes":""}, "c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99":{"label":"Il manifesto", "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", "notes":""}, "70d536c89a86b1aa9e077d6f9c717306a5d6c8d5549789e42dfb4f981484f116":{"label":"OmniGroup applications", "key":"7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", "notes":"url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"}, "111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f":{"label":"R@cine", "key":"57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", "notes":""}, "378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df":{"label":"NewsGator", "key":"6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", "notes":""}, "30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e":{"label":"GMail - giulio.cesare", "key":"0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", "notes":""}, "b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0":{"label":"GMail - clipperz.com", "key":"90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", "notes":""}, "6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284":{"label":"Aruba - hosting", "key":"5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", "notes":""}, "741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700":{"label":"Aruba - sql hosting", "key":"f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", "notes":""}, "1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48":{"label":"Amazon", "key":"1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", "notes":""}, "d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4":{"label":"YouTube [no]", "key":"4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", "notes":""}, "5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc":{"label":"DynDns - gcsolaroli", "key":"f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", "notes":""}, "73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495":{"label":"DynDns - clipperz", "key":"d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", "notes":""}, "48d4c0546c032be26ecce4da41e020129afa7fc34cfe164ea72e1c9953d2e6bb":{"label":"Bol.it", "key":"cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", "notes":""}, "d62d420db34720ccc054df06b88725ea79020ffa9389ca15e70137fb4dfd0883":{"label":"Freenigma - clipperz.com", "key":"f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", "notes":""}, "ccd44ae294e7694ea53009c7198506cc0fe3121ad5d9fe2635d247e2afdab2ae":{"label":"Freenigma", "key":"4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", "notes":""}, "bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2":{"label":"clipperz.com - blog", "key":"9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", "notes":""}, "c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f":{"label":"Apple", "key":"75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", "notes":""}, "b5bd38d8eb5e23b1354884cc519e05580864fadf74d0a19d2c691cd0c7054d77":{"label":".mac", "key":"5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", "notes":""}, "ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380":{"label":"3nity", "key":"33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", "notes":""}, "7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552":{"label":"ACM", "key":"b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", "notes":""}, "b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020":{"label":"Adobe", "key":"d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", "notes":""}, "befc571e9cda1a7dfb1d15200240ca5170386280ee7be6a12716904cb6d0ea44":{"label":"Adobe Photoshop Elements 3", "key":"18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", "notes":"Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"}, "0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7":{"label":"Agatra", "key":"c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", "notes":""}, "e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935":{"label":"AIM", "key":"8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", "notes":""}, "de890eb76a4b0cabd4ffd490adad1ff1b73238c7b5ee6dde1a2aeab2d03ebe93":{"label":"Anna Vespignani", "key":"79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", "notes":""}, "0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21":{"label":"Bloglines", "key":"fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", "notes":""}, "85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b":{"label":"Bow.it", "key":"64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", "notes":""}, "60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811":{"label":"GMail - feedback", "key":"fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", "notes":""}, "257ac2da79ee1cd46dfa214d91f5ece213b6bbade28d1ee71495c81a3d7e033a":{"label":"Fineco", "key":"8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", "notes":""}, "78261622810232b6da5efcd52b1c9b0bd87c62517bf4df25323ca6a0b49d84ec":{"label":"mon.itor.us", "key":"d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", "notes":""}, "4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11":{"label":"Lamba Probe - forum", "key":"f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", "notes":""}, "78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941":{"label":"MeasureMap", "key":"2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", "notes":""}, "4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc":{"label":"NGI - Squillo", "key":"96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", "notes":""}, "eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143":{"label":"NGI - F5", "key":"00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", "notes":""}, "19654392222206d60547073209672dde1c743ea371ddc20a2bd8254e561a4ec0":{"label":"CVSdude", "key":"ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", "notes":""}, "6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993":{"label":"Yahoo", "key":"6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", "notes":"note"}}, "directLogins":{"eac496e0b1ec75ea403f821fedc7f51f98dac639713ebe577f969f607a8943f5":{"record":"111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f", "label":"R@cine - WebMail", "favicon":"http://www.racine.ra.it/favicon.ico"}, "ef564a022630d4395a9ecac854f3b127b3518cec362323ccc605079c0749c152":{"record":"1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48", "label":"Amazon sign in", "favicon":"http://www.amazon.com/favicon.ico"}, "4f14b88a4055ff23a00d625382650888ce9284fe869304775e43e3e33ee5bbb6":{"record":"6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284", "label":"Aruba - hosting", "favicon":"http://hosting.aruba.it/favicon.ico"}, "e94c0d12d1db0badc31a8bbbbc4b08d2065a39f458462bbff9756f7b5eb7fedf":{"record":"741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700", "label":"Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico"}, "7299249153ef93a44e2f248ca3a73badde56e71d70919bb5637093c2abbe2c9a":{"record":"bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico"}, "66876dbae68778d4c104bc12f01adcb21d47d9eace8db30ef95f74f461afcb59":{"record":"73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico"}, "a60c65030a1797abde3e2089c3e5de9648f66bf71cebf0b58c26e729ad8d6a45":{"record":"5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico"}, "08d6c5dff9fed4a2f237c32dd0a93ac46b2c45370d07f56fa76064be3b8fecbf":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico"}, "9e75e12f0f52f248cc7ae517869dd7b02303037d32d9fb4fa0ab0e013923c304":{"record":"c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico"}, "935bf9553fbcb85b8bd5b98c6901d7cccb2566b395f192cbea71e7822979aaf2":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico"}, "9504205ec29b89e6ccd0f3afc7a447d8891da0c71a0222f1860f98a8f8bc6677":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico"}, "3d8dd32d2290ca98789c914580ac2436ece97234217a07d752726d2ac48a4ebf":{"record":"d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico"}, "7c4b6b5a16984c43ed6d99b04ddfa7e00b624de729ec8aaa3d0f539fb67587e2":{"record":"c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico"}, "0b9a98262b50f0ebae5af077467bc627619738873690238fd61093ce9922c9f9":{"record":"ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico"}, "aadeb3388629cfc3b15954f26cf284f52e084191dcdf75752dc4c53d2006c5be":{"record":"7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico"}, "3d21c71f2e284ec76f1ae0bb990b683979918f758635bb7d008150f4d7b1447d":{"record":"b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico"}, "e61a331c998804d46044d4c2acaf96c2fce806f6549e1e16c7d2334872a70953":{"record":"0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico"}, "9bcd99564fda778061246439fa098dcc79de75b16c542f61e6de7d36dbaf97dc":{"record":"e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico"}, "c7093f4663c6e0eba941c557cb86da83fc68cbea36c922e168d0867e6cabe9fe":{"record":"0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico"}, "915f2e9460f6e54c6137f3876f9179fc8d2162c59f26e12899c2db6b0e70a68f":{"record":"85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico"}, "779701af1beb2a91735ba1a2e471b948f0d985bb0df256f5e089291ce3405bd2":{"record":"b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico"}, "1c300539a98c874d52134b6b5a591172acc00c0947692f3da284447f7d511eaf":{"record":"60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico"}, "f9dccdf7a98735fd7a6b5d04c09177005c0de14f8f92b04007f06a281ecdf31e":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico"}, "48497a89f3bfd567758977e1c32b4497d28c843880667ee52fa4cfcb53c5f9e4":{"record":"378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico"}, "134cd28f150df4f2a089f4807bb7a35fb7ece22ec41244f72e63f8b43637a4cd":{"record":"4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico"}, "2ab6106a81513b70f1ba0d7c5c3ef54fa6f4bcadf01d2eeaa2b31b9299551398":{"record":"78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico"}, "53ccdc41b43da9b018847f9faa8effb35e7a6c6e78a54e9ee7816fc02f0ea63b":{"record":"4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico"}, "ca520e7081fba1df3ef79c3d00266cffc8e4567def29d67ae812b7ed6283fb12":{"record":"eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico"}, "80e63e135d7abd2b2990f42af4f8d1f8e8b1146aed44dc36975061fbf360a983":{"record":"6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}}, "preferences":{"preferredLanguage":"en-US"}}; 80 plainText = {"records":{"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6":{"label":"imap4all [no]", "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", "notes":""}, "c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99":{"label":"Il manifesto", "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", "notes":""}, "70d536c89a86b1aa9e077d6f9c717306a5d6c8d5549789e42dfb4f981484f116":{"label":"OmniGroup applications", "key":"7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", "notes":"url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"}, "111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f":{"label":"R@cine", "key":"57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", "notes":""}, "378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df":{"label":"NewsGator", "key":"6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", "notes":""}, "30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e":{"label":"GMail - giulio.cesare", "key":"0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", "notes":""}, "b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0":{"label":"GMail - clipperz.com", "key":"90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", "notes":""}, "6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284":{"label":"Aruba - hosting", "key":"5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", "notes":""}, "741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700":{"label":"Aruba - sql hosting", "key":"f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", "notes":""}, "1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48":{"label":"Amazon", "key":"1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", "notes":""}, "d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4":{"label":"YouTube [no]", "key":"4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", "notes":""}, "5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc":{"label":"DynDns - gcsolaroli", "key":"f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", "notes":""}, "73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495":{"label":"DynDns - clipperz", "key":"d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", "notes":""}, "48d4c0546c032be26ecce4da41e020129afa7fc34cfe164ea72e1c9953d2e6bb":{"label":"Bol.it", "key":"cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", "notes":""}, "d62d420db34720ccc054df06b88725ea79020ffa9389ca15e70137fb4dfd0883":{"label":"Freenigma - clipperz.com", "key":"f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", "notes":""}, "ccd44ae294e7694ea53009c7198506cc0fe3121ad5d9fe2635d247e2afdab2ae":{"label":"Freenigma", "key":"4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", "notes":""}, "bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2":{"label":"clipperz.com - blog", "key":"9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", "notes":""}, "c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f":{"label":"Apple", "key":"75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", "notes":""}, "b5bd38d8eb5e23b1354884cc519e05580864fadf74d0a19d2c691cd0c7054d77":{"label":".mac", "key":"5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", "notes":""}, "ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380":{"label":"3nity", "key":"33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", "notes":""}, "7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552":{"label":"ACM", "key":"b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", "notes":""}, "b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020":{"label":"Adobe", "key":"d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", "notes":""}, "befc571e9cda1a7dfb1d15200240ca5170386280ee7be6a12716904cb6d0ea44":{"label":"Adobe Photoshop Elements 3", "key":"18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", "notes":"Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"}, "0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7":{"label":"Agatra", "key":"c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", "notes":""}, "e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935":{"label":"AIM", "key":"8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", "notes":""}, "de890eb76a4b0cabd4ffd490adad1ff1b73238c7b5ee6dde1a2aeab2d03ebe93":{"label":"Anna Vespignani", "key":"79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", "notes":""}, "0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21":{"label":"Bloglines", "key":"fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", "notes":""}, "85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b":{"label":"Bow.it", "key":"64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", "notes":""}, "60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811":{"label":"GMail - feedback", "key":"fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", "notes":""}, "257ac2da79ee1cd46dfa214d91f5ece213b6bbade28d1ee71495c81a3d7e033a":{"label":"Fineco", "key":"8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", "notes":""}, "78261622810232b6da5efcd52b1c9b0bd87c62517bf4df25323ca6a0b49d84ec":{"label":"mon.itor.us", "key":"d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", "notes":""}, "4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11":{"label":"Lamba Probe - forum", "key":"f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", "notes":""}, "78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941":{"label":"MeasureMap", "key":"2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", "notes":""}, "4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc":{"label":"NGI - Squillo", "key":"96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", "notes":""}, "eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143":{"label":"NGI - F5", "key":"00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", "notes":""}, "19654392222206d60547073209672dde1c743ea371ddc20a2bd8254e561a4ec0":{"label":"CVSdude", "key":"ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", "notes":""}, "6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993":{"label":"Yahoo", "key":"6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", "notes":"note"}}, "directLogins":{"eac496e0b1ec75ea403f821fedc7f51f98dac639713ebe577f969f607a8943f5":{"record":"111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f", "label":"R@cine - WebMail", "favicon":"http://www.racine.ra.it/favicon.ico"}, "ef564a022630d4395a9ecac854f3b127b3518cec362323ccc605079c0749c152":{"record":"1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48", "label":"Amazon sign in", "favicon":"http://www.amazon.com/favicon.ico"}, "4f14b88a4055ff23a00d625382650888ce9284fe869304775e43e3e33ee5bbb6":{"record":"6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284", "label":"Aruba - hosting", "favicon":"http://hosting.aruba.it/favicon.ico"}, "e94c0d12d1db0badc31a8bbbbc4b08d2065a39f458462bbff9756f7b5eb7fedf":{"record":"741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700", "label":"Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico"}, "7299249153ef93a44e2f248ca3a73badde56e71d70919bb5637093c2abbe2c9a":{"record":"bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico"}, "66876dbae68778d4c104bc12f01adcb21d47d9eace8db30ef95f74f461afcb59":{"record":"73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico"}, "a60c65030a1797abde3e2089c3e5de9648f66bf71cebf0b58c26e729ad8d6a45":{"record":"5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico"}, "08d6c5dff9fed4a2f237c32dd0a93ac46b2c45370d07f56fa76064be3b8fecbf":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico"}, "9e75e12f0f52f248cc7ae517869dd7b02303037d32d9fb4fa0ab0e013923c304":{"record":"c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico"}, "935bf9553fbcb85b8bd5b98c6901d7cccb2566b395f192cbea71e7822979aaf2":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico"}, "9504205ec29b89e6ccd0f3afc7a447d8891da0c71a0222f1860f98a8f8bc6677":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico"}, "3d8dd32d2290ca98789c914580ac2436ece97234217a07d752726d2ac48a4ebf":{"record":"d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico"}, "7c4b6b5a16984c43ed6d99b04ddfa7e00b624de729ec8aaa3d0f539fb67587e2":{"record":"c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico"}, "0b9a98262b50f0ebae5af077467bc627619738873690238fd61093ce9922c9f9":{"record":"ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico"}, "aadeb3388629cfc3b15954f26cf284f52e084191dcdf75752dc4c53d2006c5be":{"record":"7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico"}, "3d21c71f2e284ec76f1ae0bb990b683979918f758635bb7d008150f4d7b1447d":{"record":"b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico"}, "e61a331c998804d46044d4c2acaf96c2fce806f6549e1e16c7d2334872a70953":{"record":"0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico"}, "9bcd99564fda778061246439fa098dcc79de75b16c542f61e6de7d36dbaf97dc":{"record":"e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico"}, "c7093f4663c6e0eba941c557cb86da83fc68cbea36c922e168d0867e6cabe9fe":{"record":"0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico"}, "915f2e9460f6e54c6137f3876f9179fc8d2162c59f26e12899c2db6b0e70a68f":{"record":"85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico"}, "779701af1beb2a91735ba1a2e471b948f0d985bb0df256f5e089291ce3405bd2":{"record":"b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico"}, "1c300539a98c874d52134b6b5a591172acc00c0947692f3da284447f7d511eaf":{"record":"60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico"}, "f9dccdf7a98735fd7a6b5d04c09177005c0de14f8f92b04007f06a281ecdf31e":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico"}, "48497a89f3bfd567758977e1c32b4497d28c843880667ee52fa4cfcb53c5f9e4":{"record":"378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico"}, "134cd28f150df4f2a089f4807bb7a35fb7ece22ec41244f72e63f8b43637a4cd":{"record":"4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico"}, "2ab6106a81513b70f1ba0d7c5c3ef54fa6f4bcadf01d2eeaa2b31b9299551398":{"record":"78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico"}, "53ccdc41b43da9b018847f9faa8effb35e7a6c6e78a54e9ee7816fc02f0ea63b":{"record":"4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico"}, "ca520e7081fba1df3ef79c3d00266cffc8e4567def29d67ae812b7ed6283fb12":{"record":"eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico"}, "80e63e135d7abd2b2990f42af4f8d1f8e8b1146aed44dc36975061fbf360a983":{"record":"6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}}, "preferences":{"preferredLanguage":"en-US"}};
82/* */ 81/* */
83 plainText = { 82 plainText = {
84 "records": { 83 "records": {
85 "1": { 84 "1": {
86 "label":"imap4all [no]", 85 "label":"imap4all [no]",
87 "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", 86 "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd",
88 "notes":"" 87 "notes":""
89 }, 88 },
90 "2": { 89 "2": {
91 "label":"Il manifesto", 90 "label":"Il manifesto",
92 "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", 91 "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c",
93 "notes":"" 92 "notes":""
94 }, 93 },
95 "3": { 94 "3": {
96 "label": "OmniGroup applications", 95 "label": "OmniGroup applications",
97 "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", 96 "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c",
98 "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:" 97 "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"
99 }, 98 },
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
index 0ffcdb8..83f0766 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
@@ -1,93 +1,92 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
36 35
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
41 40
42</head> 41</head>
43<body> 42<body>
44<pre id="test"> 43<pre id="test">
45<script type="text/javascript"> 44<script type="text/javascript">
46try { 45try {
47 var secretKey; 46 var secretKey;
48 varpublicKey; 47 varpublicKey;
49 varplainString; 48 varplainString;
50 varencryptedString; 49 varencryptedString;
51 50
52 51
53 secretKey = "s3cr37k39"; 52 secretKey = "s3cr37k39";
54 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog"; 53 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog";
55 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 54 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
56 55
57 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
58 // 57 //
59 //Secret key encryption / decryption 58 //Secret key encryption / decryption
60 // 59 //
61 is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty"); 60 is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty");
62 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 61 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
63 62
64 try { 63 try {
65 vardecryptedText; 64 vardecryptedText;
66 65
67 decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString); 66 decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString);
68 ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" ); 67 ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" );
69 } catch (e) { 68 } catch (e) {
70 ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" ); 69 ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" );
71 } 70 }
72 71
73 is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values"); 72 is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values");
74 73
75 secretKey = "trustno1"; 74 secretKey = "trustno1";
76 plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1"; 75 plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1";
77 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 76 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
78 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 77 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
79 78
80 secretKey = "trustno1"; 79 secretKey = "trustno1";
81 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas."; 80 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.";
82 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 81 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
83 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 82 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
84 83
85 secretKey = "trustno1"; 84 secretKey = "trustno1";
86 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas./n/n/nMorbi vel leo non justo condimentum convallis. Vestibulum posuere aliquam nunc. Donec magna magna, euismod nec, pharetra fringilla, tristique mattis, turpis. Duis condimentum lacus eu felis. Sed ultricies. Nullam lacinia ante id diam. Ut quis enim. Fusce at felis quis neque vehicula tempor. Sed feugiat sodales sem. Duis cursus massa in ligula. Vestibulum volutpat, risus in ornare porta, tortor orci vestibulum felis, et eleifend risus odio nec eros. Integer lorem turpis, imperdiet eu, tempor eu, ultricies nec, est. Ut congue. Morbi lacinia vehicula pede. Cras neque sapien, feugiat ac, eleifend eget, mattis et, nisl. Morbi at augue vitae massa laoreet gravida./n/n/nSuspendisse vehicula convallis sem. Sed vel urna. Proin dolor diam, malesuada in, aliquet a, sagittis et, magna. Cras at dui eu mi porta fermentum. Donec pharetra purus sed velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque euismod ornare neque. In odio nisi, bibendum non, vulputate ut, tincidunt a, ante. Sed risus arcu, tempus laoreet, euismod id, laoreet mollis, arcu. Ut tempor orci in nibh. Suspendisse potenti. Maecenas accumsan augue at nisl. Donec elementum diam nec metus. Sed vitae lacus sed libero varius semper. Aenean hendrerit tristique arcu. Praesent adipiscing ornare purus. Vestibulum quis eros nec risus accumsan laoreet. Duis consequat ante ut turpis. Curabitur aliquam suscipit ligula. Vivamus adipiscing./n/n/nCurabitur facilisis neque sit amet erat. Aliquam odio augue, vulputate lobortis, rutrum ut, tristique id, leo. Vivamus eu magna. Maecenas et libero. Integer porta, lorem at mollis ullamcorper, purus metus vestibulum erat, ut fringilla dui ante id mi. Morbi vitae ligula. Praesent ornare sapien sed massa. Mauris rhoncus fermentum dolor. Mauris gravida, justo et mollis malesuada, dolor erat fermentum nulla, vel suscipit leo ligula vel augue. Praesent magna enim, dignissim sed, aliquet quis, fermentum viverra, nisi. Vivamus condimentum, nisi quis posuere viverra, enim nunc faucibus lectus, mollis aliquam ipsum enim vel lacus. Suspendisse eget ligula. Aliquam ut metus et justo consectetuer ornare. Donec dapibus tristique pede. Vestibulum interdum ultricies tortor./n/n/nNunc nonummy dictum tortor. Quisque at elit a arcu nonummy elementum. Quisque auctor, risus et sodales euismod, turpis tellus consectetuer ante, quis egestas justo enim quis mi. Nunc fermentum sodales felis. Vivamus odio mi, dignissim vitae, auctor nec, tempus eget, lacus. Ut sapien massa, hendrerit eget, sagittis at, eleifend condimentum, arcu. Curabitur purus orci, facilisis vel, dapibus id, varius rutrum, tortor. Fusce accumsan viverra sem. Quisque tincidunt venenatis risus. Sed tortor justo, volutpat malesuada, sodales ut, vehicula id, magna. Nunc placerat, nibh et imperdiet ultricies, urna nulla luctus sapien, et porta mi odio ac neque. Morbi dignissim. Sed risus pede, adipiscing gravida, pharetra sit amet, convallis non, orci. Morbi adipiscing mauris id massa. Nullam fermentum. Suspendisse eget est"; 85 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas./n/n/nMorbi vel leo non justo condimentum convallis. Vestibulum posuere aliquam nunc. Donec magna magna, euismod nec, pharetra fringilla, tristique mattis, turpis. Duis condimentum lacus eu felis. Sed ultricies. Nullam lacinia ante id diam. Ut quis enim. Fusce at felis quis neque vehicula tempor. Sed feugiat sodales sem. Duis cursus massa in ligula. Vestibulum volutpat, risus in ornare porta, tortor orci vestibulum felis, et eleifend risus odio nec eros. Integer lorem turpis, imperdiet eu, tempor eu, ultricies nec, est. Ut congue. Morbi lacinia vehicula pede. Cras neque sapien, feugiat ac, eleifend eget, mattis et, nisl. Morbi at augue vitae massa laoreet gravida./n/n/nSuspendisse vehicula convallis sem. Sed vel urna. Proin dolor diam, malesuada in, aliquet a, sagittis et, magna. Cras at dui eu mi porta fermentum. Donec pharetra purus sed velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque euismod ornare neque. In odio nisi, bibendum non, vulputate ut, tincidunt a, ante. Sed risus arcu, tempus laoreet, euismod id, laoreet mollis, arcu. Ut tempor orci in nibh. Suspendisse potenti. Maecenas accumsan augue at nisl. Donec elementum diam nec metus. Sed vitae lacus sed libero varius semper. Aenean hendrerit tristique arcu. Praesent adipiscing ornare purus. Vestibulum quis eros nec risus accumsan laoreet. Duis consequat ante ut turpis. Curabitur aliquam suscipit ligula. Vivamus adipiscing./n/n/nCurabitur facilisis neque sit amet erat. Aliquam odio augue, vulputate lobortis, rutrum ut, tristique id, leo. Vivamus eu magna. Maecenas et libero. Integer porta, lorem at mollis ullamcorper, purus metus vestibulum erat, ut fringilla dui ante id mi. Morbi vitae ligula. Praesent ornare sapien sed massa. Mauris rhoncus fermentum dolor. Mauris gravida, justo et mollis malesuada, dolor erat fermentum nulla, vel suscipit leo ligula vel augue. Praesent magna enim, dignissim sed, aliquet quis, fermentum viverra, nisi. Vivamus condimentum, nisi quis posuere viverra, enim nunc faucibus lectus, mollis aliquam ipsum enim vel lacus. Suspendisse eget ligula. Aliquam ut metus et justo consectetuer ornare. Donec dapibus tristique pede. Vestibulum interdum ultricies tortor./n/n/nNunc nonummy dictum tortor. Quisque at elit a arcu nonummy elementum. Quisque auctor, risus et sodales euismod, turpis tellus consectetuer ante, quis egestas justo enim quis mi. Nunc fermentum sodales felis. Vivamus odio mi, dignissim vitae, auctor nec, tempus eget, lacus. Ut sapien massa, hendrerit eget, sagittis at, eleifend condimentum, arcu. Curabitur purus orci, facilisis vel, dapibus id, varius rutrum, tortor. Fusce accumsan viverra sem. Quisque tincidunt venenatis risus. Sed tortor justo, volutpat malesuada, sodales ut, vehicula id, magna. Nunc placerat, nibh et imperdiet ultricies, urna nulla luctus sapien, et porta mi odio ac neque. Morbi dignissim. Sed risus pede, adipiscing gravida, pharetra sit amet, convallis non, orci. Morbi adipiscing mauris id massa. Nullam fermentum. Suspendisse eget est";
87 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 86 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
88 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 87 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
89 88
90 //secretKey = "trustno1"; 89 //secretKey = "trustno1";
91 //plainString = "{}"; 90 //plainString = "{}";
92 // plainString = "{'tags': {'personal': ['ref_1', 'ref_3'], 'business': ['ref_2', 'ref_3']}, 'records': {'ref_1': {'label': 'record_1', 'key': 'key_1'}, 'ref_2': {'label': 'record_2', 'key': 'key_2'}, 'ref_3': {'label': 'record_3', 'key': 'key_3'}}}"; 91 // plainString = "{'tags': {'personal': ['ref_1', 'ref_3'], 'business': ['ref_2', 'ref_3']}, 'records': {'ref_1': {'label': 'record_1', 'key': 'key_1'}, 'ref_2': {'label': 'record_2', 'key': 'key_2'}, 'ref_3': {'label': 'record_3', 'key': 'key_3'}}}";
93 //plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}"; 92 //plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}";
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
index b970a9a..f4db3b7 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
@@ -1,93 +1,92 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
37 36
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
41</head> 40</head>
42<body> 41<body>
43<pre id="test"> 42<pre id="test">
44<script type="text/javascript"> 43<script type="text/javascript">
45try { 44try {
46 varbigInt_1; 45 varbigInt_1;
47 varbigInt_2; 46 varbigInt_2;
48 varresult; 47 varresult;
49 varexpectedResult; 48 varexpectedResult;
50 49
51 // 50 //
52 //Constructur and equality test 51 //Constructur and equality test
53 // 52 //
54 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 53 bigInt_1 = new Clipperz.Crypto.BigInt("110");
55 is (bigInt_1.equals(bigInt_1), true, ""); 54 is (bigInt_1.equals(bigInt_1), true, "");
56 55
57 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 56 bigInt_1 = new Clipperz.Crypto.BigInt("110");
58 bigInt_2 = new Clipperz.Crypto.BigInt("110", 10); 57 bigInt_2 = new Clipperz.Crypto.BigInt("110", 10);
59 is (bigInt_1.equals(bigInt_2), true, ""); 58 is (bigInt_1.equals(bigInt_2), true, "");
60 59
61 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 60 bigInt_1 = new Clipperz.Crypto.BigInt("110");
62 bigInt_2 = new Clipperz.Crypto.BigInt(110); 61 bigInt_2 = new Clipperz.Crypto.BigInt(110);
63 is (bigInt_1.equals(bigInt_2), true, ""); 62 is (bigInt_1.equals(bigInt_2), true, "");
64 63
65 bigInt_1 = new Clipperz.Crypto.BigInt(6); 64 bigInt_1 = new Clipperz.Crypto.BigInt(6);
66 bigInt_2 = new Clipperz.Crypto.BigInt("110", 2); 65 bigInt_2 = new Clipperz.Crypto.BigInt("110", 2);
67 is (bigInt_1.equals(bigInt_2), true, ""); 66 is (bigInt_1.equals(bigInt_2), true, "");
68 67
69 bigInt_1 = new Clipperz.Crypto.BigInt(6); 68 bigInt_1 = new Clipperz.Crypto.BigInt(6);
70 bigInt_2 = new Clipperz.Crypto.BigInt("110", 3); 69 bigInt_2 = new Clipperz.Crypto.BigInt("110", 3);
71 is (bigInt_1.equals(bigInt_2), false, ""); 70 is (bigInt_1.equals(bigInt_2), false, "");
72 71
73 72
74 // 73 //
75 //Addition test 74 //Addition test
76 // 75 //
77 bigInt_1 = new Clipperz.Crypto.BigInt(6); 76 bigInt_1 = new Clipperz.Crypto.BigInt(6);
78 bigInt_2 = new Clipperz.Crypto.BigInt(110); 77 bigInt_2 = new Clipperz.Crypto.BigInt(110);
79 result = bigInt_1.add(bigInt_2); 78 result = bigInt_1.add(bigInt_2);
80 expectedResult = new Clipperz.Crypto.BigInt(116); 79 expectedResult = new Clipperz.Crypto.BigInt(116);
81 is (result.equals(expectedResult), true, ""); 80 is (result.equals(expectedResult), true, "");
82 is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function"); 81 is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function");
83 82
84 bigInt_1 = new Clipperz.Crypto.BigInt(6); 83 bigInt_1 = new Clipperz.Crypto.BigInt(6);
85 result = bigInt_1.add(6); 84 result = bigInt_1.add(6);
86 expectedResult = new Clipperz.Crypto.BigInt(12); 85 expectedResult = new Clipperz.Crypto.BigInt(12);
87 is (result.equals(expectedResult), true, ""); 86 is (result.equals(expectedResult), true, "");
88 87
89 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161"); 88 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161");
90 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); 89 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
91 result = bigInt_1.add(bigInt_2); 90 result = bigInt_1.add(bigInt_2);
92 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585"); 91 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585");
93 is (result.equals(expectedResult), true, ""); 92 is (result.equals(expectedResult), true, "");
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
index 6024021..93d8695 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
@@ -1,93 +1,92 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
35 34
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
38<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 37<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
44</head> 43</head>
45<body> 44<body>
46<pre id="test"> 45<pre id="test">
47<script type="text/javascript"> 46<script type="text/javascript">
48try { 47try {
49 // 48 //
50 //ECC.BinaryFiniteField 49 //ECC.BinaryFiniteField
51 // 50 //
52 varf2m; 51 varf2m;
53 varf2m_improved; 52 varf2m_improved;
54 var a, a1, b; 53 var a, a1, b;
55 var result; 54 var result;
56 var result_improved; 55 var result_improved;
57 var expectedResul; 56 var expectedResul;
58 57
59 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) 58 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
60 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField(); 59 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField();
61 a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16); 60 a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16);
62 b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16); 61 b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16);
63 62
64 // 63 //
65 //addition 64 //addition
66 // 65 //
67 result = f2m.add(a, b); 66 result = f2m.add(a, b);
68 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); 67 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
69 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); 68 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
70 69
71 70
72 // 71 //
73 //negation 72 //negation
74 // 73 //
75 result = f2m.negate(a); 74 result = f2m.negate(a);
76 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); 75 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
77 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); 76 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
78 77
79 78
80 // 79 //
81 //multiplication 80 //multiplication
82 // 81 //
83 result = f2m.multiply(a, b); 82 result = f2m.multiply(a, b);
84 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16); 83 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16);
85 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); 84 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
86 85
87 86
88 // 87 //
89 //fast multiplication 88 //fast multiplication
90 // 89 //
91 result = f2m.fastMultiply(a, b); 90 result = f2m.fastMultiply(a, b);
92 expectedResult = f2m.multiply(a, b); 91 expectedResult = f2m.multiply(a, b);
93 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 92 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
index 5a7a4f7..658c402 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
@@ -1,93 +1,92 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
35 34
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
38<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 37<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
44</head> 43</head>
45<body> 44<body>
46<pre id="test"> 45<pre id="test">
47<script type="text/javascript"> 46<script type="text/javascript">
48try { 47try {
49 // 48 //
50 //ECC.BinaryFiniteField 49 //ECC.BinaryFiniteField
51 // 50 //
52 varf2m; 51 varf2m;
53 varf2m_improved; 52 varf2m_improved;
54 var a, b; 53 var a, b;
55 var result; 54 var result;
56 var result_improved; 55 var result_improved;
57 var expectedResul; 56 var expectedResul;
58 57
59 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)}) 58 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)})
60 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField(); 59 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField();
61 a = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca8 7b8f1446 84a2c58a e9308c23 7789e4bf 1f36dd11 7c150b7d 6076dd1d a6197fe4 c5225a06 4db0e422 2589d5ca 50eb6bb6 b7147a03 f6152843 8a8767c6 a6c4a688 3fd6f067", 16); 60 a = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca8 7b8f1446 84a2c58a e9308c23 7789e4bf 1f36dd11 7c150b7d 6076dd1d a6197fe4 c5225a06 4db0e422 2589d5ca 50eb6bb6 b7147a03 f6152843 8a8767c6 a6c4a688 3fd6f067", 16);
62 b = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c9 7e74737b 38925faf e22cea3e 12b868d4 ddea5b33 41db8fc2 e788cab7 4f0a7a3c c27087a8 93659453 69938650 a99217d5 66e13f80 dc87f082 73f7411b 6b01ef1d 399c772a", 16); 61 b = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c9 7e74737b 38925faf e22cea3e 12b868d4 ddea5b33 41db8fc2 e788cab7 4f0a7a3c c27087a8 93659453 69938650 a99217d5 66e13f80 dc87f082 73f7411b 6b01ef1d 399c772a", 16);
63 62
64 // 63 //
65 //addition 64 //addition
66 // 65 //
67 result = f2m.add(a, b); 66 result = f2m.add(a, b);
68 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16); 67 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16);
69 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); 68 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
70 69
71 70
72 // 71 //
73 //negation 72 //negation
74 // 73 //
75 result = f2m.negate(a); 74 result = f2m.negate(a);
76 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 75 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
77 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); 76 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
78 77
79 78
80 // 79 //
81 //multiplication 80 //multiplication
82 // 81 //
83 result = f2m.multiply(a, b); 82 result = f2m.multiply(a, b);
84 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16); 83 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16);
85 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); 84 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
86 85
87 86
88 // 87 //
89 //fast multiplication 88 //fast multiplication
90 // 89 //
91 result = f2m.fastMultiply(a, b); 90 result = f2m.fastMultiply(a, b);
92 expectedResult = f2m.multiply(a, b); 91 expectedResult = f2m.multiply(a, b);
93 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 92 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
index c58cf42..0d0903d 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
@@ -1,93 +1,92 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
35 34
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
38<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 37<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
44</head> 43</head>
45<body> 44<body>
46<pre id="test"> 45<pre id="test">
47<script type="text/javascript"> 46<script type="text/javascript">
48try { 47try {
49 var value_1; 48 var value_1;
50 var value_2; 49 var value_2;
51 50
52 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16); 51 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16);
53 is(value_1.asString(16), "0a"); 52 is(value_1.asString(16), "0a");
54 53
55 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16); 54 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16);
56 is(value_1.asString(16), "ffff"); 55 is(value_1.asString(16), "ffff");
57 56
58 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16); 57 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16);
59 is(value_1.asString(16), "7fff"); 58 is(value_1.asString(16), "7fff");
60 59
61 is(parseInt("ffff", 16), 65535); 60 is(parseInt("ffff", 16), 65535);
62 is(parseInt("ffffff", 16), 16777215); 61 is(parseInt("ffffff", 16), 16777215);
63 is(parseInt("ffffffff", 16), 4294967295); 62 is(parseInt("ffffffff", 16), 4294967295);
64 is(parseInt("ffffffffff", 16), 1099511627775); 63 is(parseInt("ffffffffff", 16), 1099511627775);
65 is(parseInt("ffffffffffff", 16), 281474976710655); 64 is(parseInt("ffffffffffff", 16), 281474976710655);
66 is(parseInt("ffffffffffffff", 16), 72057594037927940); 65 is(parseInt("ffffffffffffff", 16), 72057594037927940);
67 is(parseInt("ffffffffffffffff", 16), 18446744073709552000); 66 is(parseInt("ffffffffffffffff", 16), 18446744073709552000);
68 is(parseInt("10000000000000000", 16), 18446744073709552001); 67 is(parseInt("10000000000000000", 16), 18446744073709552001);
69 is(parseInt("10000000000000001", 16), 18446744073709552002); 68 is(parseInt("10000000000000001", 16), 18446744073709552002);
70 is(parseInt("10000000000000009", 16), 18446744073709552010); 69 is(parseInt("10000000000000009", 16), 18446744073709552010);
71 70
72 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 71 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
73 is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method"); 72 is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method");
74 73
75 // 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1 74 // 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1
76 is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]"); 75 is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]");
77 is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]"); 76 is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]");
78 is(value_1.value()[2], parseInt("150936df", 16), "word[2]"); 77 is(value_1.value()[2], parseInt("150936df", 16), "word[2]");
79 is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]"); 78 is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]");
80 is(value_1.value()[4], parseInt("01045434", 16), "word[4]"); 79 is(value_1.value()[4], parseInt("01045434", 16), "word[4]");
81 is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]"); 80 is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]");
82 is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]"); 81 is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]");
83 is(value_1.value()[7], parseInt("000108cb", 16), "word[7]"); 82 is(value_1.value()[7], parseInt("000108cb", 16), "word[7]");
84 83
85 is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)"); 84 is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)");
86 85
87 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16); 86 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16);
88 is(value_1.wordSize(), 3, "check the number of words of a value with only a bit set on the first slot of byte at position 17"); 87 is(value_1.wordSize(), 3, "check the number of words of a value with only a bit set on the first slot of byte at position 17");
89 is(value_1.value()[0], parseInt("00000000", 16), "word[0]"); 88 is(value_1.value()[0], parseInt("00000000", 16), "word[0]");
90 is(value_1.value()[1], parseInt("00000000", 16), "word[1]"); 89 is(value_1.value()[1], parseInt("00000000", 16), "word[1]");
91 is(value_1.value()[2], parseInt("10", 16), "word[2]"); 90 is(value_1.value()[2], parseInt("10", 16), "word[2]");
92 is(value_1.asString(16), "100000000000000000", "2^17 asString(16)"); 91 is(value_1.asString(16), "100000000000000000", "2^17 asString(16)");
93 92
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
index 438d96f..61aa1c2 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
@@ -1,95 +1,94 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script> jslog_config_enabled = true; </script> 28 <script> jslog_config_enabled = true; </script>
29 29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
34 33
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
41 40
42<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>--> 41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>-->
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
48</head> 47</head>
49<body> 48<body>
50<pre id="test"> 49<pre id="test">
51<script type="text/javascript"> 50<script type="text/javascript">
52test_PRNG = function() { 51test_PRNG = function() {
53 varrand1, rand2; 52 varrand1, rand2;
54 var i,c; 53 var i,c;
55 54
56 c = 10; 55 c = 10;
57 for (i=0; i<c; i++) { 56 for (i=0; i<c; i++) {
58 // jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString()); 57 // jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString());
59 } 58 }
60 59
61 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); 60 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
62 is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte"); 61 is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte");
63 62
64 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); 63 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
65 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); 64 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
66 65
67 66
68 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 67 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
69 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 68 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
70 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); 69 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
71 is(rand1.split(0,1).equals(rand2.split(0,1)), false, "getRandomByte should almost always return two different values when called into sequence"); 70 is(rand1.split(0,1).equals(rand2.split(0,1)), false, "getRandomByte should almost always return two different values when called into sequence");
72 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test"); 71 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test");
73 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test"); 72 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test");
74 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test"); 73 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test");
75 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test"); 74 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test");
76 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test"); 75 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test");
77 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test"); 76 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test");
78 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test"); 77 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test");
79 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test"); 78 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test");
80 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test"); 79 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test");
81 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test"); 80 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test");
82 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test"); 81 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test");
83 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test"); 82 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test");
84 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test"); 83 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test");
85 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test"); 84 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test");
86//jslog.debug(rand1.toHexString()); 85//jslog.debug(rand1.toHexString());
87//jslog.debug(rand2.toHexString()); 86//jslog.debug(rand2.toHexString());
88 87
89 SimpleTest.finish(); 88 SimpleTest.finish();
90} 89}
91 90
92try { 91try {
93 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG); 92 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG);
94 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 93 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
95 SimpleTest.waitForExplicitFinish(); 94 SimpleTest.waitForExplicitFinish();
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
index f29f894..4c7fd86 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
@@ -1,87 +1,86 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
35 34
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
39 38
40</head> 39</head>
41<body> 40<body>
42<pre id="test"> 41<pre id="test">
43<script type="text/javascript"> 42<script type="text/javascript">
44try { 43try {
45 varrsaPublicKey; 44 varrsaPublicKey;
46 varrandomValue; 45 varrandomValue;
47 varpublicEncryptedValue; 46 varpublicEncryptedValue;
48 var privateEncryptedValue; 47 var privateEncryptedValue;
49 48
50 varstartTime; 49 varstartTime;
51 varendTime; 50 varendTime;
52 51
53 52
54startTime=new Date(); 53startTime=new Date();
55 rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512); 54 rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512);
56 55
57endTime=new Date(); 56endTime=new Date();
58is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0); 57is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0);
59 58
60 randomValue = Clipperz.Crypto.Base.generateRandomSeed(); 59 randomValue = Clipperz.Crypto.Base.generateRandomSeed();
61 publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue); 60 publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue);
62 privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue); 61 privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue);
63 62
64 is(publicEncryptedValue == privateEncryptedValue, false); 63 is(publicEncryptedValue == privateEncryptedValue, false);
65 is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue); 64 is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue);
66 is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue); 65 is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue);
67 66
68 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
69} catch (err) { 68} catch (err) {
70 69
71 var s = "test suite failure!\n"; 70 var s = "test suite failure!\n";
72 var o = {}; 71 var o = {};
73 var k = null; 72 var k = null;
74 for (k in err) { 73 for (k in err) {
75 // ensure unique keys?! 74 // ensure unique keys?!
76 if (!o[k]) { 75 if (!o[k]) {
77 s += k + ": " + err[k] + "\n"; 76 s += k + ": " + err[k] + "\n";
78 o[k] = err[k]; 77 o[k] = err[k];
79 } 78 }
80 } 79 }
81 ok ( false, s ); 80 ok ( false, s );
82} 81}
83 82
84</script> 83</script>
85</pre> 84</pre>
86</body> 85</body>
87</html> 86</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
index a580491..a2f6c04 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
@@ -2,129 +2,128 @@
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.Crypto.SHA - TEST</title> 28 <title>Clipperz.Crypto.SHA - TEST</title>
29 29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 33
34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
35 35
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
42 42
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
44 44
45 45
46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
47 47
48</head> 48</head>
49<body> 49<body>
50<pre id="test"> 50<pre id="test">
51<script type="text/javascript" src="SHA.test.js"></script> 51<script type="text/javascript" src="SHA.test.js"></script>
52</pre> 52</pre>
53</body> 53</body>
54</html> 54</html>
55 55
56 56
57 57
58<!-- html> 58<!-- html>
59<head> 59<head>
60 <script> 60 <script>
61 jslog_config_enabled = true; 61 jslog_config_enabled = true;
62 clipperz_profiling_enabled = true; 62 clipperz_profiling_enabled = true;
63 </script> 63 </script>
64 64
65 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 65 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
66 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
67 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 66 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
68 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 67 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
69 68
70 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
74 73
75 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
76</head> 75</head>
77<body> 76<body>
78<pre id="test"> 77<pre id="test">
79<script type="text/javascript"> 78<script type="text/javascript">
80 79
81try { 80try {
82 varbyteArray; 81 varbyteArray;
83 varhash; 82 varhash;
84 var longText; 83 var longText;
85 var startTime, endTime; 84 var startTime, endTime;
86 85
87 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; 86 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
88 87
89 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
90 // 89 //
91 //Test of SHA-256 algorithm 90 //Test of SHA-256 algorithm
92 // 91 //
93 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
94 93
95 byteArray = new Clipperz.ByteArray(); 94 byteArray = new Clipperz.ByteArray();
96 hash = Clipperz.Crypto.SHA.sha256(byteArray); 95 hash = Clipperz.Crypto.SHA.sha256(byteArray);
97 is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')"); 96 is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')");
98 97
99 byteArray = new Clipperz.ByteArray("0xbd"); 98 byteArray = new Clipperz.ByteArray("0xbd");
100 hash = Clipperz.Crypto.SHA.sha256(byteArray); 99 hash = Clipperz.Crypto.SHA.sha256(byteArray);
101 is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')"); 100 is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')");
102 101
103 byteArray = new Clipperz.ByteArray("0x5fd4"); 102 byteArray = new Clipperz.ByteArray("0x5fd4");
104 hash = Clipperz.Crypto.SHA.sha256(byteArray); 103 hash = Clipperz.Crypto.SHA.sha256(byteArray);
105 is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')"); 104 is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')");
106 105
107 byteArray = new Clipperz.ByteArray("0xc98c8e55"); 106 byteArray = new Clipperz.ByteArray("0xc98c8e55");
108 hash = Clipperz.Crypto.SHA.sha256(byteArray); 107 hash = Clipperz.Crypto.SHA.sha256(byteArray);
109 is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')"); 108 is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')");
110 109
111 byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd"); 110 byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd");
112 hash = Clipperz.Crypto.SHA.sha256(byteArray); 111 hash = Clipperz.Crypto.SHA.sha256(byteArray);
113 is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')"); 112 is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')");
114 113
115 byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4"); 114 byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4");
116 hash = Clipperz.Crypto.SHA.sha256(byteArray); 115 hash = Clipperz.Crypto.SHA.sha256(byteArray);
117 is(hash.toHexString(), 116 is(hash.toHexString(),
118 "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c", 117 "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c",
119 "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')"); 118 "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')");
120 119
121 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); 120 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb");
122 hash = Clipperz.Crypto.SHA.sha256(byteArray); 121 hash = Clipperz.Crypto.SHA.sha256(byteArray);
123 is(hash.toHexString(), 122 is(hash.toHexString(),
124 "0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d", 123 "0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d",
125 "sha256('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb')"); 124 "sha256('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb')");
126 125
127 byteArray = new Clipperz.ByteArray("0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a"); 126 byteArray = new Clipperz.ByteArray("0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a");
128 hash = Clipperz.Crypto.SHA.sha256(byteArray); 127 hash = Clipperz.Crypto.SHA.sha256(byteArray);
129 is(hash.toHexString(), 128 is(hash.toHexString(),
130 "0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3", 129 "0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3",
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
index d0ee153..ba842a9 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
@@ -1,93 +1,92 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
37 36
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
44</head> 43</head>
45<body> 44<body>
46<pre id="test"> 45<pre id="test">
47<script type="text/javascript"> 46<script type="text/javascript">
48hashString = function(aValue) { 47hashString = function(aValue) {
49 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2) 48 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2)
50} 49}
51try { 50try {
52 varusername; 51 varusername;
53 varpassphrase; 52 varpassphrase;
54 53
55 var C; 54 var C;
56 var P; 55 var P;
57 var encryptedText_1; 56 var encryptedText_1;
58 var encryptedText_2; 57 var encryptedText_2;
59 varsalt; 58 varsalt;
60 varx; 59 varx;
61 var v; 60 var v;
62 var v1; 61 var v1;
63 62
64 username = "giulio.cesare"; 63 username = "giulio.cesare";
65 passphrase = "trustno1"; 64 passphrase = "trustno1";
66 65
67 C = hashString(username); 66 C = hashString(username);
68 is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C"); 67 is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C");
69 68
70 P = hashString(passphrase + username); 69 P = hashString(passphrase + username);
71 is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P"); 70 is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P");
72 71
73 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988"; 72 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988";
74 73
75 x = hashString(salt + P); 74 x = hashString(salt + P);
76 is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x"); 75 is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x");
77 76
78 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); 77 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
79 is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v"); 78 is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v");
80 is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)"); 79 is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)");
81 80
82 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 81 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
83 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 82 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
84 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result"); 83 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result");
85 84
86 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
87 86
88 username = "giulio.cesare.debug"; 87 username = "giulio.cesare.debug";
89 passphrase = "trustno1"; 88 passphrase = "trustno1";
90 89
91 C = hashString(username); 90 C = hashString(username);
92 is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C"); 91 is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C");
93 92
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
index 8920915..4e7ad3d 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
@@ -1,95 +1,94 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.Crypto.Usage - TEST</title> 28 <title>Clipperz.Crypto.Usage - TEST</title>
29 29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
34 33
35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
36 35
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 41
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 45
47</head> 46</head>
48<body> 47<body>
49<pre id="test"> 48<pre id="test">
50<script type="text/javascript"> 49<script type="text/javascript">
51Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 50Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
52 51
53MochiKit.Base.update(Clipperz, { 52MochiKit.Base.update(Clipperz, {
54 'PM': { 53 'PM': {
55 'Crypto': { 54 'Crypto': {
56 'passwordEntropy': function(aValue) { 55 'passwordEntropy': function(aValue) {
57 var result; 56 var result;
58 varbitPerChar; 57 varbitPerChar;
59 58
60 bitPerChar = 4; 59 bitPerChar = 4;
61 if (/[a-z]/.test(aValue)) { 60 if (/[a-z]/.test(aValue)) {
62 bitPerChar ++; 61 bitPerChar ++;
63 } 62 }
64 if (/[A-Z]/.test(aValue)) { 63 if (/[A-Z]/.test(aValue)) {
65 bitPerChar ++; 64 bitPerChar ++;
66 } 65 }
67 if (/[^a-zA-Z0-9]/.test(aValue)) { 66 if (/[^a-zA-Z0-9]/.test(aValue)) {
68 bitPerChar ++; 67 bitPerChar ++;
69 } 68 }
70 //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar); 69 //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar);
71 70
72 result = aValue.length * bitPerChar; 71 result = aValue.length * bitPerChar;
73 72
74 return result; 73 return result;
75 } 74 }
76 } 75 }
77 } 76 }
78}) 77})
79 78
80try { 79try {
81 var keyValue; 80 var keyValue;
82 var keyEntropy; 81 var keyEntropy;
83 varkey; 82 varkey;
84 var plainText; 83 var plainText;
85 var cypherText; 84 var cypherText;
86 var randomBytes; 85 var randomBytes;
87 var hashedValue; 86 var hashedValue;
88 87
89 key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase")); 88 key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase"));
90 keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key); 89 keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key);
91 90
92 cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt")); 91 cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt"));
93 plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString(); 92 plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString();
94 is(plainText, "some text to encrypt"); 93 is(plainText, "some text to encrypt");
95 94
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.html b/frontend/gamma/tests/tests/Clipperz/PM/Date.html
index a606ca4..7b87185 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Date.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.html
@@ -1,56 +1,55 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.PM.Date - test</title> 28 <title>Clipperz.PM.Date - test</title>
29 29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <!-- script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script -->
32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
34 33
35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
36 35
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
43 42
44 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
47 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
48 47
49</head> 48</head>
50<body> 49<body>
51<pre id="test"> 50<pre id="test">
52 <script type="text/javascript" src="Date.test.js"></script> 51 <script type="text/javascript" src="Date.test.js"></script>
53</pre> 52</pre>
54 53
55</body> 54</body>
56</html> 55</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
index 8dc533f..8177285 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
@@ -1,62 +1,61 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.PM.Proxy - TEST</title> 28 <title>Clipperz.PM.Proxy - TEST</title>
29 29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
34 33
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
41 40
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
52 51
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
54 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 53 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
55 54
56</head> 55</head>
57<body> 56<body>
58<pre id="test"> 57<pre id="test">
59 <script type="text/javascript" src="Proxy.test.js"></script> 58 <script type="text/javascript" src="Proxy.test.js"></script>
60</pre> 59</pre>
61</body> 60</body>
62</html> 61</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
index 9baf167..6c2e000 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
@@ -1,59 +1,58 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.PM.Toll - test</title> 28 <title>Clipperz.PM.Toll - test</title>
29 29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
34 33
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
41 40
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
48 47
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
50 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 49 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
51 50
52</head> 51</head>
53<body> 52<body>
54<pre id="test"> 53<pre id="test">
55 <script type="text/javascript" src="Toll.test.js"></script> 54 <script type="text/javascript" src="Toll.test.js"></script>
56</pre> 55</pre>
57 56
58</body> 57</body>
59</html> 58</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
index 04f0e70..1eea01b 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
@@ -1,61 +1,60 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <title>Clipperz.PM.UI.Web.MainController - test</title> 28 <title>Clipperz.PM.UI.Web.MainController - test</title>
29 29
30 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../../../../js/JSLog/jslog.js"></script>
32 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css">
34 33
35 <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script>
40 <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 39 <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
41 40
42 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script> 41 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script>
43 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script> 42 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script>
44 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script> 43 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script>
45 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script> 44 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script> 45 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script>
47 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script> 46 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script>
48 47
49 <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script> 48 <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script>
50 49
51 <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script> 50 <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script>
52 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script> 51 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script>
53 52
54</head> 53</head>
55<body> 54<body>
56<pre id="test"> 55<pre id="test">
57 <script type="text/javascript" src="MainController.test.js"></script> 56 <script type="text/javascript" src="MainController.test.js"></script>
58</pre> 57</pre>
59 58
60</body> 59</body>
61</html> 60</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
index 87cde0f..b4500e3 100644
--- a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
+++ b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
@@ -1,93 +1,92 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24--> 24-->
25 25
26<html> 26<html>
27<head> 27<head>
28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../js/JSLog/jslog.js"></script>
30 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
32 31
33 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
34 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
36 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script>
37 36
38 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 37 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
39</head> 38</head>
40<body> 39<body>
41<pre id="test"> 40<pre id="test">
42<script type="text/javascript"> 41<script type="text/javascript">
43try { 42try {
44 var deferredResult; 43 var deferredResult;
45 varkeePassProcessor; 44 varkeePassProcessor;
46 45
47 keePassProcessor = new Clipperz.KeePassExportProcessor(); 46 keePassProcessor = new Clipperz.KeePassExportProcessor();
48 47
49 deferredResult = new MochiKit.Async.Deferred(); 48 deferredResult = new MochiKit.Async.Deferred();
50 49
51 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" }); 50 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" });
52 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 51 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
53 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); }); 52 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); });
54 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 53 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
55 54
56 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); 55 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
57 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 56 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
58 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); }); 57 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); });
59 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 58 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
60 59
61 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); 60 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
62 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 61 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
63 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); }); 62 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); });
64 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 63 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
65 64
66 65
67 66
68 deferredResult.addBoth(SimpleTest.finish); 67 deferredResult.addBoth(SimpleTest.finish);
69 deferredResult.callback(); 68 deferredResult.callback();
70 69
71/* 70/*
72 var set; 71 var set;
73 varobject1; 72 varobject1;
74 varobject2; 73 varobject2;
75 var object3; 74 var object3;
76 75
77 set = new Clipperz.Set(); 76 set = new Clipperz.Set();
78 77
79 object1 = new Object(); 78 object1 = new Object();
80 object2 = new Object(); 79 object2 = new Object();
81 object3 = new Object(); 80 object3 = new Object();
82 81
83 object1.label = "object 1"; 82 object1.label = "object 1";
84 object2.label = "object 2"; 83 object2.label = "object 2";
85 object3.label = "object 3"; 84 object3.label = "object 3";
86 85
87 is(set.size(), 0, "A new set should be empty"); 86 is(set.size(), 0, "A new set should be empty");
88 87
89 set.add(object1); 88 set.add(object1);
90 is(set.size(), 1); 89 is(set.size(), 1);
91 is(set.contains(object1), true); 90 is(set.contains(object1), true);
92 is(set.contains(object2), false); 91 is(set.contains(object2), false);
93 92
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
index 2d502b4..64f9e4d 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
@@ -40,75 +40,73 @@ refer to http://www.clipperz.com.
40 40
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 46
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 53
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 59
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
75 75
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
85 85
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
88 88
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
91 91
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
93 93
94 <script type='text/javascript' src='./User.data.js'></script> 94 <script type='text/javascript' src='./User.data.js'></script>
95 <script type='text/javascript' src='./cardDialogNew_test.js'></script> 95 <script type='text/javascript' src='./cardDialogNew_test.js'></script>
96<script> 96<script>
97 Clipperz_IEisBroken = false; 97 Clipperz_IEisBroken = false;
98</script> 98</script>
99 99
100<!--[if IE]><script> 100<!--[if IE]><script>
101Clipperz_IEisBroken = true; 101Clipperz_IEisBroken = true;
102</script><![endif]--> 102</script><![endif]-->
103 103
104 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 104 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" />
105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
107 105
108</head> 106</head>
109<body> 107<body>
110 108
111<div id="tableWrapper"></div> 109<div id="tableWrapper"></div>
112 110
113</body> 111</body>
114</html> 112</html>
diff --git a/frontend/gamma/tests/tests/Components/Tooltips/index.html b/frontend/gamma/tests/tests/Components/Tooltips/index.html
index 02c6c34..3772227 100644
--- a/frontend/gamma/tests/tests/Components/Tooltips/index.html
+++ b/frontend/gamma/tests/tests/Components/Tooltips/index.html
@@ -38,103 +38,101 @@ refer to http://www.clipperz.com.
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 40
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 46
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 53
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 59
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
75 75
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
84 84
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
87 87
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
90 90
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
92 92
93 <script type='text/javascript' src='./tooltips_test.js'></script> 93 <script type='text/javascript' src='./tooltips_test.js'></script>
94<script> 94<script>
95 Clipperz_IEisBroken = false; 95 Clipperz_IEisBroken = false;
96</script> 96</script>
97 97
98<!--[if IE]><script> 98<!--[if IE]><script>
99Clipperz_IEisBroken = true; 99Clipperz_IEisBroken = true;
100</script><![endif]--> 100</script><![endif]-->
101 101
102 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 102 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" />
103 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
104 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
105 103
106<style> 104<style>
107 105
108div.leftColumn { 106div.leftColumn {
109 float:left; 107 float:left;
110} 108}
111 109
112div.rightColumn { 110div.rightColumn {
113 float:left; 111 float:left;
114} 112}
115 113
116div.boxWrapper { 114div.boxWrapper {
117 padding: 70px 200px; 115 padding: 70px 200px;
118} 116}
119 117
120div.box { 118div.box {
121 width: 100px; 119 width: 100px;
122 height: 30px; 120 height: 30px;
123 border: 1px solid red; 121 border: 1px solid red;
124} 122}
125</style> 123</style>
126 124
127</head> 125</head>
128<body> 126<body>
129 127
130<div class="leftColumn"> 128<div class="leftColumn">
131 <div class="boxWrapper"><div id="ABOVE" class="box">above</div></div> 129 <div class="boxWrapper"><div id="ABOVE" class="box">above</div></div>
132 <div class="boxWrapper"><div id="BELOW" class="box">below</div></div> 130 <div class="boxWrapper"><div id="BELOW" class="box">below</div></div>
133</div> 131</div>
134<div class="rightColumn"> 132<div class="rightColumn">
135 <div class="boxWrapper"><div id="LEFT" class="box">left</div></div> 133 <div class="boxWrapper"><div id="LEFT" class="box">left</div></div>
136 <div class="boxWrapper"><div id="RIGHT" class="box">right</div></div> 134 <div class="boxWrapper"><div id="RIGHT" class="box">right</div></div>
137</div> 135</div>
138 136
139</body> 137</body>
140</html> 138</html>