summaryrefslogtreecommitdiff
path: root/frontend/gamma
Unidiff
Diffstat (limited to 'frontend/gamma') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/css/mobile.css2571
-rw-r--r--frontend/gamma/css/static.css166
-rw-r--r--frontend/gamma/css/web.css4093
-rw-r--r--frontend/gamma/html/exit_template.html (renamed from frontend/gamma/html/exitPage_template.html)0
-rw-r--r--frontend/gamma/html/index_template.html10
-rw-r--r--frontend/gamma/html/mobile.appcache24
-rw-r--r--frontend/gamma/html/mobile_template.html86
-rw-r--r--frontend/gamma/images/old/alert/alert.pngbin0 -> 3927 bytes
-rw-r--r--frontend/gamma/images/old/alert/body.pngbin0 -> 309 bytes
-rw-r--r--frontend/gamma/images/old/alert/footer.pngbin0 -> 1685 bytes
-rw-r--r--frontend/gamma/images/old/alert/header.pngbin0 -> 1336 bytes
-rw-r--r--frontend/gamma/images/old/bookmarklet/placeholder.pngbin0 -> 4280 bytes
-rw-r--r--frontend/gamma/images/old/bookmarklet/placeholder_icon.pngbin0 -> 4681 bytes
-rw-r--r--frontend/gamma/images/old/bookmarklet/placeholder_selected.pngbin0 -> 4287 bytes
-rw-r--r--frontend/gamma/images/old/bookmarklet/placeholder_selected_icon.pngbin0 -> 4651 bytes
-rw-r--r--frontend/gamma/images/old/button/clicked_left.pngbin0 -> 3670 bytes
-rw-r--r--frontend/gamma/images/old/button/clicked_main.pngbin0 -> 4626 bytes
-rw-r--r--frontend/gamma/images/old/button/default_left.pngbin0 -> 3648 bytes
-rw-r--r--frontend/gamma/images/old/button/default_main.pngbin0 -> 5370 bytes
-rw-r--r--frontend/gamma/images/old/button/hover_left.pngbin0 -> 3666 bytes
-rw-r--r--frontend/gamma/images/old/button/hover_main.pngbin0 -> 5541 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/addDirectLogin_background.pngbin0 -> 7658 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/addDirectLogin_disabled_background.pngbin0 -> 7673 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/back.pngbin0 -> 15875 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/back_selected.pngbin0 -> 10368 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/background_body.pngbin0 -> 3730 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/background_footer.pngbin0 -> 6155 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/background_header.pngbin0 -> 5289 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/dottedLine_background.pngbin0 -> 938 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/fieldTypes/email.pngbin0 -> 7819 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/fieldTypes/email_selected.pngbin0 -> 7694 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/fieldTypes/password.pngbin0 -> 7636 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/fieldTypes/passwordTooltip.pngbin0 -> 13016 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/fieldTypes/password_selected.pngbin0 -> 7599 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/fieldTypes/url.pngbin0 -> 7708 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/fieldTypes/url_selected.pngbin0 -> 7710 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/loading.gifbin0 -> 10819 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/lock_closed.pngbin0 -> 3707 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/lock_open.pngbin0 -> 3703 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/openDirectLogin.pngbin0 -> 7751 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/openDirectLogin_selected.pngbin0 -> 7775 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/password_background.pngbin0 -> 6114 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/tabs_background.pngbin0 -> 994 bytes
-rw-r--r--frontend/gamma/images/old/cardDialog/tabs_shadow.pngbin0 -> 982 bytes
-rw-r--r--frontend/gamma/images/old/creatingUser.gifbin0 -> 3208 bytes
-rw-r--r--frontend/gamma/images/old/delete_background.pngbin0 -> 3635 bytes
-rw-r--r--frontend/gamma/images/old/delete_background_left.pngbin0 -> 3494 bytes
-rw-r--r--frontend/gamma/images/old/directLink_background.pngbin0 -> 3736 bytes
-rw-r--r--frontend/gamma/images/old/directLink_background_left.pngbin0 -> 3459 bytes
-rw-r--r--frontend/gamma/images/old/directLink_no_background.pngbin0 -> 3585 bytes
-rw-r--r--frontend/gamma/images/old/directLogins_background.pngbin0 -> 6748 bytes
-rw-r--r--frontend/gamma/images/old/directLogins_background_bottom.pngbin0 -> 3570 bytes
-rw-r--r--frontend/gamma/images/old/filter/clearFilter_notSelected.pngbin0 -> 3784 bytes
-rw-r--r--frontend/gamma/images/old/filter/clearFilter_selected.pngbin0 -> 3984 bytes
-rw-r--r--frontend/gamma/images/old/flags/br.pngbin0 -> 7654 bytes
-rw-r--r--frontend/gamma/images/old/flags/cn.pngbin0 -> 6412 bytes
-rw-r--r--frontend/gamma/images/old/flags/de.pngbin0 -> 6029 bytes
-rw-r--r--frontend/gamma/images/old/flags/en.pngbin0 -> 8563 bytes
-rw-r--r--frontend/gamma/images/old/flags/es.pngbin0 -> 6909 bytes
-rw-r--r--frontend/gamma/images/old/flags/it.pngbin0 -> 5794 bytes
-rw-r--r--frontend/gamma/images/old/flags/jp.pngbin0 -> 5557 bytes
-rw-r--r--frontend/gamma/images/old/flags/ru.pngbin0 -> 5808 bytes
-rw-r--r--frontend/gamma/images/old/footer/star.pngbin0 -> 2542 bytes
-rw-r--r--frontend/gamma/images/old/home/box/box_body.pngbin0 -> 868 bytes
-rw-r--r--frontend/gamma/images/old/home/box/box_bottom.pngbin0 -> 811 bytes
-rw-r--r--frontend/gamma/images/old/home/box/box_top.pngbin0 -> 796 bytes
-rw-r--r--frontend/gamma/images/old/home/download.pngbin0 -> 1990 bytes
-rw-r--r--frontend/gamma/images/old/home/features/bullet.pngbin0 -> 866 bytes
-rw-r--r--frontend/gamma/images/old/home/look.pngbin0 -> 2736 bytes
-rw-r--r--frontend/gamma/images/old/home/register.pngbin0 -> 14113 bytes
-rw-r--r--frontend/gamma/images/old/home/register_selected.pngbin0 -> 14205 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/backButton.pngbin0 -> 816 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/icon.pngbin0 -> 4186 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/listArrow.pngbin0 -> 259 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/locked.pngbin0 -> 407 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/logo_and_header.pngbin0 -> 11666 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/password_background.pngbin0 -> 6114 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/pinstripes.pngbin0 -> 117 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/thumb.pngbin0 -> 2835 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/toggle.pngbin0 -> 2815 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/toggleOn.pngbin0 -> 163 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/toolbar.pngbin0 -> 171 bytes
-rw-r--r--frontend/gamma/images/old/iPhone/whiteButton.pngbin0 -> 978 bytes
-rw-r--r--frontend/gamma/images/old/loading/loadingBar.gifbin0 -> 2721 bytes
-rw-r--r--frontend/gamma/images/old/loading/loadingBarProgress.pngbin0 -> 624 bytes
-rw-r--r--frontend/gamma/images/old/loading/news.gifbin0 -> 673 bytes
-rw-r--r--frontend/gamma/images/old/lock/background_star.pngbin0 -> 19897 bytes
-rw-r--r--frontend/gamma/images/old/lock/locked.pngbin0 -> 407 bytes
-rw-r--r--frontend/gamma/images/old/lock/locked_hover.pngbin0 -> 447 bytes
-rw-r--r--frontend/gamma/images/old/lock/unlocked.pngbin0 -> 431 bytes
-rw-r--r--frontend/gamma/images/old/lock/unlocked_hover.pngbin0 -> 452 bytes
-rw-r--r--frontend/gamma/images/old/logo.pngbin0 -> 8635 bytes
-rw-r--r--frontend/gamma/images/old/logo_blue.pngbin0 -> 6812 bytes
-rw-r--r--frontend/gamma/images/old/main/blocks/cardGridBackground.pngbin0 -> 7872 bytes
-rw-r--r--frontend/gamma/images/old/main/blocks/cardGridStripes.pngbin0 -> 122 bytes
-rw-r--r--frontend/gamma/images/old/main/blocks/directLoginGridBackground.pngbin0 -> 7923 bytes
-rw-r--r--frontend/gamma/images/old/main/blocks/directLoginGridStripes.pngbin0 -> 122 bytes
-rw-r--r--frontend/gamma/images/old/main/blocks/otherPanelBackground.pngbin0 -> 10595 bytes
-rw-r--r--frontend/gamma/images/old/main/blocks/otherPanelBackground_selected.pngbin0 -> 5285 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/ascending.pngbin0 -> 3647 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/createNewCardSplash.pngbin0 -> 11694 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/createNewCardSplash_selected.pngbin0 -> 11942 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/descending.pngbin0 -> 3637 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/directLogins/ascending.pngbin0 -> 3623 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/directLogins/descending.pngbin0 -> 3632 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/directLogins/unsorted.pngbin0 -> 3632 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/favicon.pngbin0 -> 411 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/running_search.gifbin0 -> 1737 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/search.pngbin0 -> 4275 bytes
-rw-r--r--frontend/gamma/images/old/main/grid/unsorted.pngbin0 -> 3660 bytes
-rw-r--r--frontend/gamma/images/old/main/messageBoxBackground.pngbin0 -> 4128 bytes
-rw-r--r--frontend/gamma/images/old/main/messageBoxCloseButton.pngbin0 -> 4101 bytes
-rw-r--r--frontend/gamma/images/old/main/messageBoxCloseButtonActive.pngbin0 -> 4188 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/cardsBackground.pngbin0 -> 9048 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/directLoginBackground.pngbin0 -> 8538 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/groupsBackground.pngbin0 -> 5061 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/itemsBackground.pngbin0 -> 7184 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/selectionHighligher.pngbin0 -> 3877 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/selectionHighligherGray copy.pngbin0 -> 3858 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/selectionHighligherGray.pngbin0 -> 3853 bytes
-rw-r--r--frontend/gamma/images/old/main/tabs/tagsBackground.pngbin0 -> 5385 bytes
-rw-r--r--frontend/gamma/images/old/main/userInfoBackground.pngbin0 -> 17374 bytes
-rw-r--r--frontend/gamma/images/old/main/userInfoBullet.pngbin0 -> 3609 bytes
-rw-r--r--frontend/gamma/images/old/new_background.pngbin0 -> 3611 bytes
-rw-r--r--frontend/gamma/images/old/new_background_left.pngbin0 -> 3482 bytes
-rw-r--r--frontend/gamma/images/old/note.pngbin0 -> 4323 bytes
-rw-r--r--frontend/gamma/images/old/passwordField/background copy.pngbin0 -> 232793 bytes
-rw-r--r--frontend/gamma/images/old/passwordField/background.pngbin0 -> 145979 bytes
-rw-r--r--frontend/gamma/images/old/ruler/exit.pngbin0 -> 7291 bytes
-rw-r--r--frontend/gamma/images/old/ruler/exit_selected.pngbin0 -> 7521 bytes
-rw-r--r--frontend/gamma/images/old/ruler/marker.pngbin0 -> 7599 bytes
-rw-r--r--frontend/gamma/images/old/ruler/next.pngbin0 -> 8074 bytes
-rw-r--r--frontend/gamma/images/old/ruler/previous.pngbin0 -> 8212 bytes
-rw-r--r--frontend/gamma/images/old/ruler/ruler.pngbin0 -> 43016 bytes
-rw-r--r--frontend/gamma/images/old/ruler/small_next.pngbin0 -> 7229 bytes
-rw-r--r--frontend/gamma/images/old/ruler/small_next_disabled.pngbin0 -> 7281 bytes
-rw-r--r--frontend/gamma/images/old/ruler/small_next_selected.pngbin0 -> 7441 bytes
-rw-r--r--frontend/gamma/images/old/ruler/small_previous.pngbin0 -> 7266 bytes
-rw-r--r--frontend/gamma/images/old/ruler/small_previous_disabled.pngbin0 -> 7278 bytes
-rw-r--r--frontend/gamma/images/old/ruler/small_previous_selected.pngbin0 -> 7449 bytes
-rw-r--r--frontend/gamma/images/old/tabPanels/background.pngbin0 -> 1118 bytes
-rw-r--r--frontend/gamma/images/old/tips/Tips_background.pngbin0 -> 5912 bytes
-rw-r--r--frontend/gamma/images/old/tips/close.pngbin0 -> 3448 bytes
-rw-r--r--frontend/gamma/images/old/tips/open.pngbin0 -> 3441 bytes
-rw-r--r--frontend/gamma/images/old/tooltips/body.pngbin0 -> 5461 bytes
-rw-r--r--frontend/gamma/images/old/tooltips/body_bottom.pngbin0 -> 3546 bytes
-rw-r--r--frontend/gamma/images/old/tooltips/bottom_arrow.pngbin0 -> 3660 bytes
-rw-r--r--frontend/gamma/images/old/tooltips/left_arrow.pngbin0 -> 3725 bytes
-rw-r--r--frontend/gamma/images/old/tooltips/right_arrow.pngbin0 -> 3703 bytes
-rw-r--r--frontend/gamma/images/old/tooltips/top_arrow.pngbin0 -> 3647 bytes
-rw-r--r--frontend/gamma/js/Clipperz/Async.js4
-rw-r--r--frontend/gamma/js/Clipperz/Base.js5
-rw-r--r--frontend/gamma/js/Clipperz/PM/Connection.js34
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.js20
-rw-r--r--frontend/gamma/js/Clipperz/PM/PIN.js134
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js65
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js4
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js34
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js34
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js299
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js (renamed from frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js)111
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js356
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js393
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js17
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js18
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js14
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js8
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js31
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js163
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js178
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js369
-rw-r--r--frontend/gamma/js/main.mobile.js (renamed from frontend/gamma/js/main_iPhone.js)13
-rw-r--r--frontend/gamma/properties/creditsAndCopyrights.txt346
-rw-r--r--frontend/gamma/properties/gamma.properties.json4
-rw-r--r--frontend/gamma/properties/mobile.properties.json53
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/PIN.html66
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js97
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/index.html1
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/User.data.js4
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/index.html61
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/main_test.js111
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/mobile.index.html204
182 files changed, 7908 insertions, 2293 deletions
diff --git a/frontend/gamma/css/mobile.css b/frontend/gamma/css/mobile.css
new file mode 100644
index 0000000..8c4c1bf
--- a/dev/null
+++ b/frontend/gamma/css/mobile.css
@@ -0,0 +1,2571 @@
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/*
27
28Color list:
29- login box:
30 light#ff9955
31 dark#ff6622
32- login button:
33 regular#dd5500
34 hover#773311
35- login translations:
36 box: #cc6622;
37 not-selected:
38 color: #ddaa99
39 background:#994422
40 selected: #772211;
41*/
42html {
43 height: 100%;
44 -webkit-text-size-adjust: none;
45 -ms-text-size-adjust: none;
46}
47body {
48 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
49 margin: 0px;
50}
51.ellipsis {
52 text-overflow: ellipsis;
53 overflow: hidden;
54 white-space: nowrap;
55}
56/**
57 * Background noise recipe
58 *
59 * This recipe use a sass function to generate a .png file
60 *
61 * Inspired by a jQuery plugin "Noisy" by Daniel Rapp @DanielRapp
62 * @link https://github.com/DanielRapp/Noisy
63 *
64 * Converted using Sass by Aaron Russell @aaronrussell & Philipp Bosch @philippbosch
65 * @link https://gist.github.com/1021332
66 *
67 * Ported to a sass gem by Antti Salonen @antsa
68 * @link https://github.com/antsa/sassy_noise
69 *
70 * Mixin: background-noise
71 * Function: background_noise
72 *
73 * @author Daniel Rapp @DanielRapp
74 * @author Aaron Russell @aaronrussell
75 * @author Philipp Bosch @philippbosch
76 * @author Antti Salonen @antsa
77 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
78 */
79/**
80 *
81 * @class Gradients
82 * @author David Kaneda http://www.davidkaneda.com/
83 *
84 */
85/**
86 * Adds a background gradient into a specified selector.
87 *
88 * @include background-gradient(#444, 'glossy');
89 *
90 * You can also use color-stops if you want full control of the gradient:
91 *
92 * @include background-gradient(#444, color-stops(#333, #222, #111));
93 *
94 * @param {color} $bg-color
95 * The base color of the gradient.
96 *
97 * @param {string/list} $type
98 * The style of the gradient, one of five pre-defined options: matte, bevel, glossy, recessed, or linear:
99 *
100 * @include background-gradient(red, 'glossy');
101 *
102 * It can also accept a list of color-stop values:;
103 *
104 * @include background-gradient(black, color-stops(#333, #111, #000));
105 *
106 * @param {string} $direction
107 * The direction of the gradient.
108 */
109/**
110 * Blueprint grid background pattern
111 *
112 * @link http://lea.verou.me/css3patterns/#blueprint-grid
113 *
114 * @author Lea Verou http://lea.verou.me/ for the original pattern
115 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx for the sass mixin
116 */
117/**
118 * Background overlay inspired by Google Chrome modal overlay
119 *
120 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
121 */
122/**
123 * Striped background pattern
124 *
125 * @link http://lea.verou.me/css3patterns/
126 *
127 * @author Lea Verou http://lea.verou.me/ for the original pattern
128 * @author David Kaneda http://www.davidkaneda.com @davidkaneda for the sass mixin
129 */
130/**
131 *
132 * Before compass 0.11.5, you need to add
133 * Compass::BrowserSupport.add_support("repeating-linear-gradient", "webkit", "moz", "o", "ms")
134 * To your configuration (config.rb)
135 * @see https://github.com/chriseppstein/compass/issues/401
136 *
137 * @link http://lea.verou.me/css3patterns/#tartan
138 *
139 * @author Marta Armada http://swwweet.com/ for the original pattern
140 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx for the sass mixin
141 */
142/**
143 * Carbon Fiber background pattern
144 *
145 * @author Lea Verou http://lea.verou.me/ for the original pattern
146 * @author David Kaneda http://www.davidkaneda.com/ for the Sass mixin
147 *
148 * @link http://lea.verou.me/css3patterns/
149 *
150 */
151/**
152 * Normalize.css
153 * Opposite approche from CSS reset
154 *
155 * Based on normalize.css commit 9576d48fc234c5224b1fc4dccba2f5965243843d
156 *
157 * @link http://github.com/necolas/normalize.css
158 */
159/* normalize.css 2011-07-12T10:51 UTC · http://github.com/necolas/normalize.css */
160/* =============================================================================
161 HTML5 element display
162 ========================================================================== */
163/* =============================================================================
164 Base
165 ========================================================================== */
166/* =============================================================================
167 Links
168 ========================================================================== */
169/* =============================================================================
170 Typography
171 ========================================================================== */
172/* =============================================================================
173 Lists
174 ========================================================================== */
175/* =============================================================================
176 Embedded content
177 ========================================================================== */
178/* =============================================================================
179 Figures
180 ========================================================================== */
181/* =============================================================================
182 Forms
183 ========================================================================== */
184/* =============================================================================
185 Tables
186 ========================================================================== */
187/**
188 *
189 * @author David Kaneda - http://www.davidkaneda.com
190 *
191 */
192/**
193 * @class Color
194 */
195/**
196 * Returns the brightness (out of 100) of a specified color.
197 * @todo explain why this is useful
198 * @param {color} $color The color you want the brightness value of
199 * @return {measurement}
200 */
201/**
202 * Returns the luminosity for a specified color
203 * @todo explain why this is useful
204 * @param {color} The color to check
205 * @return {measurement}
206 */
207/**
208 * Glass effect
209 * Use this on image for better effect render
210 *
211 * Inspired from Simurai's IMDB redisign
212 *
213 * @link http://lab.simurai.com/redesign/imdb
214 * @thanks Simurai @simurai
215 */
216/**
217 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
218 * IE8 need to have :before and not ::before
219 * So use only : and not :: if you want to support IE8
220 * IE9 Webkit Firefox Opera understand ::
221 */
222/**
223 * Scotch tape effect with pure CSS
224 *
225 * @thanks Nick La @nickla for original concept
226 * @link http://webdesignerwall.com/tutorials/css3-image-styles
227 *
228 * @author David Kaneda http://www.davidkaneda.com
229 *
230 */
231/**
232 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
233 * IE8 need to have :before and not ::before
234 * So use only : and not :: if you want to support IE8
235 * IE9 Webkit Firefox Opera understand ::
236 */
237/**
238 * Corner folded with pure CSS
239 *
240 * Known support: Firefox 3.5+, Chrome 4+, Safari 4+, Opera 10+, IE 9+.
241 * IE8 is not supported because it not render properly box-shadow and
242 * pseudo element should be selected with ::element and not :element
243 *
244 * @thanks Nicolas Gallagher @necolas
245 * @link http://nicolasgallagher.com/pure-css-folded-corner-effect/demo/
246 * @todo Nix in .4
247 */
248/**
249 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
250 * IE8 need to have :before and not ::before
251 * So use only : and not :: if you want to support IE8
252 * IE9 Webkit Firefox Opera understand ::
253 */
254/**
255 * Corner folded with pure CSS
256 *
257 * Known support: Firefox 3.5+, Chrome 4+, Safari 4+, Opera 10+, IE 9+.
258 * IE8 is not supported because it not render properly box-shadow and
259 * pseudo element should be selected with ::element and not :element
260 *
261 * @thanks Nicolas Gallagher @necolas
262 * @link http://nicolasgallagher.com/pure-css-folded-corner-effect/demo/
263 */
264/**
265 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
266 * IE8 need to have :before and not ::before
267 * So use only : and not :: if you want to support IE8
268 * IE9 Webkit Firefox Opera understand ::
269 */
270/**
271 * Form element inline mixin
272 * This mixin allow you to have a label inline with your input
273 * It's simply based on inline-block behavior
274 *
275 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
276 */
277/**
278 * Vertical alignement for page
279 * Inspired by http://css-tricks.com/snippets/css/center-div-with-dynamic-height/
280 *
281 * Usage:
282 *
283 * SCSS
284 * @include vertical-align-requirement;
285 * .v-align-container { @include vertical-align-container }
286 * .v-align-content-container { @include vertical-align-content-container }
287 * .v-align-content { @include vertical-align-content }
288 *
289 * HTML
290 * <body>
291 * <div class="v-align-container">
292 * <div class="v-align-content-container">
293 * <div class="v-align-content">
294 * Your content !
295 * </div>
296 * </div>
297 * </div>
298 * </body>
299 *
300 * @thanks Chris Coyier @chriscoyier
301 * @autor Maxime Thirouin maxime.thirouin@gmail.com @MoOx
302 */
303/**
304 * Media Queries Mixins
305 *
306 * @todo Do we have to take care of print ?
307 *
308 * @require sass-3.2 (you need eventually to do "sudo gem install sass --pre")
309 * @author Maxime Thirouin <maxime.thirouin@gmail.com>
310 */
311/*
312$media-query-width-big: 1280px;
313$media-query-width-medium: 960px;
314$media-query-width-small: 480px;
315*/
316/**
317 * Drop shadow mixins from Nicolas Gallagher demo
318 *
319 * @thanks Nicolas Gallagher @necolas, @simurai, @cameronmoll, @matthamm
320 *
321 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
322 */
323/**
324 * Drop shadow curled
325 *
326 * @thanks Nicolas Gallagher @necolas
327 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
328 */
329/**
330 * Drop shadow curved
331 *
332 * @thanks Nicolas Gallagher @necolas
333 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
334 */
335/**
336 * Drop shadow flying
337 *
338 * @thanks Geoffrey Crofte @geoffrey_crofte
339 * @link http://www.creativejuiz.fr/trytotry/css3-box-shadow-after-before/
340 */
341/**
342 * Drop shadow w/ lifted corners
343 *
344 * @thanks Nicolas Gallagher @necolas
345 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
346 */
347/**
348 * Drop shadow w/ perspective
349 *
350 * @thanks Nicolas Gallagher @necolas
351 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
352 */
353/**
354 * Drop shadow raised
355 *
356 * @thanks Nicolas Gallagher @necolas
357 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
358 */
359/**
360 * Drop shadow rules required for transform on drop shadow
361 *
362 * /!\ This is required if you want to apply some transform on the element using drop shadow
363 *
364 * @thanks Nicolas Gallagher @necolas
365 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
366 */
367/**
368 * Shadow along the top edge of the browser viewport
369 *
370 * @link http://playground.genelocklin.com/depth/
371 */
372/**
373* Shapes !
374* Polygons, ellipses and symbols
375*
376* @thanks Chris Coyier @chriscoyier
377* @link http://css-tricks.com/examples/ShapesOfCSS/
378* @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
379*/
380/**
381 * Shape/Ellipse
382 *
383 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
384 */
385/**
386 * Shape/Polygon
387 *
388 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
389 */
390/**
391 * Shape/Polygon/Hexagon
392 *
393 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
394 */
395/**
396 * Shape/Polygon/Octagon
397 *
398 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
399 */
400/**
401 * Shape/Polygon/Parallelogram
402 *
403 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
404 */
405/**
406 * Shape/Polygon/Pentagon
407 *
408 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
409 */
410/**
411 * Shape/Polygon/Rectangle
412 *
413 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
414 */
415/**
416 * Shape/Polygon/Rhombus
417 *
418 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
419 */
420/**
421 * Shape/Polygon/Square
422 *
423 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
424 */
425/**
426 * Shape/Polygon/Star
427 *
428 * @todo check if setting a z-index by default is a good thing
429 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
430 */
431/**
432 * Shape/Polygon/Trapezoid
433 *
434 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
435 */
436/**
437 * Shape/Polygon/Triangle
438 *
439 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
440 */
441/**
442 * Shape/Symbol
443 *
444 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
445 */
446/**
447 * Shape/Symbol/Diamond
448 *
449 * @todo add height support
450 *
451 * @author Alexander Futekov
452 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
453 */
454/**
455 * Shape/Symbol/Egg
456 *
457 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
458 */
459/**
460 * Shape/Symbol/Heart
461 *
462 * @author Nicolas Gallagher @necolas
463 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
464 */
465/**
466 * Shape/Symbol/Infinity
467 *
468 * @author Nicolas Gallagher @necolas
469 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
470 */
471/**
472 * Shape/Symbol/Pacman
473 *
474 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
475 */
476/**
477 * Shape/Symbol/Yin-yang
478 *
479 * @author Alexander Futekov
480 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
481 */
482/**
483 * Micro clearfix hack
484 *
485 * The clearfix hack is a popular way to clear floats without resorting to using presentational markup. This article presents an update to the clearfix method that further reduces the amount of CSS required.
486 * Known support: Firefox 2+, Safari 2+, Chrome, Opera 9.27+, IE 6+, IE Mac.
487 *
488 * @thanks Nicolas Gallagher @necolas
489 * @link http://nicolasgallagher.com/micro-clearfix-hack/
490 */
491/**
492 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
493 * IE8 need to have :before and not ::before
494 * So use only : and not :: if you want to support IE8
495 * IE9 Webkit Firefox Opera understand ::
496 */
497/**
498 * UI convex effect from one color
499 *
500 * @todo merge with ui-button ?
501 *
502 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
503 */
504/**
505 * UI Glossy helper
506 *
507 * @deprecated
508 * @todo Remove in 0.4
509 * @see background/gradients
510 *
511 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
512 */
513/**
514 * UI simple gradient from one color
515 *
516 * @todo merge with ui-button ?
517 *
518 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
519 */
520/**
521 * Shape/Polygon/Triangle
522 *
523 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
524 */
525/**
526 * Keyboard key touch
527 * A simple stylesheet for rendering beautiful keyboard-style elements.
528
529 * @author Michael Hüneburg http://michaelhue.com/keyscss
530 * @link https://github.com/michaelhue/keyscss (commit 76bb603e921d0145362e0f60eabb79d4f69cbda0)
531 *
532 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
533*/
534/**
535 * Menu dropdown helper
536 *
537 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
538*/
539/**
540 * Ui background overlay inspired by Google Chrome modal overlay
541 *
542 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
543 */
544/**
545 * Background overlay inspired by Google Chrome modal overlay
546 *
547 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
548 */
549/**
550 * <hr /> separator style
551 *
552 * @author Chris Coyier @chriscoyier
553 * @link http://jsfiddle.net/chriscoyier/GaEzp/35/
554 *
555 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
556 */
557/**
558 * Micro clearfix hack
559 *
560 * The clearfix hack is a popular way to clear floats without resorting to using presentational markup. This article presents an update to the clearfix method that further reduces the amount of CSS required.
561 * Known support: Firefox 2+, Safari 2+, Chrome, Opera 9.27+, IE 6+, IE Mac.
562 *
563 * @thanks Nicolas Gallagher @necolas
564 * @link http://nicolasgallagher.com/micro-clearfix-hack/
565 */
566/**
567 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
568 * IE8 need to have :before and not ::before
569 * So use only : and not :: if you want to support IE8
570 * IE9 Webkit Firefox Opera understand ::
571 */
572/**
573 *
574 * @class Gradients
575 * @author David Kaneda http://www.davidkaneda.com/
576 *
577 */
578/**
579 * Adds a background gradient into a specified selector.
580 *
581 * @include background-gradient(#444, 'glossy');
582 *
583 * You can also use color-stops if you want full control of the gradient:
584 *
585 * @include background-gradient(#444, color-stops(#333, #222, #111));
586 *
587 * @param {color} $bg-color
588 * The base color of the gradient.
589 *
590 * @param {string/list} $type
591 * The style of the gradient, one of five pre-defined options: matte, bevel, glossy, recessed, or linear:
592 *
593 * @include background-gradient(red, 'glossy');
594 *
595 * It can also accept a list of color-stop values:;
596 *
597 * @include background-gradient(black, color-stops(#333, #111, #000));
598 *
599 * @param {string} $direction
600 * The direction of the gradient.
601 */
602/**
603 * @class Webfont Icon
604 * Great to use with the [Pictos font](http://pictos.drewwilson.com/)
605 *
606 */
607/**
608 * @cfg {color} $webfont-icon-base-color
609 * The default color of icons when using the {@link #webfont-icon} mixin.
610 *
611 * Defaults to `white`.
612 */
613/**
614 * @cfg {color} $webfont-icon-default-stroke
615 * The default color to use on the border of icons, when using the {@link #webfont-icon} mixin.
616 *
617 * Defaults to `null`.
618 */
619/**
620 * @cfg {string} $webfont-icon-default-gradient
621 * The default gradient to use when using the {@link #webfont-icon} mixin.
622 *
623 * Defaults to `matte`.
624 */
625/* line 41, ../compass-recipes/stylesheets/recipes/_webfont-icon.scss */
626.webfont-icon-base {
627 color: transparent;
628 -webkit-background-clip: text;
629 background-clip: text;
630 position: absolute;
631 top: 0;
632 left: 0;
633 text-indent: 0;
634 text-shadow: none;
635 -webkit-user-select: none;
636 user-select: none;
637}
638/**
639 * Includes a character into the specified selector, styled as an icon.
640 *
641 * @include webfont-icon('a');
642 *
643 * @param {color} $color
644 * The color of the icon. Defaults to {@link #$webfont-icon-default-background $webfont-icon-default-background}.
645 *
646 * @param {measurement} $size
647 * The size of the icon
648 *
649 * @param {color} $stroke
650 * The color of the border. Defautls to {@link #$webfont-icon-default-border $webfont-icon-default-border}.
651 *
652 * @param {boolean} $include-staes
653 * True to include states for hover and active. Defaults to `true`.
654 */
655/* line 1, ../scss/include/_base.scss */
656* {
657 margin: 0;
658 padding: 0;
659}
660/* line 6, ../scss/include/_base.scss */
661body {
662 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
663 -webkit-touch-callout: none;
664}
665/* line 11, ../scss/include/_base.scss */
666#jqt {
667 -webkit-text-size-adjust: none;
668 -webkit-user-select: none;
669 user-select: none;
670 font-family: "Helvetica Neue", Helvetica;
671 position: absolute;
672 right: 0;
673 top: 0;
674 left: 0;
675 bottom: 0;
676}
677/* line 21, ../scss/include/_base.scss */
678#jqt a {
679 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
680 -webkit-user-drag: none;
681}
682/* line 26, ../scss/include/_base.scss */
683#jqt .selectable,
684#jqt input,
685#jqt textarea {
686 -webkit-user-select: auto;
687}
688/* line 30, ../scss/include/_base.scss */
689#jqt.notransform {
690 -webkit-transform: none !important;
691}
692/* line 35, ../scss/include/_base.scss */
693#jqt > * {
694 display: block;
695 left: 0;
696 top: 0;
697 min-height: 100%;
698 width: 100%;
699 overflow-x: hidden;
700 position: absolute;
701 z-index: 0;
702 display: -webkit-box;
703 display: box;
704 -webkit-box-orient: vertical;
705 box-orient: vertical;
706 -webkit-box-flex: 1;
707 box-flex: 1;
708}
709/* line 49, ../scss/include/_base.scss */
710#jqt > .current {
711 z-index: 10;
712}
713/* line 53, ../scss/include/_base.scss */
714#jqt > :not(.current) {
715 display: none;
716}
717/* line 57, ../scss/include/_base.scss */
718#jqt.touchscroll:not(.animating3d) {
719 overflow-y: auto;
720 -webkit-overflow-scrolling: touch;
721}
722/* line 61, ../scss/include/_base.scss */
723#jqt.touchscroll:not(.animating3d) > * {
724 height: 100%;
725}
726/* line 64, ../scss/include/_base.scss */
727#jqt.touchscroll:not(.animating3d) .scroll {
728 position: relative;
729 -webkit-box-flex: 1;
730 box-flex: 1;
731 overflow-y: auto;
732 -webkit-overflow-scrolling: touch;
733}
734/* line 72, ../scss/include/_base.scss */
735#jqt .scroll {
736 -webkit-margin-collapse: separate;
737}
738/* line 76, ../scss/include/_base.scss */
739#jqt .in,
740#jqt .out {
741 -webkit-animation-duration: 250ms;
742 -webkit-animation-fill-mode: both;
743 -webkit-animation-timing-function: ease-in-out;
744}
745/* line 82, ../scss/include/_base.scss */
746#jqt .in {
747 z-index: 10;
748}
749/* line 85, ../scss/include/_base.scss */
750#jqt .in:after {
751 content: "";
752 position: absolute;
753 display: block;
754 top: 0;
755 left: 0;
756 bottom: 0;
757 right: 0;
758}
759/* line 94, ../scss/include/_base.scss */
760#jqt .out {
761 z-index: 0 !important;
762}
763/* line 98, ../scss/include/_base.scss */
764#jqt.supports3d {
765 -webkit-perspective: 1000;
766}
767/* line 101, ../scss/include/_base.scss */
768#jqt.supports3d > * {
769 -webkit-transform: translate3d(0, 0, 0) rotate(0) scale(1);
770}
771/* Fade */
772/* line 3, ../scss/include/_animations.scss */
773#jqt .fade.in {
774 -webkit-animation-name: fadeIn;
775}
776/* line 7, ../scss/include/_animations.scss */
777#jqt .fade.out {
778 z-index: 10;
779 -webkit-animation-name: fadeOut;
780}
781@-webkit-keyframes fadeIn {
782 /* line 13, ../scss/include/_animations.scss */
783 0% {
784 opacity: 0;
785 }
786 /* line 16, ../scss/include/_animations.scss */
787 100% {
788 opacity: 1;
789 }
790}
791@-webkit-keyframes fadeOut {
792 /* line 22, ../scss/include/_animations.scss */
793 0% {
794 opacity: 1;
795 }
796 /* line 25, ../scss/include/_animations.scss */
797 100% {
798 opacity: 1;
799 }
800}
801/* Disolve */
802/* line 34, ../scss/include/_animations.scss */
803#jqt .dissolve.in {
804 -webkit-animation-name: dissolveIn;
805}
806/* line 38, ../scss/include/_animations.scss */
807#jqt .dissolve.out {
808 -webkit-animation-name: dissolveOut;
809}
810@-webkit-keyframes dissolveIn {
811 /* line 43, ../scss/include/_animations.scss */
812 0% {
813 opacity: 0;
814 }
815 /* line 46, ../scss/include/_animations.scss */
816 100% {
817 opacity: 1;
818 }
819}
820@-webkit-keyframes dissolveOut {
821 /* line 52, ../scss/include/_animations.scss */
822 0% {
823 opacity: 1;
824 }
825 /* line 55, ../scss/include/_animations.scss */
826 100% {
827 opacity: 0;
828 }
829}
830/* #Popin' */
831/* line 64, ../scss/include/_animations.scss */
832#jqt .pop.in {
833 -webkit-animation-name: popIn;
834}
835/* line 68, ../scss/include/_animations.scss */
836#jqt .pop.out {
837 -webkit-animation-name: popOut;
838}
839@-webkit-keyframes popIn {
840 /* line 73, ../scss/include/_animations.scss */
841 0% {
842 -webkit-transform: scale(0.2);
843 opacity: 0;
844 }
845 /* line 77, ../scss/include/_animations.scss */
846 100% {
847 -webkit-transform: scale(1);
848 opacity: 1;
849 }
850}
851@-webkit-keyframes popOut {
852 /* line 84, ../scss/include/_animations.scss */
853 0% {
854 -webkit-transform: scale(1);
855 opacity: 1;
856 }
857 /* line 88, ../scss/include/_animations.scss */
858 100% {
859 -webkit-transform: scale(0.2);
860 opacity: 0;
861 }
862}
863/* Slide Left */
864/* line 98, ../scss/include/_animations.scss */
865#jqt .slideleft.in {
866 -webkit-animation-name: slideLeftIn;
867}
868/* line 102, ../scss/include/_animations.scss */
869#jqt .slideleft.out {
870 -webkit-animation-name: slideLeftOut;
871}
872@-webkit-keyframes slideLeftIn {
873 /* line 107, ../scss/include/_animations.scss */
874 0% {
875 -webkit-transform: translateX(100%);
876 }
877 /* line 110, ../scss/include/_animations.scss */
878 100% {
879 -webkit-transform: translateX(0);
880 }
881}
882@-webkit-keyframes slideLeftOut {
883 /* line 116, ../scss/include/_animations.scss */
884 0% {
885 -webkit-transform: translateX(0px);
886 }
887 /* line 119, ../scss/include/_animations.scss */
888 100% {
889 -webkit-transform: translateX(-100%);
890 }
891}
892/* Slide Right */
893/* line 128, ../scss/include/_animations.scss */
894#jqt .slideright.in {
895 -webkit-animation-name: slideRightIn;
896}
897/* line 132, ../scss/include/_animations.scss */
898#jqt .slideright.out {
899 -webkit-animation-name: slideRightOut;
900}
901@-webkit-keyframes slideRightIn {
902 /* line 137, ../scss/include/_animations.scss */
903 0% {
904 -webkit-transform: translateX(-100%);
905 }
906 /* line 140, ../scss/include/_animations.scss */
907 100% {
908 -webkit-transform: translateX(0);
909 }
910}
911@-webkit-keyframes slideRightOut {
912 /* line 146, ../scss/include/_animations.scss */
913 0% {
914 -webkit-transform: translateX(0);
915 }
916 /* line 149, ../scss/include/_animations.scss */
917 100% {
918 -webkit-transform: translateX(100%);
919 }
920}
921/* Slide Up */
922/* line 158, ../scss/include/_animations.scss */
923#jqt .slideup.in {
924 z-index: 10;
925 -webkit-animation-name: slideUpIn;
926}
927/* line 162, ../scss/include/_animations.scss */
928#jqt .slideup.out {
929 z-index: 0;
930 -webkit-animation-name: slideUpOut;
931}
932@-webkit-keyframes slideUpIn {
933 /* line 168, ../scss/include/_animations.scss */
934 0% {
935 -webkit-transform: translateY(100%);
936 }
937 /* line 171, ../scss/include/_animations.scss */
938 100% {
939 -webkit-transform: translateY(0);
940 }
941}
942@-webkit-keyframes slideUpOut {
943 /* line 177, ../scss/include/_animations.scss */
944 0% {
945 -webkit-transform: translateY(0);
946 }
947 /* line 180, ../scss/include/_animations.scss */
948 100% {
949 -webkit-transform: translateY(0);
950 }
951}
952/* Slide Down */
953/* line 189, ../scss/include/_animations.scss */
954#jqt .slidedown.in {
955 z-index: 0;
956 -webkit-animation-name: slideDownIn;
957}
958/* line 193, ../scss/include/_animations.scss */
959#jqt .slidedown.out {
960 z-index: 10;
961 -webkit-animation-name: slideDownOut;
962}
963@-webkit-keyframes slideDownIn {
964 /* line 199, ../scss/include/_animations.scss */
965 0% {
966 -webkit-transform: translateY(0);
967 }
968 /* line 202, ../scss/include/_animations.scss */
969 100% {
970 -webkit-transform: translateY(0);
971 }
972}
973@-webkit-keyframes slideDownOut {
974 /* line 208, ../scss/include/_animations.scss */
975 0% {
976 -webkit-transform: translateY(0);
977 }
978 /* line 211, ../scss/include/_animations.scss */
979 100% {
980 -webkit-transform: translateY(100%);
981 }
982}
983/* Flip Left */
984/* line 220, ../scss/include/_animations.scss */
985#jqt .flipleft {
986 -webkit-backface-visibility: hidden;
987}
988/* line 224, ../scss/include/_animations.scss */
989#jqt .flipleft.in {
990 -webkit-animation-name: flipLeftIn;
991}
992/* line 228, ../scss/include/_animations.scss */
993#jqt .flipleft.out {
994 -webkit-animation-name: flipLeftOut;
995}
996@-webkit-keyframes flipLeftIn {
997 /* line 233, ../scss/include/_animations.scss */
998 0% {
999 -webkit-transform: rotateY(180deg) scale(0.8);
1000 }
1001 /* line 236, ../scss/include/_animations.scss */
1002 100% {
1003 -webkit-transform: rotateY(0deg) scale(1);
1004 }
1005}
1006@-webkit-keyframes flipLeftOut {
1007 /* line 242, ../scss/include/_animations.scss */
1008 0% {
1009 -webkit-transform: rotateY(0deg) scale(1);
1010 }
1011 /* line 245, ../scss/include/_animations.scss */
1012 100% {
1013 -webkit-transform: rotateY(-180deg) scale(0.8);
1014 }
1015}
1016/* Flip Right */
1017/* line 254, ../scss/include/_animations.scss */
1018#jqt .flipright {
1019 -webkit-backface-visibility: hidden;
1020}
1021/* line 258, ../scss/include/_animations.scss */
1022#jqt .flipright.in {
1023 -webkit-animation-name: flipRightIn;
1024}
1025/* line 262, ../scss/include/_animations.scss */
1026#jqt .flipright.out {
1027 -webkit-animation-name: flipRightOut;
1028}
1029@-webkit-keyframes flipRightIn {
1030 /* line 267, ../scss/include/_animations.scss */
1031 0% {
1032 -webkit-transform: rotateY(-180deg) scale(0.8);
1033 }
1034 /* line 270, ../scss/include/_animations.scss */
1035 100% {
1036 -webkit-transform: rotateY(0deg) scale(1);
1037 }
1038}
1039@-webkit-keyframes flipRightOut {
1040 /* line 276, ../scss/include/_animations.scss */
1041 0% {
1042 -webkit-transform: rotateY(0deg) scale(1);
1043 }
1044 /* line 279, ../scss/include/_animations.scss */
1045 100% {
1046 -webkit-transform: rotateY(180deg) scale(0.8);
1047 }
1048}
1049/* Swap Right */
1050/* line 288, ../scss/include/_animations.scss */
1051#jqt .swapright {
1052 -webkit-animation-duration: .7s;
1053 -webkit-transform: perspective(800);
1054 -webkit-animation-timing-function: ease-out;
1055}
1056/* line 293, ../scss/include/_animations.scss */
1057#jqt .swapright.in {
1058 -webkit-animation-name: swapRightIn;
1059}
1060/* line 296, ../scss/include/_animations.scss */
1061#jqt .swapright.out {
1062 -webkit-animation-name: swapRightOut;
1063}
1064@-webkit-keyframes swapRightIn {
1065 /* line 301, ../scss/include/_animations.scss */
1066 0% {
1067 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(70deg);
1068 opacity: 0;
1069 }
1070 /* line 305, ../scss/include/_animations.scss */
1071 35% {
1072 -webkit-transform: translate3d(-180px, 0px, -400px) rotateY(20deg);
1073 opacity: 1;
1074 }
1075 /* line 309, ../scss/include/_animations.scss */
1076 100% {
1077 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1078 opacity: 1;
1079 }
1080}
1081@-webkit-keyframes swapRightOut {
1082 /* line 316, ../scss/include/_animations.scss */
1083 0% {
1084 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1085 opacity: 1;
1086 }
1087 /* line 320, ../scss/include/_animations.scss */
1088 35% {
1089 -webkit-transform: translate3d(180px, 0px, -400px) rotateY(-20deg);
1090 opacity: .5;
1091 }
1092 /* line 324, ../scss/include/_animations.scss */
1093 100% {
1094 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(-70deg);
1095 opacity: 0;
1096 }
1097}
1098/* Swap Left */
1099/* line 332, ../scss/include/_animations.scss */
1100#jqt .swapleft {
1101 -webkit-animation-duration: .7s;
1102 -webkit-transform: perspective(800);
1103 -webkit-animation-timing-function: ease-out;
1104}
1105/* line 337, ../scss/include/_animations.scss */
1106#jqt .swapleft.in {
1107 -webkit-animation-name: swapLeftIn;
1108}
1109/* line 340, ../scss/include/_animations.scss */
1110#jqt .swapleft.out {
1111 -webkit-animation-name: swapLeftOut;
1112}
1113@-webkit-keyframes swapLeftIn {
1114 /* line 345, ../scss/include/_animations.scss */
1115 0% {
1116 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(-70deg);
1117 opacity: 0;
1118 }
1119 /* line 349, ../scss/include/_animations.scss */
1120 35% {
1121 -webkit-transform: translate3d(180px, 0px, -400px) rotateY(-20deg);
1122 opacity: 1;
1123 }
1124 /* line 353, ../scss/include/_animations.scss */
1125 100% {
1126 opacity: 1;
1127 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1128 }
1129}
1130@-webkit-keyframes swapLeftOut {
1131 /* line 360, ../scss/include/_animations.scss */
1132 0% {
1133 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1134 opacity: 1;
1135 }
1136 /* line 364, ../scss/include/_animations.scss */
1137 35% {
1138 -webkit-transform: translate3d(-180px, 0px, -400px) rotateY(20deg);
1139 opacity: .5;
1140 }
1141 /* line 368, ../scss/include/_animations.scss */
1142 100% {
1143 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(70deg);
1144 opacity: 0;
1145 }
1146}
1147/* Cube Left */
1148/* line 382, ../scss/include/_animations.scss */
1149#jqt .cubeleft.in,
1150#jqt .cubeleft.out,
1151#jqt .cuberight.in,
1152#jqt .cuberight.out {
1153 -webkit-animation-duration: .6s;
1154 -webkit-transform: perspective(800);
1155}
1156/* line 389, ../scss/include/_animations.scss */
1157#jqt .cubeleft.in {
1158 -webkit-transform-origin: 0% 50%;
1159 -webkit-animation-name: cubeLeftIn;
1160}
1161/* line 394, ../scss/include/_animations.scss */
1162#jqt .cubeleft.out {
1163 -webkit-transform-origin: 100% 50%;
1164 -webkit-animation-name: cubeLeftOut;
1165}
1166@-webkit-keyframes cubeLeftIn {
1167 /* line 400, ../scss/include/_animations.scss */
1168 0% {
1169 -webkit-transform: rotateY(90deg) translateZ(320px);
1170 opacity: .5;
1171 }
1172 /* line 404, ../scss/include/_animations.scss */
1173 100% {
1174 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0);
1175 opacity: 1;
1176 }
1177}
1178@-webkit-keyframes cubeLeftOut {
1179 /* line 411, ../scss/include/_animations.scss */
1180 0% {
1181 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0);
1182 opacity: 1;
1183 }
1184 /* line 415, ../scss/include/_animations.scss */
1185 100% {
1186 -webkit-transform: rotateY(-90deg) translateZ(320px);
1187 opacity: .5;
1188 }
1189}
1190/* Cube Right */
1191/* line 423, ../scss/include/_animations.scss */
1192#jqt .cuberight.in {
1193 -webkit-transform-origin: 100% 50%;
1194 -webkit-animation-name: cubeRightIn;
1195}
1196/* line 428, ../scss/include/_animations.scss */
1197#jqt .cuberight.out {
1198 -webkit-transform-origin: 0% 50%;
1199 -webkit-animation-name: cubeRightOut;
1200}
1201@-webkit-keyframes cubeRightIn {
1202 /* line 434, ../scss/include/_animations.scss */
1203 0% {
1204 -webkit-transform: rotateY(-90deg) translateZ(320px);
1205 opacity: .5;
1206 }
1207 /* line 438, ../scss/include/_animations.scss */
1208 100% {
1209 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0);
1210 opacity: 1;
1211 }
1212}
1213@-webkit-keyframes cubeRightOut {
1214 /* line 445, ../scss/include/_animations.scss */
1215 0% {
1216 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0);
1217 opacity: 1;
1218 }
1219 /* line 449, ../scss/include/_animations.scss */
1220 100% {
1221 -webkit-transform: rotateY(90deg) translateZ(320px);
1222 opacity: .5;
1223 }
1224}
1225/* line 5, ../scss/include/_skeleton.scss */
1226body {
1227 background: black;
1228}
1229/* line 9, ../scss/include/_skeleton.scss */
1230.base-chevron,
1231#jqt ul li.arrow:after,
1232#jqt ul li.forward:after {
1233 content: '›';
1234 width: 22px;
1235 height: 100%;
1236 vertical-align: middle;
1237 font-size: 30px;
1238 line-height: 38px;
1239 font-family: Futura, "Futura Condensed", Helvetica, Arial, sans-serif;
1240 font-weight: bold;
1241 filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
1242 opacity: 0.6;
1243 position: absolute;
1244 right: 0;
1245 top: 0;
1246 pointer-events: none;
1247 z-index: 10;
1248}
1249/* line 26, ../scss/include/_skeleton.scss */
1250.base-flatlists,
1251#jqt ul.metal,
1252#jqt ul.edgetoedge,
1253#jqt ul.plastic {
1254 margin: 0;
1255 padding: 0;
1256 border-width: 0 0 0 1px;
1257 -webkit-border-radius: 0;
1258 border-radius: 0;
1259}
1260/* line 35, ../scss/include/_skeleton.scss */
1261#jqt h1,
1262#jqt h2 {
1263 font: bold 18px "Helvetica Neue", Helvetica;
1264 margin: 10px 20px 6px;
1265 color: #bbbcbe;
1266 text-shadow: #3c3d3e 0 -1px 0;
1267}
1268/* line 41, ../scss/include/_skeleton.scss */
1269#jqt .toolbar {
1270 -webkit-box-sizing: border-box;
1271 box-sizing: border-box;
1272 -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 6px;
1273 box-shadow: rgba(0, 0, 0, 0.4) 0 1px 6px;
1274 border-bottom: 1px solid black;
1275 z-index: 10;
1276 position: relative;
1277 padding: 10px;
1278 height: 44px;
1279}
1280/* line 52, ../scss/include/_skeleton.scss */
1281#jqt .toolbar > h1 {
1282 position: absolute;
1283 overflow: hidden;
1284 left: 50%;
1285 bottom: 9px;
1286 margin: 1px 0 0 -75px;
1287 width: 150px;
1288 font-size: 20px;
1289 font-weight: bold;
1290 line-height: 1.3em;
1291 text-align: center;
1292 text-overflow: ellipsis;
1293 white-space: nowrap;
1294 color: white;
1295 text-shadow: #161717 0 -1px 0;
1296}
1297/* line 71, ../scss/include/_skeleton.scss */
1298#jqt.black-translucent .toolbar {
1299 padding-top: 30px;
1300 height: 64px;
1301}
1302/* line 75, ../scss/include/_skeleton.scss */
1303#jqt.landscape .toolbar > h1 {
1304 margin-left: -125px;
1305 width: 250px;
1306}
1307/* line 80, ../scss/include/_skeleton.scss */
1308#jqt .button,
1309#jqt .back,
1310#jqt .cancel,
1311#jqt .add {
1312 position: absolute;
1313 overflow: hidden;
1314 width: auto;
1315 height: 30px;
1316 font-family: inherit;
1317 font-size: 12px;
1318 font-weight: bold;
1319 line-height: 30px;
1320 text-overflow: ellipsis;
1321 text-decoration: none;
1322 white-space: nowrap;
1323 background: none;
1324 bottom: 6px;
1325 right: 10px;
1326 margin: 0;
1327 padding: 0 10px;
1328 color: #e2e3e3;
1329 text-shadow: #000000 0 -1px 0;
1330 -webkit-box-shadow: rgba(255, 255, 255, 0.2) 0 1px 0, rgba(0, 0, 0, 0.2) 0 1px 2px inset;
1331 box-shadow: rgba(255, 255, 255, 0.2) 0 1px 0, rgba(0, 0, 0, 0.2) 0 1px 2px inset;
1332 border: 1px solid black;
1333 -webkit-border-radius: 5px;
1334 border-radius: 5px;
1335 background-image: none;
1336 background-color: #0a0a0a;
1337 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2f3031), color-stop(50%, #161717), color-stop(51%, #0a0a0a), color-stop(100%, #000000));
1338 background-image: -webkit-linear-gradient(top, #2f3031, #161717 50%, #0a0a0a 51%, #000000);
1339 background-image: linear-gradient(top, #2f3031, #161717 50%, #0a0a0a 51%, #000000);
1340}
1341/* line 107, ../scss/include/_skeleton.scss */
1342#jqt .button.active,
1343#jqt .back.active,
1344#jqt .cancel.active,
1345#jqt .add.active {
1346 border-color: black;
1347 background-image: none;
1348 background-color: black;
1349 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #262627), color-stop(50%, #0d0d0d), color-stop(51%, #000000), color-stop(100%, #000000));
1350 background-image: -webkit-linear-gradient(top, #262627, #0d0d0d 50%, #000000 51%, #000000);
1351 background-image: linear-gradient(top, #262627, #0d0d0d 50%, #000000 51%, #000000);
1352 color: #d8d9d9;
1353 text-shadow: #000000 0 -1px 0;
1354}
1355/* line 114, ../scss/include/_skeleton.scss */
1356#jqt .back {
1357 max-width: 60px;
1358 margin-left: 15px;
1359 overflow: visible;
1360 padding-left: 5px;
1361}
1362/* line 121, ../scss/include/_skeleton.scss */
1363#jqt .back:after,
1364#jqt .back:before {
1365 content: '';
1366 position: absolute;
1367 width: 20px;
1368 height: 20px;
1369 top: 1px;
1370 left: 1px;
1371 -webkit-transform: rotate(45deg) translate3d(0.2px, 0, 0);
1372 transform: rotate(45deg) translate3d(0.2px, 0, 0);
1373 -webkit-transform-origin: 0 0;
1374 transform-origin: 0 0;
1375 background-image: none;
1376 background-color: #0a0a0a;
1377 background-image: -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0%, #2f3031), color-stop(50%, #161717), color-stop(51%, #0a0a0a), color-stop(100%, #000000));
1378 background-image: -webkit-linear-gradient(top left, #2f3031, #161717 50%, #0a0a0a 51%, #000000);
1379 background-image: linear-gradient(top left, #2f3031, #161717 50%, #0a0a0a 51%, #000000);
1380 background-size: 100% 98%;
1381 -webkit-border-radius: 0 0 0 2px;
1382 border-radius: 0 0 0 2px;
1383 -webkit-mask-image: -webkit-linear-gradient(45deg, #000000, #000000 15px, rgba(0, 0, 0, 0) 15px);
1384 -webkit-mask-image: -webkit-gradient(linear, left bottom, right top, from(#000000), color-stop(50%, #000000), color-stop(50%, rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0)));
1385 -webkit-mask-clip: border-box;
1386 -webkit-background-clip: content-box;
1387}
1388/* line 149, ../scss/include/_skeleton.scss */
1389#jqt .back:after {
1390 -webkit-box-shadow: rgba(0, 0, 0, 0.2) 1px 0 0 inset, rgba(0, 0, 0, 0.2) 0 -1px 0 inset;
1391 box-shadow: rgba(0, 0, 0, 0.2) 1px 0 0 inset, rgba(0, 0, 0, 0.2) 0 -1px 0 inset;
1392}
1393/* line 152, ../scss/include/_skeleton.scss */
1394#jqt .back:before {
1395 margin-left: -1px;
1396 background: black none;
1397}
1398/* line 157, ../scss/include/_skeleton.scss */
1399#jqt .back.active:after {
1400 background-image: none;
1401 background-color: black;
1402 background-image: -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0%, #262627), color-stop(50%, #0d0d0d), color-stop(51%, #000000), color-stop(100%, #000000));
1403 background-image: -webkit-linear-gradient(left top, #262627, #0d0d0d 50%, #000000 51%, #000000);
1404 background-image: linear-gradient(left top, #262627, #0d0d0d 50%, #000000 51%, #000000);
1405}
1406/* line 160, ../scss/include/_skeleton.scss */
1407#jqt .back.active:before {
1408 background-color: black;
1409}
1410/* line 166, ../scss/include/_skeleton.scss */
1411#jqt .blueButton {
1412 background-image: #2f7ce3, glossy;
1413 color: white;
1414 text-shadow: #1a63c5 0 -1px 0;
1415}
1416/* line 170, ../scss/include/_skeleton.scss */
1417#jqt .whiteButton,
1418#jqt .grayButton,
1419#jqt .redButton,
1420#jqt .blueButton,
1421#jqt .greenButton {
1422 display: block;
1423 font-size: 20px;
1424 font-weight: bold;
1425 margin: 10px 20px;
1426 padding: 10px;
1427 text-align: center;
1428 text-decoration: inherit;
1429 -webkit-border-radius: 8px;
1430 border-radius: 8px;
1431 -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 3px, rgba(0, 0, 0, 0.4) 0 0 0 5px, rgba(255, 255, 255, 0.3) 0 1px 0 5px;
1432 box-shadow: rgba(0, 0, 0, 0.4) 0 1px 3px, rgba(0, 0, 0, 0.4) 0 0 0 5px, rgba(255, 255, 255, 0.3) 0 1px 0 5px;
1433}
1434/* line 185, ../scss/include/_skeleton.scss */
1435#jqt .whiteButton.active,
1436#jqt .whiteButton:active,
1437#jqt .grayButton.active,
1438#jqt .grayButton:active,
1439#jqt .redButton.active,
1440#jqt .redButton:active,
1441#jqt .blueButton.active,
1442#jqt .blueButton:active,
1443#jqt .greenButton.active,
1444#jqt .greenButton:active {
1445 background-image: none;
1446 background-color: #3c8101;
1447 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5fcd01), color-stop(50%, #479b01), color-stop(51%, #3c8101), color-stop(100%, #306801));
1448 background-image: -webkit-linear-gradient(top, #5fcd01, #479b01 50%, #3c8101 51%, #306801);
1449 background-image: linear-gradient(top, #5fcd01, #479b01 50%, #3c8101 51%, #306801);
1450 color: white;
1451 text-shadow: #244f00 0 -1px 0;
1452}
1453/* line 191, ../scss/include/_skeleton.scss */
1454#jqt .whiteButton {
1455 background-image: none;
1456 background-color: #eeeeee;
1457 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(50%, #fbfbfb), color-stop(51%, #eeeeee), color-stop(100%, #e1e1e1));
1458 background-image: -webkit-linear-gradient(top, #ffffff, #fbfbfb 50%, #eeeeee 51%, #e1e1e1);
1459 background-image: linear-gradient(top, #ffffff, #fbfbfb 50%, #eeeeee 51%, #e1e1e1);
1460 color: #151515;
1461 text-shadow: white 0 1px 0;
1462}
1463/* line 195, ../scss/include/_skeleton.scss */
1464#jqt .grayButton {
1465 background-image: none;
1466 background-color: #444444;
1467 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #6a6a6a), color-stop(50%, #515151), color-stop(51%, #444444), color-stop(100%, #373737));
1468 background-image: -webkit-linear-gradient(top, #6a6a6a, #515151 50%, #444444 51%, #373737);
1469 background-image: linear-gradient(top, #6a6a6a, #515151 50%, #444444 51%, #373737);
1470 color: white;
1471 text-shadow: #2b2b2b 0 -1px 0;
1472}
1473/* line 200, ../scss/include/_skeleton.scss */
1474#jqt .redButton {
1475 background-image: none;
1476 background-color: #d83b38;
1477 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e57a78), color-stop(50%, #dc504d), color-stop(51%, #d83b38), color-stop(100%, #ce2c28));
1478 background-image: -webkit-linear-gradient(top, #e57a78, #dc504d 50%, #d83b38 51%, #ce2c28);
1479 background-image: linear-gradient(top, #e57a78, #dc504d 50%, #d83b38 51%, #ce2c28);
1480 color: white;
1481 text-shadow: #b92724 0 -1px 0;
1482}
1483/* line 204, ../scss/include/_skeleton.scss */
1484#jqt .redButton.active,
1485#jqt .redButton:active {
1486 background-image: none;
1487 background-color: #c12926;
1488 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #de5856), color-stop(50%, #d52e2b), color-stop(51%, #c12926), color-stop(100%, #ac2422));
1489 background-image: -webkit-linear-gradient(top, #de5856, #d52e2b 50%, #c12926 51%, #ac2422);
1490 background-image: linear-gradient(top, #de5856, #d52e2b 50%, #c12926 51%, #ac2422);
1491 color: white;
1492 text-shadow: #97201e 0 -1px 0;
1493}
1494/* line 211, ../scss/include/_skeleton.scss */
1495#jqt .greenButton {
1496 background-image: none;
1497 background-color: #53b401;
1498 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #76fe04), color-stop(50%, #5fcd01), color-stop(51%, #53b401), color-stop(100%, #479b01));
1499 background-image: -webkit-linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1500 background-image: linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1501 color: white;
1502 text-shadow: #3c8101 0 -1px 0;
1503}
1504/* line 216, ../scss/include/_skeleton.scss */
1505#jqt .leftButton,
1506#jqt .cancel,
1507#jqt .back {
1508 left: 6px;
1509 right: auto;
1510}
1511/* line 221, ../scss/include/_skeleton.scss */
1512#jqt .add {
1513 font-size: 24px;
1514 line-height: 24px;
1515 font-weight: bold;
1516}
1517/* line 229, ../scss/include/_skeleton.scss */
1518#jqt ul {
1519 padding: 0;
1520 margin: 5px 10px 10px 10px;
1521 -webkit-margin-collapse: separate;
1522}
1523/* line 231, ../scss/include/_skeleton.scss */
1524#jqt ul,
1525#jqt ul.individual li {
1526 background-color: #555658;
1527 color: #d5d6d7;
1528 text-shadow: #3c3d3e 0 -1px 0;
1529 border: 1px solid #2f3031;
1530 font: bold 18px "Helvetica Neue", Helvetica;
1531}
1532/* line 240, ../scss/include/_skeleton.scss */
1533#jqt ul:first-child {
1534 margin-top: 15px;
1535}
1536/* line 246, ../scss/include/_skeleton.scss */
1537#jqt ul li {
1538 border-top: 1px solid #48494b;
1539 list-style-type: none;
1540 overflow: hidden;
1541 padding: 10px;
1542 -webkit-transform: translate3d(0, 0, 0);
1543 /* expensive way to avoid flickr */
1544
1545}
1546/* line 253, ../scss/include/_skeleton.scss */
1547#jqt ul li a {
1548 text-decoration: none;
1549 text-overflow: ellipsis;
1550 white-space: nowrap;
1551 overflow: hidden;
1552 display: block;
1553 padding: 10px;
1554 margin: -10px;
1555 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
1556 -webkit-transform: translateZ(0);
1557 color: white;
1558 text-shadow: #3c3d3e 0 -1px 0;
1559}
1560/* line 265, ../scss/include/_skeleton.scss */
1561#jqt ul li a.active {
1562 background-image: none;
1563 background-color: #53b401;
1564 -webkit-box-shadow: #5cc801 0 1px 0px inset;
1565 box-shadow: #5cc801 0 1px 0px inset;
1566 color: white;
1567 text-shadow: #3c8101 0 -1px 0;
1568}
1569/* line 270, ../scss/include/_skeleton.scss */
1570#jqt ul li a.active small {
1571 color: #a0fe50;
1572 text-shadow: #000000 0 -1px 0;
1573}
1574/* line 271, ../scss/include/_skeleton.scss */
1575#jqt ul li a.active small.counter {
1576 background-color: #306801;
1577}
1578/* line 280, ../scss/include/_skeleton.scss */
1579#jqt ul li small {
1580 color: #53b401;
1581 font: 16px "Helvetica Neue", Helvetica;
1582 text-align: right;
1583 text-overflow: ellipsis;
1584 white-space: nowrap;
1585 overflow: hidden;
1586 display: block;
1587 width: 23%;
1588 position: relative;
1589 z-index: 20;
1590 float: right;
1591 line-height: 16px;
1592 padding: 2px 8px 4px 8px;
1593}
1594/* line 295, ../scss/include/_skeleton.scss */
1595#jqt ul li small.counter {
1596 background: #2f3031;
1597 color: #949698;
1598 text-shadow: #0a0a0a 0 -1px 0;
1599 z-index: 10;
1600 font-size: 16px;
1601 font-weight: bold;
1602 -webkit-border-radius: 3px;
1603 border-radius: 3px;
1604 display: block;
1605 width: auto;
1606}
1607/* line 311, ../scss/include/_skeleton.scss */
1608#jqt ul li ::-webkit-input-placeholder {
1609 color: #949698;
1610 text-shadow: #3c3d3e 0 -1px 0;
1611}
1612/* line 322, ../scss/include/_skeleton.scss */
1613#jqt ul li input[type="text"],
1614#jqt ul li input[type="password"],
1615#jqt ul li input[type="tel"],
1616#jqt ul li input[type="number"],
1617#jqt ul li input[type="search"],
1618#jqt ul li input[type="email"],
1619#jqt ul li input[type="url"],
1620#jqt ul li textarea,
1621#jqt ul li select {
1622 color: white;
1623 text-shadow: #3c3d3e 0 -1px 0;
1624 background: transparent url("data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==");
1625 border: 0;
1626 font: normal 17px "Helvetica Neue", Helvetica;
1627 padding: 0;
1628 display: inline-block;
1629 margin-left: 0px;
1630 width: 100%;
1631 -webkit-appearance: textarea;
1632}
1633/* line 333, ../scss/include/_skeleton.scss */
1634#jqt ul li textarea {
1635 height: 120px;
1636 padding: 0;
1637 text-indent: -2px;
1638}
1639/* line 338, ../scss/include/_skeleton.scss */
1640#jqt ul li input[type="checkbox"],
1641#jqt ul li input[type="radio"] {
1642 margin: 0;
1643 padding: 10px;
1644}
1645/* line 342, ../scss/include/_skeleton.scss */
1646#jqt ul li input[type="checkbox"]:after,
1647#jqt ul li input[type="radio"]:after {
1648 content: attr(title);
1649 position: absolute;
1650 display: block;
1651 width: 0;
1652 left: 21px;
1653 top: 12px;
1654 font-family: "Helvetica Neue", Helvetica;
1655 font-size: 17px;
1656 line-height: 21px;
1657 width: 246px;
1658 margin: 0 0 0 17px;
1659 color: white;
1660 text-shadow: #3c3d3e 0 -1px 0;
1661}
1662/* line 355, ../scss/include/_skeleton.scss */
1663#jqt ul li input[type='submit'] {
1664 -webkit-border-radius: 4px;
1665 border-radius: 4px;
1666 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eeeeee), to(#9c9ea0));
1667 border: 1px outset #aaa;
1668 display: block;
1669 font-size: inherit;
1670 font-weight: inherit;
1671 padding: 10px;
1672}
1673/* line 368, ../scss/include/_skeleton.scss */
1674#jqt ul li.arrow small,
1675#jqt ul li.forward small {
1676 margin-right: 24px;
1677}
1678/* line 380, ../scss/include/_skeleton.scss */
1679#jqt ul li.forward:before {
1680 content: "";
1681 position: absolute;
1682 display: block;
1683 top: 50%;
1684 right: 6px;
1685 margin-top: -12px;
1686 width: 24px;
1687 height: 24px;
1688 -webkit-border-radius: 12px;
1689 border-radius: 12px;
1690 background-image: none;
1691 background-color: #53b401;
1692 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #76fe04), color-stop(50%, #5fcd01), color-stop(51%, #53b401), color-stop(100%, #479b01));
1693 background-image: -webkit-linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1694 background-image: linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1695 border: 2px solid #fff;
1696 -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1697 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1698 -webkit-box-sizing: border-box;
1699 padding: 0;
1700 z-index: 10;
1701 line-height: 0;
1702 pointer-events: none;
1703}
1704/* line 395, ../scss/include/_skeleton.scss */
1705#jqt ul li.forward:after {
1706 color: white;
1707 text-shadow: #3c8101 0 -1px 0;
1708 filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
1709 opacity: 1;
1710 font-size: 24px;
1711}
1712/* line 404, ../scss/include/_skeleton.scss */
1713#jqt ul.rounded,
1714#jqt ul.individual li {
1715 -webkit-box-shadow: rgba(255, 255, 255, 0.15) 0 1px 0;
1716 box-shadow: rgba(255, 255, 255, 0.15) 0 1px 0;
1717 border: 1px solid #2f3031;
1718}
1719/* line 409, ../scss/include/_skeleton.scss */
1720#jqt ul.rounded {
1721 -webkit-border-radius: 8px;
1722 border-radius: 8px;
1723}
1724/* line 412, ../scss/include/_skeleton.scss */
1725#jqt ul.rounded li:first-child,
1726#jqt ul.rounded li:first-child a {
1727 border-top: 0;
1728 -webkit-border-top-left-radius: 8px;
1729 border-top-left-radius: 8px;
1730 -webkit-border-top-right-radius: 8px;
1731 border-top-right-radius: 8px;
1732}
1733/* line 416, ../scss/include/_skeleton.scss */
1734#jqt ul.rounded li:last-child,
1735#jqt ul.rounded li:last-child a {
1736 -webkit-border-bottom-left-radius: 8px;
1737 border-bottom-left-radius: 8px;
1738 -webkit-border-bottom-right-radius: 8px;
1739 border-bottom-right-radius: 8px;
1740}
1741/* line 422, ../scss/include/_skeleton.scss */
1742#jqt ul.form li {
1743 padding: 7px 10px;
1744}
1745/* line 425, ../scss/include/_skeleton.scss */
1746#jqt ul.form li.error {
1747 border: 2px solid red;
1748}
1749/* line 428, ../scss/include/_skeleton.scss */
1750#jqt ul.form li.error + #jqt ul.form li.error {
1751 border-top: 0;
1752}
1753/* line 438, ../scss/include/_skeleton.scss */
1754#jqt ul.metal li {
1755 background-image: none;
1756 border-top: 1px solid #fff;
1757 border-bottom: 1px solid #666;
1758 font-size: 26px;
1759}
1760/* line 445, ../scss/include/_skeleton.scss */
1761#jqt ul.metal li a {
1762 line-height: 26px;
1763 margin: 0;
1764 padding: 13px 0;
1765}
1766/* line 451, ../scss/include/_skeleton.scss */
1767#jqt ul.metal li em {
1768 display: block;
1769 font-size: 14px;
1770 font-style: normal;
1771 width: 50%;
1772 line-height: 14px;
1773}
1774/* line 459, ../scss/include/_skeleton.scss */
1775#jqt ul.metal li small {
1776 float: right;
1777 position: relative;
1778 margin-top: 10px;
1779 font-weight: bold;
1780}
1781/* line 473, ../scss/include/_skeleton.scss */
1782#jqt ul.edgetoedge li {
1783 font-size: 20px;
1784}
1785/* line 476, ../scss/include/_skeleton.scss */
1786#jqt ul.edgetoedge li:first-child {
1787 border-top: 0;
1788}
1789/* line 480, ../scss/include/_skeleton.scss */
1790#jqt ul.edgetoedge li.sep {
1791 font-size: 16px;
1792 padding: 2px 10px;
1793}
1794/* line 485, ../scss/include/_skeleton.scss */
1795#jqt ul.edgetoedge li em {
1796 font-weight: normal;
1797 font-style: normal;
1798}
1799/* line 494, ../scss/include/_skeleton.scss */
1800#jqt ul.plastic {
1801 font-size: 18px;
1802}
1803/* line 498, ../scss/include/_skeleton.scss */
1804#jqt ul.plastic li {
1805 border-width: 1px 0;
1806 border-style: solid;
1807 background-image: none;
1808 background-color: #2a2b2c;
1809 border-top-color: #2f3031;
1810 border-bottom-color: #232324;
1811}
1812/* line 506, ../scss/include/_skeleton.scss */
1813#jqt ul.plastic li:nth-child(odd) {
1814 background-image: none;
1815 background-color: #2f3031;
1816}
1817/* line 510, ../scss/include/_skeleton.scss */
1818#jqt ul.plastic li a.active.loading {
1819 background-image: url(img/loading.gif);
1820 background-position: 95% center;
1821 background-repeat: no-repeat;
1822}
1823/* line 515, ../scss/include/_skeleton.scss */
1824#jqt ul.plastic li small {
1825 color: #949698;
1826 font-size: 13px;
1827 font-weight: bold;
1828 text-transform: uppercase;
1829}
1830/* line 525, ../scss/include/_skeleton.scss */
1831#jqt ul.individual {
1832 border: 0;
1833 background: none;
1834 clear: both;
1835 overflow: hidden;
1836}
1837/* line 531, ../scss/include/_skeleton.scss */
1838#jqt ul.individual li {
1839 font-size: 14px;
1840 text-align: center;
1841 -webkit-border-radius: 8px;
1842 border-radius: 8px;
1843 -webkit-box-sizing: border-box;
1844 box-sizing: border-box;
1845 width: 48%;
1846 float: left;
1847 display: block;
1848 padding: 11px 10px 14px 10px;
1849}
1850/* line 541, ../scss/include/_skeleton.scss */
1851#jqt ul.individual li + li {
1852 float: right;
1853}
1854/* line 546, ../scss/include/_skeleton.scss */
1855#jqt ul.individual a {
1856 line-height: 16px;
1857 margin: -11px -10px -14px -10px;
1858 padding: 11px 10px 14px 10px;
1859 -webkit-border-radius: 8px;
1860 border-radius: 8px;
1861}
1862/* line 555, ../scss/include/_skeleton.scss */
1863#jqt .toggle {
1864 width: 94px;
1865 position: relative;
1866 height: 27px;
1867 display: block;
1868 overflow: hidden;
1869 float: right;
1870}
1871/* line 563, ../scss/include/_skeleton.scss */
1872#jqt .toggle input[type="checkbox"] {
1873 margin: 0;
1874 -webkit-border-radius: 5px;
1875 border-radius: 5px;
1876 height: 27px;
1877 overflow: hidden;
1878 width: 149px;
1879 border: 0;
1880 -webkit-transition: left 0.15s ease-in-out;
1881 transition: left 0.15s ease-in-out;
1882 position: absolute;
1883 top: 0;
1884 left: -55px;
1885 -webkit-appearance: textarea;
1886 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
1887}
1888/* line 577, ../scss/include/_skeleton.scss */
1889#jqt .toggle input[type="checkbox"]:checked {
1890 left: 0px;
1891}
1892/* line 583, ../scss/include/_skeleton.scss */
1893#jqt .info {
1894 font-size: 12px;
1895 line-height: 16px;
1896 text-align: center;
1897 color: #444;
1898 padding: 15px;
1899 font-weight: bold;
1900}
1901/* line 12, ../scss/jqtouch.scss */
1902#jqt {
1903 /* Lists */
1904
1905}
1906/* line 13, ../scss/jqtouch.scss */
1907#jqt > * {
1908 background-image: url('data:image/png;base64,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'), -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #7b7c7f), color-stop(30%, #696a6d), color-stop(65%, #555658), color-stop(100%, #464748));
1909 background-image: url('data:image/png;base64,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'), -webkit-linear-gradient(top, #7b7c7f, #696a6d 30%, #555658 65%, #464748);
1910 background-image: url('data:image/png;base64,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'), linear-gradient(top, #7b7c7f, #696a6d 30%, #555658 65%, #464748);
1911}
1912/* line 20, ../scss/jqtouch.scss */
1913#jqt .toolbar {
1914 background-image: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, #181819), color-stop(12.5%, rgba(11, 11, 12, 0))), -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, #181819), color-stop(12.5%, rgba(11, 11, 12, 0))), -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, rgba(255, 255, 255, 0.1)), color-stop(12.5%, rgba(255, 255, 255, 0))), -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, rgba(255, 255, 255, 0.1)), color-stop(12.5%, rgba(255, 255, 255, 0)));
1915 background-image: -webkit-radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), -webkit-radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), -webkit-radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%), -webkit-radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%);
1916 background-image: radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%), radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%);
1917 background-repeat: repeat;
1918 background-position: 0 0, 8px 8px, 0 1px, 8px 9px;
1919 background-color: #2f3031;
1920 background-size: 16px 16px;
1921}
1922/* line 29, ../scss/jqtouch.scss */
1923#jqt ul li {
1924 border-top: 1px solid #48494b;
1925 background-image: none;
1926 background-color: rgba(85, 86, 88, 0.2);
1927 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(123, 124, 127, 0.2)), color-stop(3%, rgba(98, 99, 101, 0.2)), color-stop(100%, rgba(72, 73, 75, 0.2)));
1928 background-image: -webkit-linear-gradient(top, rgba(123, 124, 127, 0.2), rgba(98, 99, 101, 0.2) 3%, rgba(72, 73, 75, 0.2));
1929 background-image: linear-gradient(top, rgba(123, 124, 127, 0.2), rgba(98, 99, 101, 0.2) 3%, rgba(72, 73, 75, 0.2));
1930}
1931/* line 33, ../scss/jqtouch.scss */
1932#jqt ul li a {
1933 color: white;
1934 text-shadow: #3c3d3e 0 -1px 0;
1935}
1936/* line 37, ../scss/jqtouch.scss */
1937#jqt ul li .toggle input[type="checkbox"] {
1938 -webkit-border-radius: 5px;
1939 border-radius: 5px;
1940 background: #ffffff url(../img/jqt/on_off.png) 0 0 no-repeat;
1941}
1942/* line 42, ../scss/jqtouch.scss */
1943#jqt ul li input[type='submit'] {
1944 background-image: none;
1945 background-color: white;
1946 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(50%, #ffffff), color-stop(51%, #ffffff), color-stop(100%, #f2f2f2));
1947 background-image: -webkit-linear-gradient(top, #ffffff, #ffffff 50%, #ffffff 51%, #f2f2f2);
1948 background-image: linear-gradient(top, #ffffff, #ffffff 50%, #ffffff 51%, #f2f2f2);
1949 border: 1px outset black;
1950}
1951/* line 47, ../scss/jqtouch.scss */
1952#jqt ul li small.counter {
1953 -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0;
1954 box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0;
1955}
1956/* line 54, ../scss/jqtouch.scss */
1957#jqt ul.metal li {
1958 background-image: none;
1959 border-top: 1px solid #fff;
1960 border-bottom: 1px solid #666;
1961 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eeeeee), to(#9c9ea0));
1962}
1963/* line 60, ../scss/jqtouch.scss */
1964#jqt ul.metal li a {
1965 text-shadow: #fff 0 1px 0;
1966}
1967/* line 62, ../scss/jqtouch.scss */
1968#jqt ul.metal li a.active {
1969 color: #000;
1970}
1971/* line 65, ../scss/jqtouch.scss */
1972#jqt ul.metal li em {
1973 color: #444;
1974}
1975/* line 71, ../scss/jqtouch.scss */
1976#jqt ul.edgetoedge li {
1977 background-image: none;
1978 background-color: #3c3d3e;
1979 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #282829), color-stop(100%, #2f3031));
1980 background-image: -webkit-linear-gradient(top, #282829, #2f3031);
1981 background-image: linear-gradient(top, #282829, #2f3031);
1982 border-bottom: 1px solid #1e1e1f;
1983 border-top: 1px solid #343536;
1984}
1985/* line 76, ../scss/jqtouch.scss */
1986#jqt ul.edgetoedge li.sep {
1987 background-image: none;
1988 background-color: rgba(0, 0, 0, 0.3);
1989 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(38, 38, 38, 0.3)), color-stop(30%, rgba(20, 20, 20, 0.3)), color-stop(65%, rgba(0, 0, 0, 0.3)), color-stop(100%, rgba(0, 0, 0, 0.3)));
1990 background-image: -webkit-linear-gradient(top, rgba(38, 38, 38, 0.3), rgba(20, 20, 20, 0.3) 30%, rgba(0, 0, 0, 0.3) 65%, rgba(0, 0, 0, 0.3));
1991 background-image: linear-gradient(top, rgba(38, 38, 38, 0.3), rgba(20, 20, 20, 0.3) 30%, rgba(0, 0, 0, 0.3) 65%, rgba(0, 0, 0, 0.3));
1992 color: #949698;
1993 text-shadow: #000000 0 -1px 0;
1994}
1995/* line 83, ../scss/jqtouch.scss */
1996#jqt .info {
1997 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#cccccc), to(#aaaaaa), color-stop(0.6, #cccccc));
1998 text-shadow: rgba(255, 255, 255, 0.8) 0 1px 0;
1999 color: #444;
2000 border-top: 1px solid rgba(255, 255, 255, 0.2);
2001}
2002div.spinner {
2003 position: relative;
2004 width: 100px;
2005 height: 100px;
2006 display: inline-block;
2007}
2008div.spinner div {
2009 width: 12%;
2010 height: 26%;
2011 background: #000;
2012 position: absolute;
2013 left: 44.5%;
2014 top: 37%;
2015 opacity: 0;
2016 -webkit-animation: fade 1s linear infinite;
2017 -webkit-border-radius: 50px;
2018 -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
2019}
2020div.spinner div.bar01 {
2021 -webkit-transform: rotate(0deg) translate(0, -142%);
2022 -webkit-animation-delay: 0s;
2023}
2024div.spinner div.bar02 {
2025 -webkit-transform: rotate(30deg) translate(0, -142%);
2026 -webkit-animation-delay: -0.9167s;
2027}
2028div.spinner div.bar03 {
2029 -webkit-transform: rotate(60deg) translate(0, -142%);
2030 -webkit-animation-delay: -0.833s;
2031}
2032div.spinner div.bar04 {
2033 -webkit-transform: rotate(90deg) translate(0, -142%);
2034 -webkit-animation-delay: -0.75s;
2035}
2036div.spinner div.bar05 {
2037 -webkit-transform: rotate(120deg) translate(0, -142%);
2038 -webkit-animation-delay: -0.667s;
2039}
2040div.spinner div.bar06 {
2041 -webkit-transform: rotate(150deg) translate(0, -142%);
2042 -webkit-animation-delay: -0.5833s;
2043}
2044div.spinner div.bar07 {
2045 -webkit-transform: rotate(180deg) translate(0, -142%);
2046 -webkit-animation-delay: -0.5s;
2047}
2048div.spinner div.bar08 {
2049 -webkit-transform: rotate(210deg) translate(0, -142%);
2050 -webkit-animation-delay: -0.41667s;
2051}
2052div.spinner div.bar09 {
2053 -webkit-transform: rotate(240deg) translate(0, -142%);
2054 -webkit-animation-delay: -0.333s;
2055}
2056div.spinner div.bar10 {
2057 -webkit-transform: rotate(270deg) translate(0, -142%);
2058 -webkit-animation-delay: -0.25s;
2059}
2060div.spinner div.bar11 {
2061 -webkit-transform: rotate(300deg) translate(0, -142%);
2062 -webkit-animation-delay: -0.1667s;
2063}
2064div.spinner div.bar12 {
2065 -webkit-transform: rotate(330deg) translate(0, -142%);
2066 -webkit-animation-delay: -0.0833s;
2067}
2068@-webkit-keyframes fade {
2069 from {
2070 opacity: 1;
2071 }
2072 to {
2073 opacity: 0.25;
2074 }
2075}
2076/*
2077
2078Color list:
2079- login box:
2080 light#ff9955
2081 dark#ff6622
2082- login button:
2083 regular#dd5500
2084 hover#773311
2085- login translations:
2086 box: #cc6622;
2087 not-selected:
2088 color: #ddaa99
2089 background:#994422
2090 selected: #772211;
2091*/
2092html {
2093 height: 100%;
2094 -webkit-text-size-adjust: none;
2095 -ms-text-size-adjust: none;
2096}
2097body {
2098 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
2099 margin: 0px;
2100}
2101.ellipsis {
2102 text-overflow: ellipsis;
2103 overflow: hidden;
2104 white-space: nowrap;
2105}
2106div#loginForm div.credentialsMessage.error h1 {
2107 color: red;
2108}
2109div#loginForm div.validating div.loading {
2110 margin-top: 50px;
2111 margin-bottom: 50px;
2112 margin-left: auto;
2113 margin-right: auto;
2114 width: 100px;
2115}
2116/*
2117
2118Color list:
2119- login box:
2120 light#ff9955
2121 dark#ff6622
2122- login button:
2123 regular#dd5500
2124 hover#773311
2125- login translations:
2126 box: #cc6622;
2127 not-selected:
2128 color: #ddaa99
2129 background:#994422
2130 selected: #772211;
2131*/
2132html {
2133 height: 100%;
2134 -webkit-text-size-adjust: none;
2135 -ms-text-size-adjust: none;
2136}
2137body {
2138 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
2139 margin: 0px;
2140}
2141.ellipsis {
2142 text-overflow: ellipsis;
2143 overflow: hidden;
2144 white-space: nowrap;
2145}
2146#jqt div.cardList ul li.cardListItem a small.favicon {
2147 background: white;
2148 -webkit-border-radius: 3px;
2149 border-radius: 3px;
2150 display: block;
2151 width: 26px;
2152 height: 26px;
2153 padding: 0px;
2154}
2155#jqt div.cardList ul li.cardListItem a small.favicon img.favicon {
2156 margin-right: 3px;
2157 margin-top: 3px;
2158 width: 20px;
2159 height: 20px;
2160}
2161#jqt div.cardDetail ul li a.password {
2162 color: gray;
2163}
2164/* ---------------------------------------- */
2165/*
2166body {
2167 margin: 0;
2168 font-family: Helvetica;
2169 background: #FFFFFF;
2170 color: #000000;
2171 overflow-x: hidden;
2172 -webkit-user-select: none;
2173 -webkit-text-size-adjust: none;
2174}
2175
2176
2177div.toolbar {
2178 box-sizing: border-box;
2179 -moz-box-sizing: border-box;
2180 -webkit-box-sizing: border-box;
2181 border-bottom: 1px solid #2d3642;
2182 border-top: 1px solid #6d84a2;
2183 padding: 10px;
2184 height: 45px;
2185 //background: url(./images/old/iPhone/toolbar.png) #6d84a2 repeat-x;
2186 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
2187}
2188
2189div.toolbar h1#pageTitle {
2190 overflow: hidden;
2191 margin-top: 1px;
2192 margin-bottom: 0px;
2193 margin-left: auto;
2194 margin-right: auto;
2195 width: 150px;
2196 height: 25px;
2197 font-size: 20px;
2198 width: 150px;
2199 font-weight: bold;
2200 text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
2201 text-align: center;
2202 text-overflow: ellipsis;
2203 white-space: nowrap;
2204 color: #FFFFFF;
2205}
2206
2207div.toolbar a.button {
2208 position: absolute;
2209 overflow: hidden;
2210 top: 8px;
2211 right: 6px;
2212 margin: 0;
2213 border-width: 0 5px;
2214 padding: 0 3px;
2215 width: auto;
2216 height: 30px;
2217 line-height: 30px;
2218 font-family: inherit;
2219 font-size: 12px;
2220 font-weight: bold;
2221 color: #FFFFFF;
2222 text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0;
2223 text-overflow: ellipsis;
2224 text-decoration: none;
2225 white-space: nowrap;
2226 background: none;
2227 //-webkit-border-image: url(./images/old/iPhone/toolButton.png) 0 5 0 5;
2228}
2229
2230div.toolbar a#backButton {
2231 left: 6px;
2232 right: auto;
2233 padding: 0px;
2234 max-width: 55px;
2235 border-width: 0 8px 0 14px;
2236 //-webkit-border-image: url(./images/old/iPhone/backButton.png) 0 8 0 14;
2237 -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAIAAAA6iHCJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtJJREFUeNrEV21P01AYbbtubNExBnXDbYjjZYI4BMdgEANDQoTElw/+Rw0mBs0UiSGaoJFEQEPwjRhFCW/JxrZ2Xdu1fe71bpAhCHzqupPnS5ObPOeec+5zb+lHLxao05HPiwvzr3/++J7N7FFGgaaDLe034+O+wCXyxSKET1u5+Wc98XTK39zeOzjudLmNIoAR2tlaf/Zkqm9gKNI/RBigE9dtb23MJKZj8fvuC16b3WGxsJRxOFfHeQOtH+ZnOI+XRfgEBoLAzz6fjo7ebfD4GYYhMiEdDGRAW6xOt6d7YGzl4xIL/7mgyPL044edkVt19T4EFAJEVQYud+MvOCkHc7MJ3+VrXGOzXrHeZS1s9trjOVj7tiqpONTWBRgD6BVmQFls9iMaSHnx/bu3ffEHgC2gVVqAIojKR3Iw9zLRcjVmtTnA0NydxQDg0IWvq59kYIOeZtWs9gQkagcMcgK/vLjYNXQHcEkas0AcYPdNIPr7Q/0M69B089ofavB5ZVm3OJ2cTwegzAUgxGbSe8tLS52xewjRZGabzAABZt+8mvGHBsiYNF+AAw1cXEBGNUiQqWpAlArM5MSYBXgEOl0NkLcCkxak28MRKbuDMa6KDAwAUnU8HO2Q+N0SJ3OLMCA7V1S9vt7d3tSg5LNV0ACXwOekcGfreVbVVYUqMjOvyPsH71cqkxsZ7NHFJIXBTCMONMAlEryoxAfDucyOmaOpmINyaTowrK23IyDxKbNzUIYoKU3+i37OXpCESvfGCOw11uMMcCkQke4rDlrS1coOSk2VOXftERfKtZsURmLXQUqBVqiUABgrQirc0Xp4Fv4t8kxN8dLkaJQupOVcGnTN0PuQHHlRSG1Eu9tUTLOnxZ5clclsfmK078va7/WN7axomCN2e42Xc/VEIoiiM0KePeM20DTY3M22BZtuhENW1rC/NrI3WVGTmZxSKEr7V4ABAJ+53J1I3nPjAAAAAElFTkSuQmCCCg==) 0 8 0 14;
2238}
2239
2240// -------------------------------------------
2241
2242body.iPhone form.loginForm {
2243 min-height: 372px;
2244
2245 box-sizing: border-box;
2246 -moz-box-sizing: border-box;
2247 -webkit-box-sizing: border-box;
2248 padding: 10px;
2249 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2250 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2251}
2252
2253fieldset {
2254 position: relative;
2255 margin: 0 0 20px 0;
2256 padding: 0;
2257 background: #FFFFFF;
2258 -webkit-border-radius: 10px;
2259 -moz-border-radius: 10px;
2260 border: 1px solid #999999;
2261 text-align: right;
2262 font-size: 16px;
2263}
2264
2265.row {
2266 position: relative;
2267 min-height: 42px;
2268 border-bottom: 1px solid #999999;
2269 -webkit-border-radius: 0;
2270 text-align: right;
2271}
2272
2273fieldset > .row:last-child {
2274 border-bottom: none !important;
2275}
2276
2277
2278.row > input:not(input[type|=radio]):not(input[type|=checkbox]),
2279.row > div.fieldValue {
2280 width: 100%;
2281 box-sizing: border-box;
2282 -moz-box-sizing: border-box;
2283 -webkit-box-sizing: border-box;
2284 margin: 0;
2285 border: none;
2286 padding: 0px 10px 0 112px;
2287 height: 42px;
2288 background: none;
2289 font-size: 16px;
2290 font-weight: normal;
2291
2292 color: #666a60;
2293 -webkit-user-select: text;
2294}
2295
2296.row > div.fieldValue p {
2297 margin: 0px;
2298 text-align: left;
2299 height: 40px;
2300 vertical-align: middle;
2301 line-height: 40px;
2302}
2303
2304body[orientation="landscape"] .row > div.fieldValue.password {
2305 padding-right: 120px;
2306 //background: url(./images/old/iPhone/password_background.png) no-repeat 105px;
2307 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 105px;
2308}
2309
2310.row > div.fieldValue.password {
2311 color: rgba(255,255,255,0.5);
2312 //background: url(./images/old/iPhone/password_background.png) no-repeat 106px;
2313 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 106px;
2314}
2315
2316.row > div.fieldValue.password.clear {
2317 color: #666a60;
2318 background: none;
2319}
2320
2321.row > input[type|=radio], .row > input[type|=checkbox] {
2322 margin: 7px 7px 0 0;
2323 height: 25px;
2324 width: 25px;
2325}
2326
2327
2328.row > label {
2329 position: absolute;
2330 margin: 0 0 0 14px;
2331 line-height: 42px;
2332 font-weight: bold;
2333 max-width: 92px;
2334 overflow: hidden;
2335 white-space: nowrap;
2336}
2337
2338body[orientation="landscape"] .row > label {
2339 max-width: 150px;
2340}
2341
2342body[orientation="landscape"] .row > input:not(input[type|=radio]):not(input[type|=checkbox]) {
2343 padding-left: 140px;
2344}
2345
2346.row > img.favicon {
2347 position: absolute;
2348 width: 20px;
2349 height: 20px;
2350 top: 12px;
2351 left: 11px;
2352}
2353
2354.row > span {
2355 padding: 8px 13px;
2356 text-align: left;
2357 display: block;
2358 color: #666a60;
2359 font-size: 10pt;
2360}
2361
2362.row.notes {
2363 -webkit-user-select: text;
2364}
2365
2366// -------------------------------------------
2367
2368.whiteButton {
2369 margin-left: auto;
2370 margin-right: auto;
2371 width: 150px;
2372 display: block;
2373 border-width: 0 12px;
2374 padding: 10px;
2375 text-align: center;
2376 font-size: 20px;
2377 font-weight: bold;
2378 text-decoration: inherit;
2379 color: inherit;
2380
2381 //-webkit-border-image: url(./images/old/iPhone/whiteButton.png) 0 12 0 12;
2382 -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAuCAQAAAB+dNqHAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAdAAAALgChnaVgAAAAAmJLR0QA/4ePzL8AAANhSURBVEjHnZZNaFxVFMd/5747mclMkpmxzYdJtFaJglgFpYSiBAVX7l0UUZGuSkEEu3PtSulCUXFdxYXL7kQQIWD9CsRIqdomGGOaSdJmZjKTeW/eu/e4mKRmrE3n5X83j/ve7/3POfe+d67QrTxP8QLDnMTenkv4kQ2+YZ6d/Y/Kvut+XuZVKtygzVbXC8v0cT+jXORLWneix/mAZZZwKIrSbSAIAcd5kDdZ6kaf4zzfEeLPnHrr+UeOWpMJ9rjYxe7a5ntff/YThhyneJ/Zf9Ep3uEXkhNjX50bHoiStoPE76HWiPQFfcGN+kufLKxheZJ3+aOD5vmIBaLXpz89HSVhzF2Uy2TtGxe/+JksJzjHjgCvMEHz6cnZt7dD5zlAgSlkZy7MrVDgbz43FJimhV46W2vFzutBI3aN8NJZlBbTFAKepZ/o/IszU1Gs95Tz2Uw1nFuiiTE8Rhs9fbIROt/LaISvTaO0mbIM0kTKeefoUSMDCI6SxRCT9d77XlFrCYgQi0PH72vH9CyNMSjO4tGM9do76hXB4y2KU+c8aaR41KJ4SIn6DgqgPq2rggWc+kMEjBUBVDUNKQBiOx+218Pl6tVr+jJhUZx4PYSr4XBSsAKaJH9tpirT7uIoTj3pAna43TJJWtSjYDpxp5bv5OpTb4mOq3IIX0W14ypeUq+rYBH5T9fqbRerWMClrbB4PBgUjZPUuXrUGBW51Yhc71y9LSJi1NgQxVWj3a7aw2gmONSGJtNAxC9v9+56vaoe6aubXEWy4meXe/+VXl42TvqzG4ZFCkRzv/+w3lu436/PX6NNnsUgCctjUUJwnWdGC/ZenpXw47loTRrldu3XwLkSrQmiHbkSP3FkwB4MXpjfWDE3JTfw29ZGAGHjgWJdcDW9XC/0PVS4W47fVj5cuLUmFWlOVlevei8ApVLp8bWclnWU4khpZvTRwaw5VggEINHlZuSv1mcr6zW2ZF22xqLqlWr19uYdGSkeWyn4IY5okX61GBHMrp1HJaYldW4G9Ylm7c/19a4jV6k0+fBmtjbkCwxoDovdQ0lIpEXTNIrbR6OVxWr1joNeJjM+Xhyu2+0+Z6Ocmt17Kj4bBvFgPJTUNlZX4/j/zohAJlMuF4vW5vP7Z3d2kqRW29qKuxr4P1RbNFwZtqq8AAAAAElFTkSuQmCCCg==) 0 12 0 12;
2383 text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0;
2384}
2385
2386// -------------------------------------------
2387
2388body.iPhone .loginProgressPanel {
2389 min-height: 372px;
2390
2391 box-sizing: border-box;
2392 -moz-box-sizing: border-box;
2393 -webkit-box-sizing: border-box;
2394 padding: 10px;
2395 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2396 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2397}
2398
2399body.iPhone .loadingBar {
2400 margin-left: auto;
2401 margin-right: auto;
2402 margin-top: 60px;
2403}
2404
2405div.loadingBar {
2406 height: 22px;
2407 width: 214px;
2408 //background: url(./images/old/loading/loadingBar.gif) no-repeat center;
2409 background: url(data:image/gif;charset=utf-8;base64,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) no-repeat center;
2410}
2411
2412div.loadingBar div.loadingBarProgress {
2413 height: 100%;
2414 width: 0%;
2415}
2416
2417div.loadingBar div.loadingBarProgress div.loadingBarProgress_left {
2418 height: 100%;
2419 max-width: 8px;
2420 //background: url(./images/old/loading/loadingBarProgress.png) no-repeat 0;
2421 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat 0;
2422}
2423
2424div.loadingBar div.loadingBarProgress div.loadingBarProgress_right {
2425 position: relative;
2426 height: 100%;
2427 margin-left: 8px;
2428 //background: url(./images/old/loading/loadingBarProgress.png) no-repeat right;
2429 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat right;
2430 top: -22px;
2431}
2432
2433// -------------------------------------------
2434
2435body.iPhone .loginErrorPanel {
2436 position: absolute;
2437 min-height: 372px;
2438 box-sizing: border-box;
2439 -moz-box-sizing: border-box;
2440 -webkit-box-sizing: border-box;
2441 padding: 10px;
2442 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2443 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2444}
2445
2446body.iPhone .loginErrorPanel h2 {
2447 text-align: center;
2448 color: red;
2449 margin-top: 40px;
2450}
2451
2452// -------------------------------------------
2453
2454form.cardListSearchForm {
2455 box-sizing: border-box;
2456 -moz-box-sizing: border-box;
2457 -webkit-box-sizing: border-box;
2458 border-bottom: 1px solid #2d3642;
2459 border-top: 1px solid #6d84a2;
2460 padding: 6px;
2461 height: 45px;
2462 // background: url(./images/old/iPhone/toolbar.png) #6d84a2 repeat-x;
2463 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
2464 margin: 0px;
2465}
2466
2467form.cardListSearchForm input {
2468 margin: 7px;
2469 -webkit-appearance: searchfield;
2470 width: 200px;
2471}
2472
2473ul.cardListPanel {
2474 margin: 0px;
2475 padding: 0px;
2476 list-style-type: none;
2477 min-height: 372px;
2478}
2479
2480li.cardListItem {
2481 height: 43px;
2482 border-bottom: 1px solid #cccccc;
2483 //background: url(./images/old/iPhone/listArrow.png) no-repeat right center;
2484 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center;
2485
2486}
2487
2488li.cardListItem a {
2489 position: relative;
2490 top: -22px;
2491 left: 40px;
2492 display: block;
2493 white-space: nowrap;
2494 overflow: hidden;
2495}
2496
2497body[orientation="portrait"] li.cardListItem a {
2498 max-width: 250px;
2499}
2500
2501body[orientation="landscape"] li.cardListItem a {
2502 max-width: 400px;
2503}
2504
2505li.cardListItem img {
2506 height: 20px;
2507 width: 20px;
2508 padding: 12px 10px 0px 10px;
2509}
2510
2511li.cardListItem a {
2512 text-decoration: none;
2513 color: black;
2514 font-weight: bold;
2515 font-size: 14pt;
2516 vertical-align: 3px;
2517}
2518
2519
2520div.cardDetailPanel {
2521 position: absolute;
2522 top: 45px;
2523 min-height: 372px;
2524
2525 box-sizing: border-box;
2526 -moz-box-sizing: border-box;
2527 -webkit-box-sizing: border-box;
2528 padding: 10px;
2529 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2530 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2531}
2532
2533div.cardDetailPanel > fieldset > div.row > span.directLogin {
2534 width: 100%;
2535 box-sizing: border-box;
2536 -moz-box-sizing: border-box;
2537 -webkit-box-sizing: border-box;
2538 margin: 0;
2539 border: none;
2540 padding: 12px 10px 0 110px;
2541 height: 42px;
2542 background: none;
2543 font-size: 16px;
2544 font-weight: normal;
2545
2546 padding-left: 40px;
2547 color: black;
2548 //background: url(./images/old/iPhone/listArrow.png) no-repeat right center;
2549 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center;
2550}
2551
2552body[orientation="landscape"] div.cardDetailPanel > fieldset > div.row > span.directLogin {
2553 padding-left: 50px;
2554}
2555
2556div.cardDetailPanel h2 {
2557 margin: 0 0 8px 14px;
2558 font-size: inherit;
2559 font-weight: bold;
2560 color: #4d4d70;
2561 text-shadow: rgba(255, 255, 255, 0.75) 1px 1px 0;
2562}
2563
2564body[orientation="portrait"] > * {
2565 width: 320px;
2566}
2567
2568body[orientation="landscape"] > * {
2569 width: 480px;
2570}
2571*/ \ No newline at end of file
diff --git a/frontend/gamma/css/static.css b/frontend/gamma/css/static.css
new file mode 100644
index 0000000..9953a8d
--- a/dev/null
+++ b/frontend/gamma/css/static.css
@@ -0,0 +1,166 @@
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
26body {
27 padding: 0px;
28 margin: 0px;
29 font-family: Helvetica, Arial, Geneva, sans-serif;
30 color: #666666;
31}
32div.header {
33 padding: 20px 25px;
34 background-color: #1f2148;
35}
36div#logo {
37 background: url(./images/old/logo.png);
38 width: 150px;
39 height: 39px;
40 display: block;
41}
42h5.clipperzPayoff {
43 color: white;
44 font-size: 13pt;
45 font-weight: normal;
46 padding-left: 20px;
47 white-space: nowrap;
48 margin: 0px;
49 padding-left: 4px;
50}
51/*
52h1 {
53 font-size: 40pt;
54 color: #333366;
55}
56
57h1 span.logo_z {
58 color: #ff9400;
59}
60*/
61div.contentWrapper {
62 padding: 20px;
63}
64div.block1 {
65 float: left;
66 margin-right: 40px;
67}
68div.block2 {
69 float: left;
70}
71div.languageBlock {
72 clear: both;
73 padding-top: 20px;
74}
75div.flags {
76 float: left;
77}
78div.content {
79 float: left;
80 margin-left: 20px;
81 width: 300px;
82}
83h3 {
84 margin: 0px;
85 padding-top: 10px;
86}
87p {
88 font-size: 10pt;
89 line-height: 20px;
90}
91/* @group RSS feed */
92body.iFrame {
93 margin: 0px;
94 padding: 0px;
95 border: 0px;
96 font-family: Helvetica, Arial, Geneva, sans-serif;
97}
98div#feedContent ul {
99 list-style-type: none;
100 padding: 0px;
101 margin: 0px;
102}
103div#feedContent ul li {
104 display: none;
105}
106div#feedContent ul li.selected {
107 display: block;
108 padding-top: 6px;
109}
110div#feedContent ul li.selected em.date {
111 display: none;
112}
113div#feedContent ul li.selected a {
114 display: none;
115}
116div#feedContent ul li.selected h2 {
117 font-size: 8pt;
118 color: #c3c4cf;
119 margin: 0px;
120 border: 0px;
121 padding: 0px;
122}
123div#feedContent ul li.selected p {
124 font-size: 8pt;
125 color: #c3c4cf;
126 margin: 0px;
127 display: inline;
128 line-height: 15px;
129}
130div#feedContent ul li.selected p a {
131 font-size: 8pt;
132 color: #c3c4cf;
133 display: inline;
134}
135div.languageBlock div.flags {
136 height: 64px;
137 width: 64px;
138}
139div.languageBlock.en-us div.flags {
140 background: url(./images/old/flags/en.png);
141}
142div.languageBlock.zh-cn div.flags {
143 background: url(./images/old/flags/cn.png);
144}
145div.languageBlock.fr-fr div.flags {
146 background: url(./images/old/flags/fr.png);
147}
148div.languageBlock.it-it div.flags {
149 background: url(./images/old/flags/it.png);
150}
151div.languageBlock.ja-jp div.flags {
152 background: url(./images/old/flags/jp.png);
153}
154div.languageBlock.pt-br div.flags {
155 background: url(./images/old/flags/br.png);
156}
157div.languageBlock.es-es div.flags {
158 background: url(./images/old/flags/es.png);
159}
160div.languageBlock.ru-ru div.flags {
161 background: url(./images/old/flags/ru.png);
162}
163div.languageBlock.de-de div.flags {
164 background: url(./images/old/flags/de.png);
165}
166/* @end */
diff --git a/frontend/gamma/css/web.css b/frontend/gamma/css/web.css
index 0a72e09..3540016 100644
--- a/frontend/gamma/css/web.css
+++ b/frontend/gamma/css/web.css
@@ -151,2060 +151,3945 @@ div#loading div h3 {
151 font-size: 18pt; 151 font-size: 18pt;
152 text-shadow: -1px -1px 1px #2e316c, 1px 1px 1px #454aa1; 152 text-shadow: -1px -1px 1px #2e316c, 1px 1px 1px #454aa1;
153 color: #1f2148; 153 color: #1f2148;
154} 154}
155div#loading div h5 { 155div#loading div h5 {
156 padding-left: 20px; 156 padding-left: 20px;
157 color: #ff9200; 157 color: #ff9200;
158} 158}
159/* 159/*
160 160
161Color list: 161Color list:
162- login box: 162- login box:
163 light#ff9955 163 light#ff9955
164 dark#ff6622 164 dark#ff6622
165- login button: 165- login button:
166 regular#dd5500 166 regular#dd5500
167 hover#773311 167 hover#773311
168- login translations: 168- login translations:
169 box: #cc6622; 169 box: #cc6622;
170 not-selected: 170 not-selected:
171 color: #ddaa99 171 color: #ddaa99
172 background:#994422 172 background:#994422
173 selected: #772211; 173 selected: #772211;
174*/ 174*/
175html { 175html {
176 height: 100%; 176 height: 100%;
177} 177}
178body { 178body {
179 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 179 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
180 margin: 0px; 180 margin: 0px;
181} 181}
182div.modalDialogMask.userInfoBoxMask { 182div.modalDialogMask.userInfoBoxMask {
183 -moz-opacity: 0.0; 183 -moz-opacity: 0.0;
184 opacity: .0; 184 opacity: .0;
185 filter: alpha(opacity=0); 185 filter: alpha(opacity=0);
186 z-index: 19000; 186 z-index: 19000;
187} 187}
188.reset-margin { 188.reset-margin {
189 margin: 0px; 189 margin: 0px;
190 padding: 0px; 190 padding: 0px;
191 border: 0px; 191 border: 0px;
192} 192}
193.clear { 193.clear {
194 clear: both; 194 clear: both;
195} 195}
196.hidden_none { 196.hidden_none {
197 display: none; 197 display: none;
198 visibility: hidden; 198 visibility: hidden;
199} 199}
200.keepTogether { 200.keepTogether {
201 display: inline-block; 201 display: inline-block;
202 white-space: nowrap; 202 white-space: nowrap;
203} 203}
204#mainDiv { 204#mainDiv {
205 margin: 0 auto; 205 margin: 0 auto;
206} 206}
207div.tooltip { 207div.tooltip {
208 position: absolute; 208 position: absolute;
209 z-index: 30001; 209 z-index: 30001;
210} 210}
211div.tooltip div.tooltip_body { 211div.tooltip div.tooltip_body {
212 border-radius: 8px; 212 border-radius: 8px;
213 -moz-border-radius: 8px; 213 -moz-border-radius: 8px;
214 -webkit-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)); 215 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
239 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb); 216 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; 217 -webkit-box-shadow: 4px 4px 10px #333333;
518 -moz-box-shadow: 4px 4px 10px #333333; 218 -moz-box-shadow: 4px 4px 10px #333333;
519 box-shadow: 4px 4px 10px #333333; 219 box-shadow: 4px 4px 10px #333333;
520 border-top: 1px solid #d4d4d4; 220 border-top: 1px solid #d4d4d4;
521 border-left: 1px solid #a2a2a2; 221 border-left: 1px solid #a2a2a2;
522 border-right: 1px solid #6f6f6f; 222 border-right: 1px solid #6f6f6f;
523 border-bottom: 1px solid #3c3c3c; 223 border-bottom: 1px solid #3c3c3c;
524} 224}
525div.tooltip div.tooltip_body span { 225div.tooltip div.tooltip_body span {
526 display: block; 226 display: block;
527 padding: 10px; 227 padding: 10px;
528 font-size: 10pt; 228 font-size: 10pt;
529 color: white; 229 color: white;
530} 230}
531div.tooltip div.tooltip_body div.tooltip_text { 231div.tooltip div.tooltip_body div.tooltip_text {
532 width: 200px; 232 width: 200px;
533} 233}
534div.tooltip div.tooltip_arrow { 234div.tooltip div.tooltip_arrow {
535 position: absolute; 235 position: absolute;
536 width: 0; 236 width: 0;
537 height: 0; 237 height: 0;
538 border: 6px solid transparent; 238 border: 6px solid transparent;
539} 239}
540div.tooltip.BELOW div.tooltip_arrow { 240div.tooltip.BELOW div.tooltip_arrow {
541 top: -12px; 241 top: -12px;
542 left: 97px; 242 left: 97px;
543 border-bottom: 6px solid #bbbbbb; 243 border-bottom: 6px solid #bbbbbb;
544} 244}
545div.tooltip.ABOVE div.tooltip_arrow { 245div.tooltip.ABOVE div.tooltip_arrow {
546 position: static; 246 position: static;
547 margin-left: 97px; 247 margin-left: 97px;
548 border-top: 6px solid #555555; 248 border-top: 6px solid #555555;
549} 249}
550div.tooltip.LEFT div.tooltip_arrow { 250div.tooltip.LEFT div.tooltip_arrow {
551 left: 203px; 251 left: 203px;
552 top: 10px; 252 top: 10px;
553 border-left: 6px solid #747474; 253 border-left: 6px solid #747474;
554} 254}
555div.tooltip.LEFT div.tooltip_body div.tooltip_text { 255div.tooltip.LEFT div.tooltip_body div.tooltip_text {
556 min-height: 45px; 256 min-height: 45px;
557} 257}
558div.tooltip.RIGHT div.tooltip_arrow { 258div.tooltip.RIGHT div.tooltip_arrow {
559 left: -12px; 259 left: -12px;
560 top: 10px; 260 top: 10px;
561 border-right: 6px solid #9c9c9c; 261 border-right: 6px solid #9c9c9c;
562} 262}
563div.tooltip.RIGHT div.tooltip_body div.tooltip_text { 263div.tooltip.RIGHT div.tooltip_body div.tooltip_text {
564 min-height: 45px; 264 min-height: 45px;
565} 265}
266.button.default {
267 display: inline-block;
268 height: 20px;
269 cursor: pointer;
270 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffa76f), to(#ff6622));
271 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffa76f);
272 border-radius: 5;
273 -moz-border-radius: 5;
274 -webkit-border-radius: 5;
275 border: 1px solid #ff7f46;
276 padding-top: 4px;
277 padding-left: 15px;
278 padding-right: 15px;
279 padding-bottom: 2px;
280 color: white;
281 font-weight: lighter;
282 text-shadow: -1px -1px 1px #ff6622, 1px 1px 1px #ffa76f;
283 text-decoration: none;
284 font-weight: normal;
285}
286.button.default:hover {
287 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff8e46), to(#ff6622));
288 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff8e46);
289}
290.button {
291 display: inline-block;
292 height: 20px;
293 cursor: pointer;
294 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bfbfbf), to(#999999));
295 background: -moz-linear-gradient(0% 100% 90deg, #999999, #bfbfbf);
296 border-radius: 5;
297 -moz-border-radius: 5;
298 -webkit-border-radius: 5;
299 border: 1px solid #ababab;
300 padding-top: 4px;
301 padding-left: 15px;
302 padding-right: 15px;
303 padding-bottom: 2px;
304 color: white;
305 font-weight: lighter;
306 text-shadow: -1px -1px 1px #999999, 1px 1px 1px #bfbfbf;
307 text-decoration: none;
308}
309.button:hover {
310 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ababab), to(#999999));
311 background: -moz-linear-gradient(0% 100% 90deg, #999999, #ababab);
312}
566/* 313/*
567 314
568Color list: 315Color list:
569- login box: 316- login box:
570 light#ff9955 317 light#ff9955
571 dark#ff6622 318 dark#ff6622
572- login button: 319- login button:
573 regular#dd5500 320 regular#dd5500
574 hover#773311 321 hover#773311
575- login translations: 322- login translations:
576 box: #cc6622; 323 box: #cc6622;
577 not-selected: 324 not-selected:
578 color: #ddaa99 325 color: #ddaa99
579 background:#994422 326 background:#994422
580 selected: #772211; 327 selected: #772211;
581*/ 328*/
582html { 329html {
583 height: 100%; 330 height: 100%;
584} 331}
585body { 332body {
586 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 333 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
587 margin: 0px; 334 margin: 0px;
588} 335}
589div.modalDialogMask.userInfoBoxMask { 336div.modalDialogMask.userInfoBoxMask {
590 -moz-opacity: 0.0; 337 -moz-opacity: 0.0;
591 opacity: .0; 338 opacity: .0;
592 filter: alpha(opacity=0); 339 filter: alpha(opacity=0);
593 z-index: 19000; 340 z-index: 19000;
594} 341}
595.reset-margin { 342.reset-margin {
596 margin: 0px; 343 margin: 0px;
597 padding: 0px; 344 padding: 0px;
598 border: 0px; 345 border: 0px;
599} 346}
600.clear { 347.clear {
601 clear: both; 348 clear: both;
602} 349}
603.hidden_none { 350.hidden_none {
604 display: none; 351 display: none;
605 visibility: hidden; 352 visibility: hidden;
606} 353}
607.keepTogether { 354.keepTogether {
608 display: inline-block; 355 display: inline-block;
609 white-space: nowrap; 356 white-space: nowrap;
610} 357}
611#mainDiv { 358#mainDiv {
612 margin: 0 auto; 359 margin: 0 auto;
613} 360}
614div.pageHeaderAndBody { 361div.pageHeaderAndBody {
615 height: 100%; 362 height: 100%;
616} 363}
617body > div.pageHeaderAndBody { 364div.pageHeaderAndBody div#pageBody {
618 height: auto; 365 min-width: 1013px;
619 min-height: 100%; 366 padding-bottom: 90px;
620} 367}
621div.pageHeader { 368div.pageHeaderAndBody div.pageHeader {
622 background-color: #1f2148; 369 background-color: #1f2148;
623 min-width: 1013px; 370 min-width: 1013px;
624} 371}
625div.pageHeader div#miscLinks { 372div.pageHeaderAndBody div.pageHeader div#miscLinks {
626 float: right; 373 float: right;
627} 374}
628div.pageHeader div#miscLinks ul { 375div.pageHeaderAndBody div.pageHeader div#miscLinks ul {
629 margin: 12px 0px 0px; 376 margin: 12px 0px 0px;
630 padding: 15px; 377 padding: 15px;
631} 378}
632div.pageHeader div#miscLinks ul li { 379div.pageHeaderAndBody div.pageHeader div#miscLinks ul li {
633 display: inline; 380 display: inline;
634 margin: 0px; 381 margin: 0px;
635 padding: 0px; 382 padding: 0px;
636 border: 0px; 383 border: 0px;
637} 384}
638div.pageHeader div#miscLinks ul li a { 385div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a {
639 color: #ffffff; 386 color: #ffffff;
640 margin: 0px; 387 margin: 0px;
641 padding: 0px; 388 padding: 0px;
642 border: 0px; 389 border: 0px;
643 margin: 0px;
644 padding: 0px;
645 border: 0px;
646 margin: 0px;
647 padding: 0px;
648 border: 0px;
649 margin: 0px;
650 padding: 0px;
651 border: 0px;
652 margin: 0px;
653 padding: 0px;
654 border: 0px;
655 margin: 0px;
656 padding: 0px;
657 border: 0px;
658 padding: 15px; 390 padding: 15px;
659 border-left: 1px solid #3e428f; 391 border-left: 1px solid #3e428f;
660 font-weight: normal; 392 font-weight: normal;
661 text-decoration: none; 393 text-decoration: none;
662 font-size: 12pt; 394 font-size: 12pt;
663 min-width: 70px; 395 min-width: 70px;
664} 396}
665div.pageHeader div#miscLinks ul li a:hover { 397div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a:hover {
666 color: #b8bae1; 398 color: #b8bae1;
667} 399}
668div.pageHeader div#miscLinks ul li a#donateHeaderLink { 400div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a#donateHeaderLink {
669 border-left: 0px; 401 border-left: 0px;
670} 402}
671div.pageHeader div#logoFrame { 403div.pageHeaderAndBody div.pageHeader div#logoFrame {
672 padding: 16px 16px 60px 16px; 404 padding: 16px 16px 60px 16px;
673 min-height: 44px; 405 min-height: 44px;
674} 406}
675div.pageHeader div#logoFrame a { 407div.pageHeaderAndBody div.pageHeader div#logoFrame a {
676 color: white; 408 color: white;
677 text-decoration: none; 409 text-decoration: none;
678} 410}
679div.pageHeader div#logoFrame a canvas { 411div.pageHeaderAndBody div.pageHeader div#logoFrame a canvas {
680 margin: 0px;
681 padding: 0px;
682 border: 0px;
683 margin: 0px;
684 padding: 0px;
685 border: 0px;
686 margin: 0px;
687 padding: 0px;
688 border: 0px;
689 margin: 0px;
690 padding: 0px;
691 border: 0px;
692 margin: 0px;
693 padding: 0px;
694 border: 0px;
695 margin: 0px; 412 margin: 0px;
696 padding: 0px; 413 padding: 0px;
697 border: 0px; 414 border: 0px;
698 width: 150px; 415 width: 150px;
699 height: 39px; 416 height: 39px;
700} 417}
701div.pageHeader div#logoFrame a h5.clipperzPayoff { 418div.pageHeaderAndBody div.pageHeader div#logoFrame a h5.clipperzPayoff {
702 font-size: 13pt; 419 font-size: 13pt;
703 font-weight: normal; 420 font-weight: normal;
704 white-space: nowrap; 421 white-space: nowrap;
705 margin: 0px; 422 margin: 0px;
706 padding-left: 4px; 423 padding-left: 4px;
707} 424}
708div.pageHeader div#featureTabs table { 425div.pageHeaderAndBody div.pageHeader div#featureTabs table {
709 width: 100%; 426 width: 100%;
710 padding: 6px; 427 padding: 6px;
711 padding-left: 15px; 428 padding-left: 15px;
712 padding-right: 15px; 429 padding-right: 15px;
713 padding-bottom: 46px; 430 padding-bottom: 46px;
714} 431}
715div.pageHeader div#featureTabs table tr td { 432div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td {
716 width: 25%; 433 width: 25%;
717 vertical-align: top; 434 vertical-align: top;
718 font-size: 11pt; 435 font-size: 11pt;
719 color: white; 436 color: white;
720} 437}
721div.pageHeader div#featureTabs table tr td img { 438div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td img {
722 float: left; 439 float: left;
723} 440}
724div.pageHeader div#featureTabs table tr td span { 441div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td span {
725 display: block; 442 display: block;
726 padding: 5 10 5 85; 443 padding: 5 10 5 85;
727} 444}
728div.pageHeader div#featureTabs canvas.featureIcon { 445div.pageHeaderAndBody div.pageHeader div#featureTabs canvas.featureIcon {
729 width: 76px; 446 width: 76px;
730 height: 76px; 447 height: 76px;
731 display: block; 448 display: block;
732 float: left; 449 float: left;
733 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622)); 450 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
734 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79); 451 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
735 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
736 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
737 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
738 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
739 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
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;
751 border-radius: 38px;
752 -moz-border-radius: 38px;
753 -webkit-border-radius: 38px;
754 border-radius: 38px;
755 -moz-border-radius: 38px;
756 -webkit-border-radius: 38px;
757 border-radius: 38px;
758 -moz-border-radius: 38px;
759 -webkit-border-radius: 38px;
760 border-radius: 38px; 452 border-radius: 38px;
761 -moz-border-radius: 38px; 453 -moz-border-radius: 38px;
762 -webkit-border-radius: 38px; 454 -webkit-border-radius: 38px;
763} 455}
764div.pageHeader div#news { 456div.pageHeaderAndBody div.pageHeader div#news {
765 top: -82px; 457 top: -82px;
766 left: 240px; 458 left: 240px;
767 width: 310px; 459 width: 310px;
768 height: 90px; 460 height: 90px;
769 position: absolute; 461 position: absolute;
770 background-color: #616475; 462 background-color: #616475;
771 -webkit-border-bottom-left-radius: 8px; 463 -webkit-border-bottom-left-radius: 8px;
772 -moz-border-radius-bottomleft: 8px; 464 -moz-border-radius-bottomleft: 8px;
773 border-bottom-left-radius: 8px; 465 border-bottom-left-radius: 8px;
774 -webkit-border-bottom-left-radius: 8px;
775 -moz-border-radius-bottomleft: 8px;
776 border-bottom-left-radius: 8px;
777 -webkit-border-bottom-left-radius: 8px;
778 -moz-border-radius-bottomleft: 8px;
779 border-bottom-left-radius: 8px;
780 -webkit-border-bottom-left-radius: 8px;
781 -moz-border-radius-bottomleft: 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;
795 -webkit-border-bottom-right-radius: 8px;
796 -moz-border-radius-bottomright: 8px;
797 border-bottom-right-radius: 8px;
798 -webkit-border-bottom-right-radius: 8px;
799 -moz-border-radius-bottomright: 8px;
800 border-bottom-right-radius: 8px;
801 -webkit-border-bottom-right-radius: 8px;
802 -moz-border-radius-bottomright: 8px;
803 border-bottom-right-radius: 8px;
804 -webkit-border-bottom-right-radius: 8px;
805 -moz-border-radius-bottomright: 8px;
806 border-bottom-right-radius: 8px;
807 -webkit-border-bottom-left-radius: 8px;
808 -moz-border-radius-bottomleft: 8px;
809 border-bottom-left-radius: 8px;
810 -webkit-border-bottom-left-radius: 8px;
811 -moz-border-radius-bottomleft: 8px;
812 border-bottom-left-radius: 8px;
813 -webkit-border-bottom-left-radius: 8px;
814 -moz-border-radius-bottomleft: 8px;
815 border-bottom-left-radius: 8px;
816 -webkit-border-bottom-left-radius: 8px;
817 -moz-border-radius-bottomleft: 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;
831 -webkit-border-bottom-right-radius: 8px;
832 -moz-border-radius-bottomright: 8px;
833 border-bottom-right-radius: 8px;
834 -webkit-border-bottom-right-radius: 8px;
835 -moz-border-radius-bottomright: 8px;
836 border-bottom-right-radius: 8px;
837 -webkit-border-bottom-right-radius: 8px;
838 -moz-border-radius-bottomright: 8px;
839 border-bottom-right-radius: 8px;
840 -webkit-border-bottom-right-radius: 8px;
841 -moz-border-radius-bottomright: 8px;
842 border-bottom-right-radius: 8px;
843 -webkit-border-bottom-left-radius: 8px;
844 -moz-border-radius-bottomleft: 8px;
845 border-bottom-left-radius: 8px;
846 -webkit-border-bottom-left-radius: 8px;
847 -moz-border-radius-bottomleft: 8px;
848 border-bottom-left-radius: 8px;
849 -webkit-border-bottom-left-radius: 8px;
850 -moz-border-radius-bottomleft: 8px;
851 border-bottom-left-radius: 8px;
852 -webkit-border-bottom-left-radius: 8px;
853 -moz-border-radius-bottomleft: 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;
867 -webkit-border-bottom-right-radius: 8px;
868 -moz-border-radius-bottomright: 8px;
869 border-bottom-right-radius: 8px;
870 -webkit-border-bottom-right-radius: 8px;
871 -moz-border-radius-bottomright: 8px;
872 border-bottom-right-radius: 8px;
873 -webkit-border-bottom-right-radius: 8px;
874 -moz-border-radius-bottomright: 8px;
875 border-bottom-right-radius: 8px;
876 -webkit-border-bottom-right-radius: 8px;
877 -moz-border-radius-bottomright: 8px;
878 border-bottom-right-radius: 8px;
879 -webkit-border-bottom-left-radius: 8px;
880 -moz-border-radius-bottomleft: 8px;
881 border-bottom-left-radius: 8px;
882 -webkit-border-bottom-left-radius: 8px;
883 -moz-border-radius-bottomleft: 8px;
884 border-bottom-left-radius: 8px;
885 -webkit-border-bottom-left-radius: 8px;
886 -moz-border-radius-bottomleft: 8px;
887 border-bottom-left-radius: 8px;
888 -webkit-border-bottom-left-radius: 8px;
889 -moz-border-radius-bottomleft: 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;
909 -webkit-border-bottom-right-radius: 8px;
910 -moz-border-radius-bottomright: 8px;
911 border-bottom-right-radius: 8px;
912 -webkit-border-bottom-right-radius: 8px;
913 -moz-border-radius-bottomright: 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;
936 -webkit-border-bottom-right-radius: 8px;
937 -moz-border-radius-bottomright: 8px;
938 border-bottom-right-radius: 8px;
939 -webkit-border-bottom-right-radius: 8px;
940 -moz-border-radius-bottomright: 8px;
941 border-bottom-right-radius: 8px;
942 -webkit-border-bottom-right-radius: 8px;
943 -moz-border-radius-bottomright: 8px;
944 border-bottom-right-radius: 8px;
945 -webkit-border-bottom-right-radius: 8px;
946 -moz-border-radius-bottomright: 8px;
947 border-bottom-right-radius: 8px;
948 -webkit-border-bottom-right-radius: 8px;
949 -moz-border-radius-bottomright: 8px;
950 border-bottom-right-radius: 8px;
951 -webkit-border-bottom-left-radius: 8px;
952 -moz-border-radius-bottomleft: 8px;
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; 466 -webkit-border-bottom-right-radius: 8px;
976 -moz-border-radius-bottomright: 8px; 467 -moz-border-radius-bottomright: 8px;
977 border-bottom-right-radius: 8px; 468 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; 469 -webkit-box-shadow: 2px 2px 9px #333333;
1003 -moz-box-shadow: 2px 2px 9px #333333; 470 -moz-box-shadow: 2px 2px 9px #333333;
1004 box-shadow: 2px 2px 9px #333333; 471 box-shadow: 2px 2px 9px #333333;
1005} 472}
1006div.pageHeader div#news div#newsframe { 473div.pageHeaderAndBody div.pageHeader div#news div#newsframe {
1007 margin-left: 10px; 474 margin-left: 10px;
1008 margin-right: 10px; 475 margin-right: 10px;
1009 height: 75px; 476 height: 75px;
1010 overflow: hidden; 477 overflow: hidden;
1011} 478}
1012div.pageHeader div#news div#newsframe iframe { 479div.pageHeaderAndBody div.pageHeader div#news div#newsframe iframe {
1013 width: 290px; 480 width: 290px;
1014 border: 0px; 481 border: 0px;
1015 color: #616475; 482 color: #616475;
1016 background-color: #616475; 483 background-color: #616475;
1017} 484}
1018div.pageHeader div#news div.grip { 485div.pageHeaderAndBody div.pageHeader div#news div.grip {
1019 width: 310px; 486 width: 310px;
1020 height: 12px; 487 height: 6px;
1021 margin-top: 2px; 488 margin-top: 2px;
1022 cursor: pointer; 489 cursor: pointer;
1023} 490}
1024div.pageHeader div#news div.grip div.gripHandler { 491div.pageHeaderAndBody div.pageHeader div#news div.grip div.gripHandler {
1025 margin-left: auto; 492 margin-left: auto;
1026 margin-right: auto; 493 margin-right: auto;
1027 margin-top: 8px; 494 margin-top: 8px;
1028 width: 0; 495 width: 0;
1029 height: 0; 496 height: 0;
1030 border-left: 5px solid transparent; 497 border-left: 5px solid transparent;
1031 border-right: 5px solid transparent; 498 border-right: 5px solid transparent;
1032} 499}
1033div.pageHeader div#news.open div.grip div.gripHandler { 500div.pageHeaderAndBody div.pageHeader div#news.open div.grip div.gripHandler {
1034 border-bottom: 5px solid #e9e9ec; 501 border-bottom: 5px solid #e9e9ec;
1035} 502}
1036div.pageHeader div#news.hidden div.grip div.gripHandler { 503div.pageHeaderAndBody div.pageHeader div#news.hidden div.grip div.gripHandler {
1037 border-top: 5px solid #e9e9ec; 504 border-top: 5px solid #e9e9ec;
1038} 505}
1039div.pageFooter { 506div.pageFooter {
1040 margin-top: -90px; 507 margin-top: -90px;
1041 height: 90px; 508 height: 90px;
1042 clear: both; 509 clear: both;
1043} 510}
1044div.pageFooter div.footerWrapper { 511div.pageFooter div.footerWrapper {
1045 clear: both; 512 clear: both;
1046 padding-top: 10px; 513 padding-top: 10px;
1047} 514}
1048div.pageFooter div.footerWrapper div.footerContent { 515div.pageFooter div.footerWrapper div.footerContent {
1049 background-color: #eaebe6; 516 background-color: #eaebe6;
1050 padding: 20px; 517 padding: 20px;
1051 font-size: 8pt; 518 font-size: 8pt;
1052} 519}
1053div.pageFooter div.footerWrapper div.footerContent canvas.footerStarIcon { 520div.pageFooter div.footerWrapper div.footerContent canvas.footerStarIcon {
1054 width: 40px; 521 width: 40px;
1055 height: 40px; 522 height: 40px;
1056 float: left; 523 float: left;
1057} 524}
1058div.pageFooter div.footerWrapper div.footerContent span.copyright { 525div.pageFooter div.footerWrapper div.footerContent span.copyright {
1059 padding-left: 10px; 526 padding-left: 10px;
1060 color: #a0a0a0; 527 color: #a0a0a0;
1061} 528}
1062div.pageFooter div.footerWrapper div.footerContent a { 529div.pageFooter div.footerWrapper div.footerContent a {
1063 padding-left: 50px; 530 padding-left: 50px;
1064 display: block; 531 display: block;
1065 color: #888888; 532 color: #888888;
1066 font-weight: bold; 533 font-weight: bold;
1067 text-decoration: none; 534 text-decoration: none;
1068} 535}
1069div.pageFooter div.footerWrapper div.footerContent span.applicationVersion { 536div.pageFooter div.footerWrapper div.footerContent span.applicationVersion {
1070 padding: 8px; 537 padding: 8px;
1071 color: #888888; 538 color: #888888;
1072 background-color: #d2d2d2; 539 background-color: #d2d2d2;
1073 position: relative; 540 position: relative;
1074 top: -40px; 541 top: -40px;
1075 float: right; 542 float: right;
1076} 543}
1077/* 544/*
1078 545
1079Color list: 546Color list:
1080- login box: 547- login box:
1081 light#ff9955 548 light#ff9955
1082 dark#ff6622 549 dark#ff6622
1083- login button: 550- login button:
1084 regular#dd5500 551 regular#dd5500
1085 hover#773311 552 hover#773311
1086- login translations: 553- login translations:
1087 box: #cc6622; 554 box: #cc6622;
1088 not-selected: 555 not-selected:
1089 color: #ddaa99 556 color: #ddaa99
1090 background:#994422 557 background:#994422
1091 selected: #772211; 558 selected: #772211;
1092*/ 559*/
1093html { 560html {
1094 height: 100%; 561 height: 100%;
1095} 562}
1096body { 563body {
1097 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 564 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
1098 margin: 0px; 565 margin: 0px;
1099} 566}
1100div.modalDialogMask.userInfoBoxMask { 567div.modalDialogMask.userInfoBoxMask {
1101 -moz-opacity: 0.0; 568 -moz-opacity: 0.0;
1102 opacity: .0; 569 opacity: .0;
1103 filter: alpha(opacity=0); 570 filter: alpha(opacity=0);
1104 z-index: 19000; 571 z-index: 19000;
1105} 572}
1106.reset-margin { 573.reset-margin {
1107 margin: 0px; 574 margin: 0px;
1108 padding: 0px; 575 padding: 0px;
1109 border: 0px; 576 border: 0px;
1110} 577}
1111.clear { 578.clear {
1112 clear: both; 579 clear: both;
1113} 580}
1114.hidden_none { 581.hidden_none {
1115 display: none; 582 display: none;
1116 visibility: hidden; 583 visibility: hidden;
1117} 584}
1118.keepTogether { 585.keepTogether {
1119 display: inline-block; 586 display: inline-block;
1120 white-space: nowrap; 587 white-space: nowrap;
1121} 588}
1122#mainDiv { 589#mainDiv {
1123 margin: 0 auto; 590 margin: 0 auto;
1124} 591}
1125div#loginBox { 592div#loginBox {
1126 width: 273px; 593 width: 273px;
1127 z-index: 19000; 594 z-index: 19000;
1128 top: -30px; 595 top: -30px;
1129 right: 30px; 596 right: 30px;
1130 position: relative; 597 position: relative;
1131 float: right; 598 float: right;
1132} 599}
1133div#loginBox div.header { 600div#loginBox div.header {
1134 height: 25px; 601 height: 25px;
1135 width: 273px; 602 width: 273px;
1136 background-color: #ff9b5a; 603 background-color: #ff9b5a;
1137 -webkit-border-top-left-radius: 20px; 604 -webkit-border-top-left-radius: 20px;
1138 -moz-border-radius-topleft: 20px; 605 -moz-border-radius-topleft: 20px;
1139 border-top-left-radius: 20px; 606 border-top-left-radius: 20px;
1140 -webkit-border-top-left-radius: 20px;
1141 -moz-border-radius-topleft: 20px;
1142 border-top-left-radius: 20px;
1143 -webkit-border-top-left-radius: 20px;
1144 -moz-border-radius-topleft: 20px;
1145 border-top-left-radius: 20px;
1146 -webkit-border-top-left-radius: 20px;
1147 -moz-border-radius-topleft: 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;
1227 -webkit-border-top-right-radius: 20px;
1228 -moz-border-radius-topright: 20px;
1229 border-top-right-radius: 20px;
1230 -webkit-border-top-right-radius: 20px;
1231 -moz-border-radius-topright: 20px;
1232 border-top-right-radius: 20px;
1233 -webkit-border-top-right-radius: 20px;
1234 -moz-border-radius-topright: 20px;
1235 border-top-right-radius: 20px;
1236 -webkit-border-top-right-radius: 20px;
1237 -moz-border-radius-topright: 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;
1248 -webkit-border-top-left-radius: 20px;
1249 -moz-border-radius-topleft: 20px;
1250 border-top-left-radius: 20px;
1251 -webkit-border-top-left-radius: 20px;
1252 -moz-border-radius-topleft: 20px;
1253 border-top-left-radius: 20px;
1254 -webkit-border-top-left-radius: 20px;
1255 -moz-border-radius-topleft: 20px;
1256 border-top-left-radius: 20px;
1257 -webkit-border-top-left-radius: 20px;
1258 -moz-border-radius-topleft: 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;
1266 -webkit-border-top-right-radius: 20px;
1267 -moz-border-radius-topright: 20px;
1268 border-top-right-radius: 20px;
1269 -webkit-border-top-right-radius: 20px;
1270 -moz-border-radius-topright: 20px;
1271 border-top-right-radius: 20px;
1272 -webkit-border-top-right-radius: 20px;
1273 -moz-border-radius-topright: 20px;
1274 border-top-right-radius: 20px;
1275 -webkit-border-top-right-radius: 20px;
1276 -moz-border-radius-topright: 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;
1287 -webkit-border-top-left-radius: 20px;
1288 -moz-border-radius-topleft: 20px;
1289 border-top-left-radius: 20px;
1290 -webkit-border-top-left-radius: 20px;
1291 -moz-border-radius-topleft: 20px;
1292 border-top-left-radius: 20px;
1293 -webkit-border-top-left-radius: 20px;
1294 -moz-border-radius-topleft: 20px;
1295 border-top-left-radius: 20px;
1296 -webkit-border-top-left-radius: 20px;
1297 -moz-border-radius-topleft: 20px;
1298 border-top-left-radius: 20px;
1299 -webkit-border-top-right-radius: 20px;
1300 -moz-border-radius-topright: 20px;
1301 border-top-right-radius: 20px;
1302 -webkit-border-top-right-radius: 20px;
1303 -moz-border-radius-topright: 20px;
1304 border-top-right-radius: 20px;
1305 -webkit-border-top-right-radius: 20px;
1306 -moz-border-radius-topright: 20px;
1307 border-top-right-radius: 20px;
1308 -webkit-border-top-right-radius: 20px;
1309 -moz-border-radius-topright: 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;
1317 -webkit-border-top-left-radius: 20px;
1318 -moz-border-radius-topleft: 20px;
1319 border-top-left-radius: 20px;
1320 -webkit-border-top-left-radius: 20px;
1321 -moz-border-radius-topleft: 20px;
1322 border-top-left-radius: 20px;
1323 -webkit-border-top-left-radius: 20px;
1324 -moz-border-radius-topleft: 20px;
1325 border-top-left-radius: 20px;
1326 -webkit-border-top-left-radius: 20px;
1327 -moz-border-radius-topleft: 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;
1341 -webkit-border-top-right-radius: 20px;
1342 -moz-border-radius-topright: 20px;
1343 border-top-right-radius: 20px;
1344 -webkit-border-top-right-radius: 20px;
1345 -moz-border-radius-topright: 20px;
1346 border-top-right-radius: 20px;
1347 -webkit-border-top-right-radius: 20px;
1348 -moz-border-radius-topright: 20px;
1349 border-top-right-radius: 20px;
1350 -webkit-border-top-right-radius: 20px; 607 -webkit-border-top-right-radius: 20px;
1351 -moz-border-radius-topright: 20px; 608 -moz-border-radius-topright: 20px;
1352 border-top-right-radius: 20px; 609 border-top-right-radius: 20px;
1353} 610}
1354div#loginBox div.body { 611div#loginBox div.body {
1355 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622)); 612 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
1356 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a); 613 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
1357 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
1358 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
1359 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
1360 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
1361 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
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);
1367} 614}
1368div#loginBox div.body h4 { 615div#loginBox div.body h4 {
1369 color: #ffffff; 616 color: #ffffff;
1370 font-size: 16pt; 617 font-size: 16pt;
1371 font-weight: normal; 618 font-weight: normal;
1372 padding-left: 20px; 619 padding-left: 20px;
1373 margin: 0px; 620 margin: 0px;
1374} 621}
1375div#loginBox div.body form.loginForm { 622div#loginBox div.body form.loginForm {
1376 padding: 5px 20px 0px; 623 padding: 5px 20px 0px;
1377 margin-bottom: 0px; 624 margin-bottom: 0px;
1378} 625}
1379div#loginBox div.body form.loginForm label { 626div#loginBox div.body form.loginForm label {
1380 color: #ffffff; 627 color: #ffffff;
1381 font-size: 10pt; 628 font-size: 10pt;
1382 display: block; 629 display: block;
1383 padding-top: 5px; 630 padding-top: 5px;
1384} 631}
1385div#loginBox div.body form.loginForm label.checkbox { 632div#loginBox div.body form.loginForm label.checkbox {
1386 display: inline; 633 display: inline;
1387} 634}
1388div#loginBox div.body form.loginForm input { 635div#loginBox div.body form.loginForm input {
1389 width: 230px; 636 width: 230px;
1390 font-size: 14pt; 637 font-size: 14pt;
1391 color: #333366; 638 color: #333366;
1392 background-color: #ffffff; 639 background-color: #ffffff;
1393 border: 1px solid #bb4924; 640 border: 1px solid #bb4924;
1394 padding: 2px 5px; 641 padding: 2px 5px;
1395 height: 28px; 642 height: 28px;
1396} 643}
1397div#loginBox div.body form.loginForm input.checkbox { 644div#loginBox div.body form.loginForm input.checkbox {
1398 margin: 10px 8px 0px 0px; 645 margin: 10px 8px 0px 0px;
1399 height: auto; 646 height: auto;
1400 width: auto; 647 width: auto;
1401 border: 0px; 648 border: 0px;
1402} 649}
1403div#loginBox div.body form.loginForm input.checkbox:hover { 650div#loginBox div.body form.loginForm input.checkbox:hover {
1404 cursor: pointer; 651 cursor: pointer;
1405} 652}
1406div#loginBox div.body form.loginForm input.otp { 653div#loginBox div.body form.loginForm input.otp {
1407 width: 57px; 654 width: 57px;
1408 display: inline; 655 display: inline;
1409 padding-left: 0px; 656 padding-left: 0px;
1410 padding-right: 0px; 657 padding-right: 0px;
1411 height: 28px; 658 height: 28px;
1412 font: 8pt monospace; 659 font: 8pt monospace;
1413} 660}
1414div#loginBox div.body form.loginForm input.submit { 661div#loginBox div.body form.loginForm input.submit {
1415 margin: 0px 45px; 662 margin: 0px 45px;
1416 width: 140px; 663 width: 140px;
1417 color: #ffffff; 664 color: #ffffff;
1418 background-color: #d44100; 665 background-color: #d44100;
1419 border: 1px solid #bb4924; 666 border: 1px solid #bb4924;
1420 padding: 6px; 667 padding: 6px;
1421 font-size: 12pt; 668 font-size: 12pt;
1422 height: auto; 669 height: auto;
1423} 670}
1424div#loginBox div.body form.loginForm input.submit:hover { 671div#loginBox div.body form.loginForm input.submit:hover {
1425 color: #ffffff; 672 color: #ffffff;
1426 background-color: #7e2700; 673 background-color: #7e2700;
1427 cursor: pointer; 674 cursor: pointer;
1428} 675}
1429div#loginBox div.body form.loginForm ul { 676div#loginBox div.body form.loginForm ul {
1430 list-style-type: none; 677 list-style-type: none;
1431 padding: 0px; 678 padding: 0px;
1432 margin: 0px; 679 margin: 0px;
1433} 680}
1434div#loginBox div.body form.loginForm ul li { 681div#loginBox div.body form.loginForm ul li {
1435 display: block; 682 display: block;
1436} 683}
1437div#loginBox div.body form.loginForm div.translations { 684div#loginBox div.body form.loginForm div.translations {
1438 margin: 15px -20px; 685 margin: 15px -20px;
1439 background-color: #c87b59; 686 background-color: #c87b59;
1440} 687}
1441div#loginBox div.body form.loginForm div.translations h4 { 688div#loginBox div.body form.loginForm div.translations h4 {
1442 font-size: 9pt; 689 font-size: 9pt;
1443 padding: 6px 20px 0px; 690 padding: 6px 20px 0px;
1444} 691}
1445div#loginBox div.body form.loginForm div.translations ul { 692div#loginBox div.body form.loginForm div.translations ul {
1446 margin: 0px; 693 margin: 0px;
1447 padding: 5px 10px 10px; 694 padding: 5px 10px 10px;
1448 margin-bottom: 15px; 695 margin-bottom: 15px;
1449} 696}
1450div#loginBox div.body form.loginForm div.translations ul li { 697div#loginBox div.body form.loginForm div.translations ul li {
1451 font-size: 8pt; 698 font-size: 8pt;
1452 color: #ddaa99; 699 color: #ddaa99;
1453 background-color: #994422; 700 background-color: #994422;
1454 display: inline-block; 701 display: inline-block;
1455 padding: 2px 4px; 702 padding: 2px 4px;
1456 margin: 1px; 703 margin: 1px;
1457} 704}
1458div#loginBox div.body form.loginForm div.translations ul li.selected { 705div#loginBox div.body form.loginForm div.translations ul li.selected {
1459 color: #ffffff; 706 color: #ffffff;
1460 background-color: #772211; 707 background-color: #772211;
1461} 708}
1462div#loginBox div.body form.loginForm div.translations ul li.selected:hover { 709div#loginBox div.body form.loginForm div.translations ul li.selected:hover {
1463 cursor: default; 710 cursor: default;
1464} 711}
1465div#loginBox div.body form.loginForm div.translations ul li:hover { 712div#loginBox div.body form.loginForm div.translations ul li:hover {
1466 cursor: pointer; 713 cursor: pointer;
1467 color: #ffffff; 714 color: #ffffff;
1468} 715}
1469div#loginBox div.footer { 716div#loginBox div.footer {
1470 height: 37px; 717 height: 37px;
1471 width: 273px; 718 width: 273px;
1472 background-color: #ff6622; 719 background-color: #ff6622;
1473 -webkit-border-bottom-left-radius: 20px; 720 -webkit-border-bottom-left-radius: 20px;
1474 -moz-border-radius-bottomleft: 20px; 721 -moz-border-radius-bottomleft: 20px;
1475 border-bottom-left-radius: 20px; 722 border-bottom-left-radius: 20px;
1476 -webkit-border-bottom-left-radius: 20px;
1477 -moz-border-radius-bottomleft: 20px;
1478 border-bottom-left-radius: 20px;
1479 -webkit-border-bottom-left-radius: 20px;
1480 -moz-border-radius-bottomleft: 20px;
1481 border-bottom-left-radius: 20px;
1482 -webkit-border-bottom-left-radius: 20px;
1483 -moz-border-radius-bottomleft: 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;
1497 -webkit-border-bottom-right-radius: 20px;
1498 -moz-border-radius-bottomright: 20px;
1499 border-bottom-right-radius: 20px;
1500 -webkit-border-bottom-right-radius: 20px;
1501 -moz-border-radius-bottomright: 20px;
1502 border-bottom-right-radius: 20px;
1503 -webkit-border-bottom-right-radius: 20px;
1504 -moz-border-radius-bottomright: 20px;
1505 border-bottom-right-radius: 20px;
1506 -webkit-border-bottom-right-radius: 20px;
1507 -moz-border-radius-bottomright: 20px;
1508 border-bottom-right-radius: 20px;
1509 -webkit-border-bottom-left-radius: 20px;
1510 -moz-border-radius-bottomleft: 20px;
1511 border-bottom-left-radius: 20px;
1512 -webkit-border-bottom-left-radius: 20px;
1513 -moz-border-radius-bottomleft: 20px;
1514 border-bottom-left-radius: 20px;
1515 -webkit-border-bottom-left-radius: 20px;
1516 -moz-border-radius-bottomleft: 20px;
1517 border-bottom-left-radius: 20px;
1518 -webkit-border-bottom-left-radius: 20px;
1519 -moz-border-radius-bottomleft: 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;
1533 -webkit-border-bottom-right-radius: 20px;
1534 -moz-border-radius-bottomright: 20px;
1535 border-bottom-right-radius: 20px;
1536 -webkit-border-bottom-right-radius: 20px;
1537 -moz-border-radius-bottomright: 20px;
1538 border-bottom-right-radius: 20px;
1539 -webkit-border-bottom-right-radius: 20px;
1540 -moz-border-radius-bottomright: 20px;
1541 border-bottom-right-radius: 20px;
1542 -webkit-border-bottom-right-radius: 20px;
1543 -moz-border-radius-bottomright: 20px;
1544 border-bottom-right-radius: 20px;
1545 -webkit-border-bottom-left-radius: 20px;
1546 -moz-border-radius-bottomleft: 20px;
1547 border-bottom-left-radius: 20px;
1548 -webkit-border-bottom-left-radius: 20px;
1549 -moz-border-radius-bottomleft: 20px;
1550 border-bottom-left-radius: 20px;
1551 -webkit-border-bottom-left-radius: 20px;
1552 -moz-border-radius-bottomleft: 20px;
1553 border-bottom-left-radius: 20px;
1554 -webkit-border-bottom-left-radius: 20px;
1555 -moz-border-radius-bottomleft: 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;
1563 -webkit-border-bottom-right-radius: 20px;
1564 -moz-border-radius-bottomright: 20px;
1565 border-bottom-right-radius: 20px;
1566 -webkit-border-bottom-right-radius: 20px;
1567 -moz-border-radius-bottomright: 20px;
1568 border-bottom-right-radius: 20px;
1569 -webkit-border-bottom-right-radius: 20px;
1570 -moz-border-radius-bottomright: 20px;
1571 border-bottom-right-radius: 20px;
1572 -webkit-border-bottom-right-radius: 20px;
1573 -moz-border-radius-bottomright: 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;
1587 -webkit-border-bottom-left-radius: 20px;
1588 -moz-border-radius-bottomleft: 20px;
1589 border-bottom-left-radius: 20px;
1590 -webkit-border-bottom-left-radius: 20px;
1591 -moz-border-radius-bottomleft: 20px;
1592 border-bottom-left-radius: 20px;
1593 -webkit-border-bottom-left-radius: 20px;
1594 -moz-border-radius-bottomleft: 20px;
1595 border-bottom-left-radius: 20px;
1596 -webkit-border-bottom-left-radius: 20px;
1597 -moz-border-radius-bottomleft: 20px;
1598 border-bottom-left-radius: 20px;
1599 -webkit-border-bottom-right-radius: 20px;
1600 -moz-border-radius-bottomright: 20px;
1601 border-bottom-right-radius: 20px;
1602 -webkit-border-bottom-right-radius: 20px;
1603 -moz-border-radius-bottomright: 20px;
1604 border-bottom-right-radius: 20px;
1605 -webkit-border-bottom-right-radius: 20px;
1606 -moz-border-radius-bottomright: 20px;
1607 border-bottom-right-radius: 20px;
1608 -webkit-border-bottom-right-radius: 20px;
1609 -moz-border-radius-bottomright: 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; 723 -webkit-border-bottom-right-radius: 20px;
1687 -moz-border-radius-bottomright: 20px; 724 -moz-border-radius-bottomright: 20px;
1688 border-bottom-right-radius: 20px; 725 border-bottom-right-radius: 20px;
1689} 726}
1690body.ext-gecko div#loginBox form.loginForm div.translations ul li { 727body.ext-gecko div#loginBox form.loginForm div.translations ul li {
1691 display: -moz-inline-box; 728 display: -moz-inline-box;
1692} 729}
1693div#featurePoints { 730div#featurePoints {
1694 min-width: 400px; 731 min-width: 400px;
1695 padding-top: 15px; 732 padding-top: 15px;
1696 padding-bottom: 20px; 733 padding-bottom: 20px;
1697 padding-left: 20px; 734 padding-left: 20px;
1698 padding-right: 330px; 735 padding-right: 330px;
1699} 736}
1700div#featurePoints table tbody tr td { 737div#featurePoints table tbody tr td {
1701 width: 50%; 738 width: 50%;
1702 vertical-align: top; 739 vertical-align: top;
1703} 740}
1704div#featurePoints div.block { 741div#featurePoints div.block {
1705 padding: 10px; 742 padding: 10px;
1706 color: #86858e; 743 color: #86858e;
1707} 744}
1708div#featurePoints div.block h3 { 745div#featurePoints div.block h3 {
1709 font-weight: normal; 746 font-weight: normal;
1710 font-size: 12pt; 747 font-size: 12pt;
1711 margin: 0px; 748 margin: 0px;
1712 padding: 5px 0px; 749 padding: 5px 0px;
1713} 750}
1714div#featurePoints div.block ul { 751div#featurePoints div.block ul {
1715 margin: 0px; 752 margin: 0px;
1716 margin-left: 20px; 753 margin-left: 20px;
1717 padding: 0px; 754 padding: 0px;
1718 list-style-position: outside; 755 list-style-position: outside;
1719} 756}
1720div#featurePoints div.block ul li { 757div#featurePoints div.block ul li {
1721 font-size: 10pt; 758 font-size: 10pt;
1722 padding: 3px 0px; 759 padding: 3px 0px;
1723} 760}
1724div.activeFeatures { 761div.activeFeatures {
1725 float: left; 762 float: left;
1726 margin-left: 20px; 763 margin-left: 20px;
1727 height: 100px; 764 height: 100px;
1728} 765}
1729div.activeFeatures a { 766div.activeFeatures a {
1730 display: inline-block; 767 display: inline-block;
1731 padding-left: 46px; 768 padding-left: 46px;
1732 color: #ff5906; 769 color: #ff5906;
1733 text-decoration: none; 770 text-decoration: none;
1734 font-size: 10pt; 771 font-size: 10pt;
1735} 772}
1736div.activeFeatures a span.payoff { 773div.activeFeatures a span.payoff {
1737 display: block; 774 display: block;
1738 font-size: 13pt; 775 font-size: 13pt;
1739 font-weight: lighter; 776 font-weight: lighter;
1740 color: #9b9689; 777 color: #9b9689;
1741 margin: 0px; 778 margin: 0px;
1742 padding: 0px; 779 padding: 0px;
1743} 780}
1744div.activeFeatures a:hover span.payoff { 781div.activeFeatures a:hover span.payoff {
1745 color: #666666; 782 color: #666666;
1746} 783}
1747div.activeFeatures div.keepTogether a { 784div.activeFeatures div.keepTogether a {
1748 padding-left: 0px; 785 padding-left: 0px;
1749} 786}
1750div.activeFeatures div.keepTogether div { 787div.activeFeatures div.keepTogether div {
1751 display: inline-block; 788 display: inline-block;
1752 padding-right: 15px; 789 padding-right: 15px;
1753} 790}
1754div.activeFeatures div.keepTogether canvas { 791div.activeFeatures div.keepTogether canvas {
1755 width: 46px; 792 width: 46px;
1756 height: 46px; 793 height: 46px;
1757 vertical-align: bottom; 794 vertical-align: bottom;
1758} 795}
1759div.activeFeatures div.createAccountLink { 796div.activeFeatures div.createAccountLink {
1760 display: inline-block; 797 display: inline-block;
1761 width: 282; 798 width: 282;
1762 height: 65px; 799 height: 65px;
800 background-image: url(./images/old/home/register.png);
1763 margin-right: 20px; 801 margin-right: 20px;
1764} 802}
1765div.activeFeatures div.createAccountLink a.createAccountLink { 803div.activeFeatures div.createAccountLink a.createAccountLink {
1766 position: relative; 804 position: relative;
1767 top: -92px; 805 top: -92px;
1768 left: 5px; 806 left: 5px;
1769} 807}
1770div.activeFeatures div.createAccountLink a.createAccountLink span.payoff { 808div.activeFeatures div.createAccountLink a.createAccountLink span.payoff {
1771 margin-top: 23px; 809 margin-top: 23px;
1772 margin-left: 40px; 810 margin-left: 40px;
1773 font-size: 17pt; 811 font-size: 17pt;
1774 color: #64626c; 812 color: #64626c;
1775} 813}
1776div.activeFeatures div.createAccountLink a.createAccountLink span.link { 814div.activeFeatures div.createAccountLink a.createAccountLink span.link {
1777 padding-left: 40px; 815 padding-left: 40px;
1778 padding-right: 50px; 816 padding-right: 50px;
1779 padding-bottom: 10px; 817 padding-bottom: 10px;
1780 font-size: 12pt; 818 font-size: 12pt;
1781} 819}
820div.activeFeatures div.createAccountLink:hover {
821 background-image: url(./images/old/home/register_selected.png);
822}
1782div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff { 823div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff {
1783 color: #54535a; 824 color: #54535a;
1784} 825}
1785div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link { 826div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link {
1786 color: white; 827 color: white;
1787} 828}
1788div.activeFeatures div.createAccountLink canvas { 829div.activeFeatures div.createAccountLink canvas {
1789 width: 282px; 830 width: 282px;
1790 height: 93px; 831 height: 93px;
1791} 832}
1792/* 833/*
1793 834
1794Color list: 835Color list:
1795- login box: 836- login box:
1796 light#ff9955 837 light#ff9955
1797 dark#ff6622 838 dark#ff6622
1798- login button: 839- login button:
1799 regular#dd5500 840 regular#dd5500
1800 hover#773311 841 hover#773311
1801- login translations: 842- login translations:
1802 box: #cc6622; 843 box: #cc6622;
1803 not-selected: 844 not-selected:
1804 color: #ddaa99 845 color: #ddaa99
1805 background:#994422 846 background:#994422
1806 selected: #772211; 847 selected: #772211;
1807*/ 848*/
1808html { 849html {
1809 height: 100%; 850 height: 100%;
1810} 851}
1811body { 852body {
1812 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 853 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
1813 margin: 0px; 854 margin: 0px;
1814} 855}
1815div.modalDialogMask.userInfoBoxMask { 856div.modalDialogMask.userInfoBoxMask {
1816 -moz-opacity: 0.0; 857 -moz-opacity: 0.0;
1817 opacity: .0; 858 opacity: .0;
1818 filter: alpha(opacity=0); 859 filter: alpha(opacity=0);
1819 z-index: 19000; 860 z-index: 19000;
1820} 861}
1821.reset-margin { 862.reset-margin {
1822 margin: 0px; 863 margin: 0px;
1823 padding: 0px; 864 padding: 0px;
1824 border: 0px; 865 border: 0px;
1825} 866}
1826.clear { 867.clear {
1827 clear: both; 868 clear: both;
1828} 869}
1829.hidden_none { 870.hidden_none {
1830 display: none; 871 display: none;
1831 visibility: hidden; 872 visibility: hidden;
1832} 873}
1833.keepTogether { 874.keepTogether {
1834 display: inline-block; 875 display: inline-block;
1835 white-space: nowrap; 876 white-space: nowrap;
1836} 877}
1837#mainDiv { 878#mainDiv {
1838 margin: 0 auto; 879 margin: 0 auto;
1839} 880}
1840div.userInfoBox { 881div.userInfoBox {
1841 position: absolute; 882 position: absolute;
1842 width: 160px; 883 width: 160px;
1843 height: 120px; 884 height: 120px;
1844 top: 100px; 885 top: 100px;
1845 left: 15px; 886 left: 15px;
1846 color: white; 887 color: white;
1847 background-color: #ff9955; 888 background-color: #ff9955;
1848 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723)); 889 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
1849 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56); 890 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; 891 border-radius: 10px;
1873 -moz-border-radius: 10px; 892 -moz-border-radius: 10px;
1874 -webkit-border-radius: 10px; 893 -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; 894 -webkit-box-shadow: 2px 2px 9px #333333;
1894 -moz-box-shadow: 2px 2px 9px #333333; 895 -moz-box-shadow: 2px 2px 9px #333333;
1895 box-shadow: 2px 2px 9px #333333; 896 box-shadow: 2px 2px 9px #333333;
1896} 897}
1897div.userInfoBox.locked { 898div.userInfoBox.locked {
1898 z-index: 19001; 899 z-index: 19001;
1899} 900}
1900div.userInfoBox.locked div.header a.lockButton { 901div.userInfoBox.locked div.header a.lockButton {
1901 background: url(../images/old/lock/locked.png) no-repeat -5px -2px; 902 background: url(./images/old/lock/locked.png) no-repeat -5px -2px;
1902} 903}
1903div.userInfoBox.locked div.header a.lockButton:hover { 904div.userInfoBox.locked div.header a.lockButton:hover {
1904 background: url(../images/old/lock/locked_hover.png) no-repeat -5px -2px; 905 background: url(./images/old/lock/locked_hover.png) no-repeat -5px -2px;
1905} 906}
1906div.userInfoBox.locked div.body a { 907div.userInfoBox.locked div.body a {
1907 display: none; 908 display: none;
1908} 909}
1909div.userInfoBox div.header { 910div.userInfoBox div.header {
1910 height: 30px; 911 height: 30px;
1911} 912}
1912div.userInfoBox div.header h1 { 913div.userInfoBox div.header h1 {
1913 font-size: 8pt; 914 font-size: 8pt;
1914 font-weight: normal; 915 font-weight: normal;
1915 margin: 0px; 916 margin: 0px;
1916 padding-top: 12px; 917 padding-top: 12px;
1917 padding-left: 12px; 918 padding-left: 12px;
1918} 919}
1919div.userInfoBox div.header a.lockButton { 920div.userInfoBox div.header a.lockButton {
1920 position: absolute; 921 position: absolute;
1921 top: 8px; 922 top: 8px;
1922 right: 12px; 923 right: 12px;
1923 display: block; 924 display: block;
1924 width: 15px; 925 width: 15px;
1925 height: 20px; 926 height: 20px;
1926 text-decoration: none; 927 text-decoration: none;
1927 background: url(../images/old/lock/unlocked.png) no-repeat -5px -2px; 928 background: url(./images/old/lock/unlocked.png) no-repeat -5px -2px;
1928} 929}
1929div.userInfoBox div.header a.lockButton:hover { 930div.userInfoBox div.header a.lockButton:hover {
1930 background: url(../images/old/lock/unlocked_hover.png) no-repeat -5px -2px; 931 background: url(./images/old/lock/unlocked_hover.png) no-repeat -5px -2px;
1931} 932}
1932div.userInfoBox div.body { 933div.userInfoBox div.body {
1933 padding: 0px 12px; 934 padding: 0px 12px;
1934} 935}
1935div.userInfoBox div.body h3 { 936div.userInfoBox div.body h3 {
1936 font-size: 11pt; 937 font-size: 11pt;
1937 font-weight: bold; 938 font-weight: bold;
1938 margin: 0px; 939 margin: 0px;
1939} 940}
1940div.userInfoBox div.body ul { 941div.userInfoBox div.body ul {
1941 font-size: 8pt; 942 font-size: 8pt;
1942 padding: 0px; 943 padding: 0px;
1943 margin: 4px 0px; 944 margin: 4px 0px;
1944 list-style-position: inside; 945 list-style-position: inside;
1945 text-shadow: #000000 0 0 0;
1946} 946}
1947div.userInfoBox div.body ul li span.number { 947div.userInfoBox div.body ul li span.number {
1948 font-weight: bold; 948 font-weight: bold;
1949 padding-right: 3px; 949 padding-right: 3px;
1950} 950}
1951div.userInfoBox div.body a { 951div.userInfoBox div.body a {
1952 display: block; 952 display: block;
1953 margin-top: 8px; 953 margin-top: 8px;
1954 border-top: 1px solid white; 954 border-top: 1px solid white;
1955 padding-top: 6px; 955 padding-top: 6px;
1956 font-size: 10pt; 956 font-size: 10pt;
1957 font-weight: bold; 957 font-weight: bold;
1958 color: #d15a22; 958 color: #d15a22;
1959 border-color: #fe9a5f; 959 border-color: #fe9a5f;
1960 text-decoration: none; 960 text-decoration: none;
1961} 961}
1962div.userInfoBox div.body a:hover { 962div.userInfoBox div.body a:hover {
1963 color: #8c3b15; 963 color: #8c3b15;
1964} 964}
1965div.sidePanels { 965div.sidePanels {
1966 float: left; 966 float: left;
1967 margin-top: 106px; 967 margin-top: 106px;
1968 margin-left: 20px; 968 margin-left: 20px;
1969 width: 160px; 969 width: 160px;
1970} 970}
1971div.sidePanels div.tabSidePanel { 971div.sidePanels div.tabSidePanel {
1972 margin-right: -10px; 972 margin-right: -10px;
1973} 973}
1974div.sidePanels div.tabSidePanel ul { 974div.sidePanels div.tabSidePanel ul {
1975 margin: 0px; 975 margin: 0px;
1976 padding-left: 0px; 976 padding-left: 0px;
1977 list-style-type: none; 977 list-style-type: none;
1978 color: #f78b46; 978 color: #f78b46;
1979} 979}
1980div.sidePanels div.tabSidePanel ul.mainTabs { 980div.sidePanels div.tabSidePanel ul.mainTabs {
1981 margin: 0px; 981 margin: 0px;
1982} 982}
1983div.sidePanels div.tabSidePanel ul.mainTabs li a { 983div.sidePanels div.tabSidePanel ul.mainTabs li a {
1984 display: block; 984 display: block;
1985 line-height: 30px; 985 line-height: 30px;
1986 height: 43px; 986 height: 43px;
1987 padding-left: 40px; 987 padding-left: 40px;
1988 color: #ff6621; 988 color: #ff6621;
1989 margin: 0px; 989 margin: 0px;
1990 font-weight: normal; 990 font-weight: normal;
1991 font-size: 13pt; 991 font-size: 13pt;
1992 text-decoration: none; 992 text-decoration: none;
1993} 993}
1994div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter { 994div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter {
1995 display: none; 995 display: none;
1996} 996}
1997div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add { 997div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add {
1998 font-size: 14pt; 998 font-size: 14pt;
1999 font-weight: bold; 999 font-weight: bold;
2000 position: relative; 1000 position: relative;
2001 top: -34px; 1001 top: -34px;
2002 right: 16px; 1002 right: 16px;
2003 background: none; 1003 background: none;
2004 color: #c0531b; 1004 color: #c0531b;
2005 padding-left: 15px; 1005 padding-left: 15px;
2006} 1006}
2007div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add:hover { 1007div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add:hover {
2008 color: white; 1008 color: white;
2009} 1009}
2010div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add span { 1010div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add span {
2011 font-size: 8pt; 1011 font-size: 8pt;
2012 vertical-align: middle; 1012 vertical-align: middle;
2013} 1013}
2014div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add h3 { 1014div.sidePanels div.tabSidePanel ul.mainTabs li div.selectionHighlighter a.add h3 {
2015 display: inline; 1015 display: inline;
2016 padding-left: 5px; 1016 padding-left: 5px;
2017} 1017}
2018div.sidePanels div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter { 1018div.sidePanels div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter {
2019 display: block; 1019 display: block;
2020 position: absolute; 1020 position: absolute;
2021 left: 154px; 1021 left: 154px;
2022 margin-top: -43px; 1022 margin-top: -43px;
2023} 1023}
2024div.sidePanels div.tabSidePanel ul.mainTabs li.cards a { 1024div.sidePanels div.tabSidePanel ul.mainTabs li.cards a {
2025 background: url(../images/old/main/tabs/cardsBackground.png) -19px -63px; 1025 background: url(./images/old/main/tabs/cardsBackground.png) -19px -63px;
2026} 1026}
2027div.sidePanels div.tabSidePanel ul.mainTabs li.cards a:hover { 1027div.sidePanels div.tabSidePanel ul.mainTabs li.cards a:hover {
2028 background: url(../images/old/main/tabs/cardsBackground.png) -19px -110px; 1028 background: url(./images/old/main/tabs/cardsBackground.png) -19px -110px;
2029} 1029}
2030div.sidePanels div.tabSidePanel ul.mainTabs li.cards.selected a { 1030div.sidePanels div.tabSidePanel ul.mainTabs li.cards.selected a {
2031 margin-left: -10px; 1031 margin-left: -10px;
2032 padding-left: 50px; 1032 padding-left: 50px;
2033 color: white; 1033 color: white;
2034 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px; 1034 background: url(./images/old/main/tabs/cardsBackground.png) -9px -14px;
2035}
2036div.sidePanels div.tabSidePanel ul.mainTabs li.cards.selected a:hover {
2037 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px;
2038}
2039div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins a {
2040 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -63px;
2041}
2042div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins a:hover {
2043 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -110px;
2044} 1035}
2045div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins.selected a { 1036div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins.selected a {
2046 margin-left: -10px; 1037 margin-left: -10px;
2047 padding-left: 50px; 1038 padding-left: 50px;
2048 color: white; 1039 color: white;
2049 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
2050} 1040}
2051div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins.selected a:hover { 1041div.sidePanels div.tabSidePanel ul.mainTabs li.directLogins.selected a:hover {
2052 color: white; 1042 color: white;
2053 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
2054} 1043}
2055div.sidePanels div.tabSidePanel ul.otherTabs { 1044div.sidePanels div.tabSidePanel ul.otherTabs {
2056 margin: 10px 0px; 1045 margin: 10px 0px;
2057} 1046}
2058div.sidePanels div.tabSidePanel ul.otherTabs li { 1047div.sidePanels div.tabSidePanel ul.otherTabs li {
2059 margin-top: -4px; 1048 margin-top: -4px;
2060} 1049}
2061div.sidePanels div.tabSidePanel ul.otherTabs li div.selectionHighlighter { 1050div.sidePanels div.tabSidePanel ul.otherTabs li div.selectionHighlighter {
2062 display: none; 1051 display: none;
2063} 1052}
2064div.sidePanels div.tabSidePanel ul.otherTabs li a { 1053div.sidePanels div.tabSidePanel ul.otherTabs li a {
2065 display: block; 1054 display: block;
2066 line-height: 36px; 1055 line-height: 36px;
2067 height: 43px; 1056 height: 43px;
2068 padding-left: 40px; 1057 padding-left: 40px;
2069 color: #ff6621; 1058 color: #ff6621;
2070 text-decoration: none; 1059 text-decoration: none;
2071} 1060}
2072div.sidePanels div.tabSidePanel ul.otherTabs li a:hover { 1061div.sidePanels div.tabSidePanel ul.otherTabs li a:hover {
2073 background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px; 1062 background: url(./images/old/main/tabs/itemsBackground.png) -10px -49px;
2074} 1063}
2075div.sidePanels div.tabSidePanel ul.otherTabs li.selected a { 1064div.sidePanels div.tabSidePanel ul.otherTabs li.selected a {
2076 margin-left: -10px; 1065 margin-left: -10px;
2077 padding-left: 50px; 1066 padding-left: 50px;
2078 background: url(../images/old/main/tabs/itemsBackground.png) 1px -96px; 1067 background: url(./images/old/main/tabs/itemsBackground.png) 1px -96px;
2079 color: white; 1068 color: white;
2080} 1069}
2081div.sidePanels div.tabSidePanel ul.otherTabs li.selected div.selectionHighlighter { 1070div.sidePanels div.tabSidePanel ul.otherTabs li.selected div.selectionHighlighter {
2082 display: block; 1071 display: block;
2083 position: absolute; 1072 position: absolute;
2084 left: 154px; 1073 left: 154px;
2085 margin-top: -42px; 1074 margin-top: -42px;
2086} 1075}
2087div.tagSidePanel { 1076div.tagSidePanel {
2088 /* 1077 /*
2089 margin-right: -8px; 1078 margin-right: -8px;
2090 1079
2091 div.tagSidePanel div.header { 1080 div.tagSidePanel div.header {
2092 height: 50px; 1081 height: 50px;
2093 background-image: url(../images/old/main/tabs/tagsBackground.png); 1082 background-image: url(./images/old/main/tabs/tagsBackground.png);
2094 } 1083 }
2095 div.tagSidePanel div.header h1 { 1084 div.tagSidePanel div.header h1 {
2096 padding-left: 52px; 1085 padding-left: 52px;
2097 padding-top: 14px; 1086 padding-top: 14px;
2098 font-size: 14pt; 1087 font-size: 14pt;
2099 font-weight: normal; 1088 font-weight: normal;
2100 color: #888888; 1089 color: #888888;
2101 } 1090 }
2102 div.tagSidePanel div.body { 1091 div.tagSidePanel div.body {
2103 background: url(../images/old/main/tabs/tagsBackground.png) -255px; 1092 background: url(./images/old/main/tabs/tagsBackground.png) -255px;
2104 } 1093 }
2105 div.tagSidePanel div.footer { 1094 div.tagSidePanel div.footer {
2106 height: 10px; 1095 height: 10px;
2107 background: url(../images/old/main/tabs/tagsBackground.png) -510px -40px; 1096 background: url(./images/old/main/tabs/tagsBackground.png) -510px -40px;
2108 } 1097 }
2109 div.tagSidePanel ul.tags { 1098 div.tagSidePanel ul.tags {
2110 margin: 0px; 1099 margin: 0px;
2111 list-style-type: none; 1100 list-style-type: none;
2112 padding: 0px; 1101 padding: 0px;
2113 } 1102 }
2114 div.tagSidePanel ul.tags li a { 1103 div.tagSidePanel ul.tags li a {
2115 display: block; 1104 display: block;
2116 font-size: 9pt; 1105 font-size: 9pt;
2117 text-decoration: none; 1106 text-decoration: none;
2118 color: #ff6621; 1107 color: #ff6621;
2119 padding: 0px 4px 0px 15px; 1108 padding: 0px 4px 0px 15px;
2120 line-height: 20px; 1109 line-height: 20px;
2121 } 1110 }
2122 div.tagSidePanel ul.tags li a:hover { 1111 div.tagSidePanel ul.tags li a:hover {
2123 background-color: #dddddd; 1112 background-color: #dddddd;
2124 } 1113 }
2125 div.tagSidePanel ul.tags li span.tagCardinality { 1114 div.tagSidePanel ul.tags li span.tagCardinality {
2126 float: right; 1115 float: right;
2127 font-size: 8pt; 1116 font-size: 8pt;
2128 color: #999999; 1117 color: #999999;
2129 margin-right: 15px; 1118 margin-right: 15px;
2130 margin-top: -17px; 1119 margin-top: -17px;
2131 } 1120 }
2132 div.tagSidePanel ul.tags li.selected a { 1121 div.tagSidePanel ul.tags li.selected a {
2133 background-color: #d4d5cf; 1122 background-color: #d4d5cf;
2134 } 1123 }
2135 div.tagSidePanel ul.tags li.selected a:hover { 1124 div.tagSidePanel ul.tags li.selected a:hover {
2136 background-color: #d4d5cf; 1125 background-color: #d4d5cf;
2137 } 1126 }
2138 div.tagSidePanel ul.tags li.selected a { 1127 div.tagSidePanel ul.tags li.selected a {
2139 font-weight: bold; 1128 font-weight: bold;
2140 } 1129 }
2141*/ 1130*/
2142} 1131}
2143div.groupSidePanel { 1132div.groupSidePanel {
2144 /* 1133 /*
2145 margin-right: -10px; 1134 margin-right: -10px;
2146 1135
2147 div.groupSidePanel div.header { 1136 div.groupSidePanel div.header {
2148 height: 50px; 1137 height: 50px;
2149 background-image: url(../images/old/main/tabs/groupsBackground.png); 1138 background-image: url(./images/old/main/tabs/groupsBackground.png);
2150 } 1139 }
2151 div.groupSidePanel div.header h1 { 1140 div.groupSidePanel div.header h1 {
2152 padding-left: 52px; 1141 padding-left: 52px;
2153 padding-top: 14px; 1142 padding-top: 14px;
2154 font-size: 14pt; 1143 font-size: 14pt;
2155 font-weight: normal; 1144 font-weight: normal;
2156 color: white; 1145 color: white;
2157 } 1146 }
2158 div.groupSidePanel div.header a { 1147 div.groupSidePanel div.header a {
2159 float: right; 1148 float: right;
2160 margin-top: -30px; 1149 margin-top: -30px;
2161 margin-right: 20px; 1150 margin-right: 20px;
2162 text-decoration: none; 1151 text-decoration: none;
2163 color: #666666; 1152 color: #666666;
2164 font-size: 9pt; 1153 font-size: 9pt;
2165 line-height: 18px; 1154 line-height: 18px;
2166 } 1155 }
2167 div.groupSidePanel div.header a:hover { 1156 div.groupSidePanel div.header a:hover {
2168 color: #444444; 1157 color: #444444;
2169 } 1158 }
2170 div.groupSidePanel div.body { 1159 div.groupSidePanel div.body {
2171 background: url(../images/old/main/tabs/groupsBackground.png) -255px; 1160 background: url(./images/old/main/tabs/groupsBackground.png) -255px;
2172 } 1161 }
2173 div.groupSidePanel div.footer { 1162 div.groupSidePanel div.footer {
2174 height: 10px; 1163 height: 10px;
2175 background: url(../images/old/main/tabs/groupsBackground.png) -510px -39px; 1164 background: url(./images/old/main/tabs/groupsBackground.png) -510px -39px;
2176 } 1165 }
2177 div.groupSidePanel ul.groups { 1166 div.groupSidePanel ul.groups {
2178 margin: 0px; 1167 margin: 0px;
2179 list-style-type: none; 1168 list-style-type: none;
2180 padding: 0px; 1169 padding: 0px;
2181 } 1170 }
2182 div.groupSidePanel ul.groups li a { 1171 div.groupSidePanel ul.groups li a {
2183 display: block; 1172 display: block;
2184 font-size: 9pt; 1173 font-size: 9pt;
2185 text-decoration: none; 1174 text-decoration: none;
2186 color: white; 1175 color: white;
2187 padding: 0px 4px 0px 15px; 1176 padding: 0px 4px 0px 15px;
2188 line-height: 20px; 1177 line-height: 20px;
2189 } 1178 }
2190 div.groupSidePanel ul.groups li a:hover { 1179 div.groupSidePanel ul.groups li a:hover {
2191 background-color: #aaaaaa; 1180 background-color: #aaaaaa;
2192 } 1181 }
2193 div.groupSidePanel ul.groups li span.groupCardinality { 1182 div.groupSidePanel ul.groups li span.groupCardinality {
2194 float: right; 1183 float: right;
2195 font-size: 8pt; 1184 font-size: 8pt;
2196 color: #dddddd; 1185 color: #dddddd;
2197 margin-right: 15px; 1186 margin-right: 15px;
2198 margin-top: -17px; 1187 margin-top: -17px;
2199 } 1188 }
2200 div.groupSidePanel ul.groups li.selected a { 1189 div.groupSidePanel ul.groups li.selected a {
2201 background-color: #bbbbbb; 1190 background-color: #bbbbbb;
2202 } 1191 }
2203 div.groupSidePanel ul.groups li.selected a:hover { 1192 div.groupSidePanel ul.groups li.selected a:hover {
2204 background-color: #bbbbbb; 1193 background-color: #bbbbbb;
2205 } 1194 }
2206 div.groupSidePanel ul.groups li.selected a { 1195 div.groupSidePanel ul.groups li.selected a {
2207 font-weight: bold; 1196 font-weight: bold;
2208 } 1197 }
2209*/ 1198*/
2210} 1199}
1200div.subPanelTabs ul {
1201 margin: 0px;
1202 margin-right: 7px;
1203 padding: 0px;
1204}
1205div.subPanelTabs ul li {
1206 display: inline-block;
1207 vertical-align: middle;
1208 height: 50px;
1209 border-right: 1px solid #eef0e3;
1210 border-bottom: 1px solid #d5d5bc;
1211}
1212div.subPanelTabs ul li.first {
1213 -webkit-border-top-left-radius: 20px;
1214 -moz-border-radius-topleft: 20px;
1215 border-top-left-radius: 20px;
1216}
1217div.subPanelTabs ul li.selected {
1218 background-color: #eef0e3;
1219 border-bottom: 1px solid #eef0e3;
1220 border-right: 1px solid #d5d5bc;
1221}
1222div.subPanelTabs ul li.selected:hover {
1223 border-right: 1px solid #d5d5bc;
1224}
1225div.subPanelTabs ul li.selected a {
1226 color: #444440;
1227}
1228div.subPanelTabs ul li:hover {
1229 border-right: 1px solid #d5d5bc;
1230 background-color: #eef0e3;
1231}
1232div.subPanelTabs ul li a {
1233 color: #787872;
1234 text-decoration: none;
1235 display: block;
1236 text-align: center;
1237 padding-top: 15px;
1238 padding-left: 20px;
1239 padding-right: 20px;
1240 font-size: 13pt;
1241}
1242div.subPanelContent {
1243 padding-top: 20px;
1244 padding-left: 30px;
1245 padding-right: 30px;
1246 min-height: 280px;
1247 color: #787872;
1248 margin: 0px 6px 0 9px;
1249}
1250div.subPanelContent h3 {
1251 margin: 0px;
1252 border: 0px;
1253 padding: 0px;
1254}
1255div.subPanelContent ul {
1256 margin: 0px;
1257 padding: 0px;
1258 list-style-type: none;
1259}
1260div.subPanelContent ul li {
1261 display: none;
1262}
1263div.subPanelContent ul li.selected {
1264 display: block;
1265}
1266.downloadOfflineCopy {
1267 display: inline-block;
1268 height: 20px;
1269 cursor: pointer;
1270 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#59bc4c), to(#448833));
1271 background: -moz-linear-gradient(0% 100% 90deg, #448833, #59bc4c);
1272 border-radius: 5;
1273 -moz-border-radius: 5;
1274 -webkit-border-radius: 5;
1275 border: 1px solid #51a23d;
1276 padding-top: 4px;
1277 padding-left: 15px;
1278 padding-right: 15px;
1279 padding-bottom: 2px;
1280 color: white;
1281 font-weight: lighter;
1282 text-shadow: -1px -1px 1px #448833, 1px 1px 1px #59bc4c;
1283 text-decoration: none;
1284}
1285.downloadOfflineCopy:hover {
1286 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#49a23d), to(#448833));
1287 background: -moz-linear-gradient(0% 100% 90deg, #448833, #49a23d);
1288}
1289div.SimpleMessagePanel {
1290 position: relative;
1291 left: -225px;
1292 top: -70px;
1293 width: 450px;
1294 height: 140px;
1295}
1296div.SimpleMessagePanel div.body {
1297 padding: 20px;
1298 padding-bottom: 15px;
1299 background-color: #f1f1ef;
1300 -webkit-box-shadow: 2px 2px 9px #333333;
1301 -moz-box-shadow: 2px 2px 9px #333333;
1302 box-shadow: 2px 2px 9px #333333;
1303 border-radius: 10;
1304 -moz-border-radius: 10;
1305 -webkit-border-radius: 10;
1306}
1307div.SimpleMessagePanel div.body h3 {
1308 font-size: 14pt;
1309 font-weight: normal;
1310 margin: 0px;
1311 padding-top: 4px;
1312 color: #787872;
1313}
1314div.SimpleMessagePanel div.body div.img {
1315 width: 50px;
1316 height: 50px;
1317 float: left;
1318 margin-right: 15px;
1319 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
1320 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
1321 border-radius: 25px;
1322 -moz-border-radius: 25px;
1323 -webkit-border-radius: 25px;
1324}
1325div.SimpleMessagePanel div.body div.img canvas {
1326 width: 50px;
1327 height: 50px;
1328}
1329div.SimpleMessagePanel div.body p {
1330 margin: 0;
1331 font-size: 10pt;
1332 font-weight: normal;
1333 color: #787872;
1334 padding-top: 10px;
1335 padding-bottom: 5px;
1336 line-height: 1.3;
1337}
1338div.SimpleMessagePanel div.body div.buttonArea {
1339 height: 40px;
1340 clear: both;
1341}
1342div.SimpleMessagePanel div.body div.buttonArea > div {
1343 float: right;
1344 margin-left: 15px;
1345 margin-top: 10px;
1346}
1347div.SimpleMessagePanel div.passphrase {
1348 padding-left: 65px;
1349}
1350div.SimpleMessagePanel div.passphrase input {
1351 width: 250px;
1352 font-size: 14pt;
1353 border: 1px solid #bb4924;
1354 color: #333366;
1355 background-color: white;
1356 padding: 2px 5px;
1357 height: 28px;
1358}
1359div.SimpleMessagePanel div.progressBarWrapper {
1360 margin-left: 80px;
1361}
1362/* @end */
1363/* @group Javascript Alert */
1364div#javaScriptAlert div.mask {
1365 position: fixed;
1366 top: 0px;
1367 left: 0px;
1368 right: 0px;
1369 bottom: 0px;
1370 background-color: black;
1371 z-index: 1001;
1372 -moz-opacity: 0.7;
1373 opacity: .70;
1374 filter: alpha(opacity=70);
1375}
1376div#javaScriptAlert div.header {
1377 height: 34px;
1378 width: 468;
1379 background-image: url(./images/old/alert/header.png);
1380}
1381div#javaScriptAlert div.body {
1382 background-image: url(./images/old/alert/body.png);
1383 padding: 0px 20px 10px 20px;
1384}
1385/*
1386div#javaScriptAlert div.body div.alert {
1387 padding-left: 100px;
1388 background: url(./images/old/alert/alert.png) no-repeat;
1389}
1390*/
1391/*div#javaScriptAlert div.body img.alert {*/
1392div#javaScriptAlert div.body div.alertLogo {
1393 float: left;
1394 background-image: url(./images/old/alert/alert.png);
1395 width: 88px;
1396 height: 88px;
1397}
1398div#javaScriptAlert div.body div.alert {
1399 padding-left: 100px;
1400}
1401div#javaScriptAlert div.footer {
1402 height: 34px;
1403 width: 468;
1404 background-image: url(./images/old/alert/footer.png);
1405}
1406div#javaScriptAlert div.message {
1407 position: relative;
1408 top: -150px;
1409 z-index: 1002;
1410 /*
1411 left: 100px;
1412 right: 100px;
1413*/
1414
1415 margin-left: auto;
1416 margin-right: auto;
1417 max-width: 468px;
1418}
1419div#javaScriptAlert div.message h1 {
1420 font-size: 16pt;
1421 margin: 0px;
1422 color: #ff5930;
1423}
1424div#javaScriptAlert div.message p {
1425 margin-top: 0px;
1426 color: #999999;
1427}
1428div#javaScriptAlert div.message h3 {
1429 font-size: 12pt;
1430 margin-bottom: 0px;
1431 color: #ff5930;
1432}
1433div#javaScriptAlert div.message h5 {
1434 margin: 0px;
1435 color: #999999;
1436}
1437/* @end */
1438/* @group Components
1439 */
1440/* @group LoginProgress */
1441div.LoginProgress {
1442 position: relative;
1443 left: -190px;
1444 top: -100px;
1445 width: 380px;
1446 height: 200px;
1447 /* background: url(./images/old/loginProgress/background.png);*/
1448
1449 background-color: #d7d7c0;
1450 -webkit-border-radius: 20px;
1451 -moz-border-radius: 20px;
1452 border-radius: 20px;
1453 -webkit-box-shadow: 5px 5px 7px rgba(0, 0, 0, 0.6);
1454 -moz-box-shadow: 5px 5px 7px rgba(0, 0, 0, 0.6);
1455 box-shadow: 5px 5px 7px rgba(0, 0, 0, 0.6);
1456}
1457div.LoginProgress div.header {
1458 height: 40px;
1459}
1460div.LoginProgress div.header h3 {
1461 font-size: 12pt;
1462 font-weight: normal;
1463 margin: 0px;
1464 color: #777777;
1465 padding-top: 13px;
1466 padding-left: 18px;
1467}
1468div.LoginProgress div.body {
1469 height: 120px;
1470 overflow: auto;
1471 padding-left: 20px;
1472 padding-right: 20px;
1473 background-color: #f1f1e9;
1474 /*
1475 margin-left: 19px;
1476 margin-right: 18px;
1477*/
1478
1479}
1480div.LoginProgress div.body div.img {
1481 margin: 10px;
1482 width: 50px;
1483 height: 50px;
1484 float: left;
1485}
1486div.LoginProgress div.body div.img.ALERT {
1487 /* background-image: url(./images/old/simpleMessageBox/Alert.png);*/
1488
1489 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1, #333333));
1490 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9955);
1491 -webkit-border-radius: 25px;
1492 -moz-border-radius: 25px;
1493 border-radius: 25px;
1494}
1495div.LoginProgress div.body div.img.ALERT canvas {
1496 width: 50px;
1497 height: 50px;
1498 /*background-image: url(./images/old/simpleMessageBox/excalmationPoint.png); */
1499
1500}
1501div.LoginProgress div.body div.loadingBar {
1502 position: relative;
1503 top: 51px;
1504 left: 60px;
1505}
1506div.LoginProgress div.body div.errorBox p {
1507 color: #787872;
1508 padding-top: 20px;
1509 padding-left: 80px;
1510}
1511div.LoginProgress div.footer {
1512 margin-left: 19px;
1513 margin-right: 18px;
1514}
1515/*
1516div.LoginProgress div.footer a {
1517 text-decoration: none;
1518 text-align: center;
1519 color: #787872;
1520 display: block;
1521 font-weight: bold;
1522 font-size: 11pt;
1523 width: 100px;
1524 margin-top: 11px;
1525 margin-left: auto;
1526 margin-right: auto;
1527}
1528*/
1529div.LoginProgress div.buttonArea {
1530 padding-top: 6px;
1531 text-align: center;
1532}
1533div.LoginProgress div.button {
1534 display: inline-block;
1535}
1536div.LoginProgress div.footer a:hover {
1537 color: #515247;
1538}
1539/* @end */
1540/* @group SimpleMessagePanel */
1541/* -> SimpleMessagePanel.less
1542div.SimpleMessagePanel {
1543 position: relative;
1544 left: -225px;
1545 top: -70px;
1546 width: 450px;
1547 height: 140px;
1548//background: url(./images/old/loginProgress/background.png);
1549 background-color: #f1f1ef;
1550 .border-radius(10);
1551}
1552//div.SimpleMessagePanel div.header {
1553// height: 17px;
1554// background: url(./images/old/simpleMessageBox/background_header.png) no-repeat;
1555}
1556div.SimpleMessagePanel div.body {
1557/ *
1558 height: 120px;
1559 overflow: auto;
1560 margin-left: 19px;
1561 margin-right: 18px;
1562* /
1563
1564// background: url(./images/old/simpleMessageBox/background_body.png) repeat-y;
1565// padding-left: 25px;
1566// padding-right: 25px;
1567// padding-top: 10px;
1568 padding: 20px;
1569 .box-shadow (2px, 2px, 9px, @Global_shadow-color);
1570}
1571div.SimpleMessagePanel div.body h3 {
1572 font-size: 14pt;
1573 font-weight: normal;
1574 margin: 0px;
1575 padding-top: 4px;
1576 color: #787872;
1577}
1578div.SimpleMessagePanel div.body div.img {
1579 width: 60px;
1580 height: 60px;
1581 float: left;
1582 margin-right: 10px;
1583
1584 .graduated-background (#ff6622, #ffad79);
1585 .border-radius(30);
1586}
1587div.SimpleMessagePanel div.body div.img canvas {
1588 width: 60px;
1589 height: 60px;
1590}
1591div.SimpleMessagePanel div.body p {
1592 margin: 0;
1593 font-size: 10pt;
1594 font-weight: normal;
1595 color: #787872;
1596 padding-top: 10px;
1597 padding-bottom: 5px;
1598 line-height: 1.3;
1599}
1600div.SimpleMessagePanel div.body div.img.ALERT {
1601// background: url(./images/old/simpleMessageBox/Alert.png) no-repeat;
1602}
1603div.SimpleMessagePanel div.body div.img.INFO {
1604// background: url(./images/old/simpleMessageBox/Info.png) no-repeat;
1605}
1606div.SimpleMessagePanel div.body div.buttonArea {
1607 height: 40px;
1608 clear: both;
1609}
1610div.SimpleMessagePanel div.body div.buttonArea > div {
1611 float: right;
1612 margin-left: 15px;
1613 margin-top: 10px;
1614}
1615div.SimpleMessagePanel div.footer {
1616 height: 25px;
1617// background: url(./images/old/simpleMessageBox/background_footer.png) no-repeat;
1618}
1619div.SimpleMessagePanel div.passphrase {
1620 padding-left: 65px;
1621}
1622div.SimpleMessagePanel div.passphrase input {
1623 width: 250px;
1624 font-size: 14pt;
1625 border: 1px solid #bb4924;
1626 color: #333366;
1627 background-color: white;
1628 padding: 2px 5px;
1629 height: 28px;
1630}
1631div.SimpleMessagePanel div.progressBarWrapper {
1632 margin-left: 80px;
1633}
1634*/
1635/* @end */
1636/* @group Button */
1637/* -> Button.less
1638div.button_wrapper {
1639 height: 32px;
1640 background: url(./images/old/button/default_left.png) no-repeat;
1641 cursor: pointer;
1642}
1643div.button_wrapper.hover {
1644 background: url(./images/old/button/hover_left.png) no-repeat;
1645}
1646div.button_wrapper.clicked {
1647 background: url(./images/old/button/clicked_left.png) no-repeat;
1648}
1649div.button_bodyWrapper {
1650 height: 32px;
1651 margin-left: 6px;
1652 padding-right: 6px;
1653 background: url(./images/old/button/default_main.png) repeat-x right 0;
1654}
1655div.button_wrapper.hover div.button_bodyWrapper {
1656 background: url(./images/old/button/hover_main.png) repeat-x right 0;
1657}
1658div.button_wrapper.clicked div.button_bodyWrapper {
1659 background: url(./images/old/button/clicked_main.png) repeat-x right 0;
1660}
1661div.button_body {
1662 text-align: center;
1663 min-width: 60px;
1664 padding: 0px 7px;
1665 padding-top: 8px;
1666}
1667div.button_body span {
1668 font-size: 11pt;
1669 color: white;
1670}
1671div.button_wrapper.default div.button_body span {
1672 font-weight: bold;
1673}
1674/ *
1675div.button_footer {
1676 margin: 0px;
1677 height: 31px;
1678 width: 6px;
1679 background: green url(./images/old/button/default_right.png) no-repeat;
1680}
1681* /
1682*/
1683/* @end */
1684/* @group Password enthropy */
1685input.entropyLevelIndicator {
1686 background: url(./images/old/passwordField/background.png) no-repeat 0 26px;
1687}
1688div.passwordEntropyWrapper {
1689 padding: 0px;
1690 border: 1px solid #bb4924;
1691 border-top: 0px;
1692 margin-bottom: 4px;
1693 background-color: white;
1694 margin-right: 3px;
1695 margin-top: -2;
1696}
1697div.passwordEntropy {
1698 height: 4px;
1699 font-size: 1pt;
1700 background: url(./images/old/entropyBackground.gif) repeat-x 0 0;
1701 line-height: 3px;
1702}
1703div.messageBox {
1704 position: absolute;
1705 width: 409px;
1706 height: 29px;
1707 top: 23px;
1708 left: 204px;
1709 background: url(./images/old/main/messageBoxBackground.png);
1710}
1711div.messageBox h3 {
1712 display: inline-block;
1713 color: #342f6b;
1714 font-weight: bold;
1715 margin: 7px 2px 0px 12px;
1716 font-size: 10pt;
1717}
1718body.ext-gecko div.messageBox h3 {
1719 display: -moz-inline-box;
1720}
1721div.messageBox h1 {
1722 color: #342f6b;
1723 display: inline;
1724 font-weight: normal;
1725 margin: 0px 1px;
1726 font-size: 9pt;
1727}
1728div.messageBox a {
1729 display: block;
1730 width: 20px;
1731 height: 20px;
1732 float: right;
1733 position: absolute;
1734 right: 5px;
1735 top: 4px;
1736 background-image: url(./images/old/main/messageBoxCloseButton.png);
1737}
1738div.messageBox a:hover {
1739 background-image: url(./images/old/main/messageBoxCloseButtonActive.png);
1740}
1741/* @end */
1742/* @group Side panels */
1743/* @end */
1744/* @end */
1745/* @group MainPanels */
1746div.mainPanels {
1747 float: left;
1748 width: 833px;
1749 margin-top: -38px;
1750 /*
1751 position: relative;
1752 width: 100%;
1753 min-height: 600px;
1754 top: -40px;
1755 left: 250px;
1756*/
1757
1758}
1759div.mainFooter {
1760 clear: both;
1761}
1762/* @end */
1763/* @group Grids */
1764/* @group grid Component */
1765/* @group delete */
1766/*div.body div.rows table.rows tbody tr td.delete */
1767div.delete,
1768div.new {
1769 padding-left: 5px;
1770 height: 19px;
1771}
1772div.new span,
1773div.delete span {
1774 margin: 0px;
1775 padding: 0px;
1776 border: 0px;
1777 display: inline-block;
1778 height: 19px;
1779 padding-right: 6px;
1780}
1781div.new span a,
1782div.delete span a {
1783 white-space: nowrap;
1784}
1785div.delete:hover {
1786 background: url(./images/old/delete_background_left.png) no-repeat 0;
1787}
1788div.delete:hover span {
1789 background: url(./images/old/delete_background.png) no-repeat right 0;
1790}
1791div.new:hover {
1792 background: url(./images/old/new_background_left.png) no-repeat 0;
1793}
1794div.new:hover span {
1795 background: url(./images/old/new_background.png) no-repeat right 0;
1796}
1797/*
1798tr.selected div.delete {
1799 background: url(./images/old/delete_background_left.png) no-repeat 0;
1800}
1801tr.selected div.delete span {
1802 background: url(./images/old/delete_background.png) no-repeat right 0;
1803}
1804*/
1805div.body div.rows table.rows tbody tr td.delete div.delete span a {
1806 visibility: hidden;
1807 font-size: 8pt;
1808 vertical-align: -13px;
1809 color: black;
1810}
1811div.body div.rows table.rows tbody tr.selected td.delete div.delete span a {
1812 visibility: visible;
1813}
1814div.body div.rows table.rows tbody tr:hover td.delete div.delete span a {
1815 visibility: visible;
1816}
1817div.body div.rows table.rows tbody tr:hover td.delete div.delete:hover span a {
1818 color: white;
1819}
1820/*
1821div.body div.rows table.rows tbody tr.selected td.delete div.delete span a {
1822 color: white;
1823}
1824*/
1825/* @end */
1826/* @group header */
1827div.gridComponent table.rows thead tr th {
1828 text-align: left;
1829 height: 30px;
1830 vertical-align: bottom;
1831}
1832div.gridComponent table.rows thead tr th.sortable span {
1833 cursor: pointer;
1834}
1835div.gridComponent table.rows thead tr th.sortable span a {
1836 margin-left: 5px;
1837 padding-left: 10px;
1838}
1839div.gridComponent table.rows thead tr th.directLoginTH {
1840 width: 420px;
1841}
1842div.gridComponent table.rows thead tr th.latestUpdateTH {
1843 width: 100px;
1844}
1845div.gridComponent table.rows thead tr th.commandsTH {
1846 width: 150px;
1847}
1848div.gridComponent table.rows thead a {
1849 text-decoration: none;
1850}
1851div.gridComponent table.rows thead span {
1852 font-weight: normal;
1853 font-size: 9pt;
1854 line-height: 20px;
1855}
1856div.gridComponent div.header div.headerSlot {
1857 float: right;
1858}
1859/* @end */
1860div.mainPanels div.gridComponent div.body table.rows td.favicon {
1861 padding-left: 25px;
1862}
1863div.mainPanels div.gridComponent div.body table.rows td.favicon img {
1864 width: 16px;
1865 height: 16px;
1866 border: 0px;
1867}
1868/* @end */
1869/* @group Card Grid */
1870/* @group DirectLogin links */
1871div.gridComponent th.directLoginTH span {
1872 margin-left: 7px;
1873}
1874td.card_directLogins div {
1875 display: inline-table;
1876}
1877td.card_directLogins span {
1878 display: inline-block;
1879}
1880/*
1881td.card_directLogins a {
1882 display: inline-table;
1883 height: 19px;
1884
1885 padding-right: 7px;
1886}
1887
1888td.card_directLogins a:hover {
1889 background: url(./images/old/directLink_background.png) right 0;
1890}
1891*/
1892div.card_directLogin {
1893 display: inline-block;
1894 height: 19px;
1895 padding-left: 7px;
1896}
1897div.card_directLogin_ellipses span {
1898 padding-bottom: 2px;
1899}
1900div.card_directLogin div.card_directLogin_body {
1901 display: inline-block;
1902 height: 19px;
1903 padding-right: 8px;
1904 background-position: left;
1905}
1906div.card_directLogin div.card_directLogin_body a {
1907 vertical-align: -14px;
1908}
1909/*div.card_directLogin:hover {*/
1910div.card_directLogin:hover {
1911 background: url(./images/old/directLink_background_left.png) no-repeat 0 0;
1912}
1913/*div.card_directLogin:hover div {*/
1914div.card_directLogin:hover div.card_directLogin_body {
1915 background: url(./images/old/directLink_background.png) right 0;
1916}
1917/* @group DirectLogin Popup */
1918div.DirectLoginListPopup {
1919 position: absolute;
1920 width: 184px;
1921}
1922div.DirectLoginListPopup div.DirectLoginListPopup_body {
1923 background-image: url(./images/old/directLogins_background.png);
1924 padding-top: 8px;
1925}
1926div.DirectLoginListPopup div.DirectLoginListPopup_footer {
1927 height: 8px;
1928 background-image: url(./images/old/directLogins_background_bottom.png);
1929}
1930div.DirectLoginListPopup div.DirectLoginListPopup_body ul {
1931 margin: 0px;
1932 padding-left: 13px;
1933 list-style: none;
1934}
1935div.DirectLoginListPopup div.DirectLoginListPopup_body ul li {
1936 padding-top: 4px;
1937 height: 20px;
1938 padding-right: 10px;
1939 white-space: nowrap;
1940}
1941div.DirectLoginListPopup div.DirectLoginListPopup_body ul li div {
1942 padding-right: 10px;
1943 overflow: hidden;
1944}
1945div.DirectLoginListPopup div.DirectLoginListPopup_body ul li img.favicon {
1946 padding-left: 9px;
1947 padding-right: 5px;
1948}
1949div.DirectLoginListPopup div.DirectLoginListPopup_body ul li a {
1950 text-decoration: none;
1951 color: white;
1952 font-weight: normal;
1953 font-size: 10pt;
1954 vertical-align: 3px;
1955 white-space: nowrap;
1956 padding-right: 8px;
1957}
1958div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover {
1959 /* background-color: #a5a696;*/
1960
1961 /* background-color: #7b7d70;*/
1962
1963 background-color: rgba(123, 125, 112, 0.5);
1964}
1965div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover a {
1966 background: url(./images/old/directLink_no_background.png) right;
1967}
1968/* @end */
1969/* @end */
1970div.mainPanels div.gridComponent div.header {
1971 /*
1972 height: 90px;
1973 background: url(./images/old/main/blocks/cardGridBackground.png) no-repeat;
1974*/
1975
1976 background: url(./images/old/main/blocks/cardGridBackground.png) no-repeat;
1977 padding-left: 40px;
1978 padding-right: 40px;
1979 padding-top: 20px;
1980 padding-bottom: 10px;
1981}
1982div.mainPanels div.gridComponent div.header form.search {
1983 height: 32px;
1984 margin: 0px;
1985}
1986div.mainPanels div.gridComponent div.header form.search div.clearSearchButton {
1987 position: absolute;
1988 margin-left: 192px;
1989 width: 22px;
1990 height: 22px;
1991 margin-top: 6px;
1992 background: url(./images/old/filter/clearFilter_notSelected.png) no-repeat;
1993}
1994div.mainPanels div.gridComponent div.header form.search div.clearSearchButton:hover {
1995 background: url(./images/old/filter/clearFilter_selected.png) no-repeat;
1996 cursor: pointer;
1997}
1998div.mainPanels div.gridComponent div.header form.search div.search {
1999 display: block;
2000 float: left;
2001 width: 217px;
2002}
2003div.mainPanels div.gridComponent div.header form.search input.search {
2004 border: 1px solid #76786a;
2005 color: #666666;
2006 font-size: 12pt;
2007 width: 100%;
2008 padding: 4px;
2009 padding-left: 24px;
2010 padding-right: 26px;
2011 background: #e8ecde url(./images/old/main/grid/search.png) no-repeat 2px 4px;
2012}
2013div.mainPanels div.gridComponent div.header form.search input.search.disabled {
2014 disabled: disabled;
2015}
2016div.mainPanels div.gridComponent div.header form.search input.search.running {
2017 background: #e8ecde url(./images/old/main/grid/running_search.gif) no-repeat 4px 5px;
2018}
2019div.mainPanels div.gridComponent div.body {
2020 clear: both;
2021 background: url(./images/old/main/blocks/cardGridBackground.png) repeat-y -836px;
2022}
2023div.mainPanels div.gridComponent div.footer {
2024 background: url(./images/old/main/blocks/cardGridBackground.png) 834px -28px;
2025 height: 35px;
2026}
2027div.mainPanels div.gridComponent div.body h1 {
2028 margin: 0px;
2029}
2030div.mainPanels div.gridComponent div.body div.rows {
2031 margin-left: 9px;
2032 margin-right: 6px;
2033 min-height: 582px;
2034 background: url(./images/old/main/blocks/cardGridStripes.png) 0 7px;
2035}
2036div.mainPanels div.gridComponent.noRows div.body table.rows thead,
2037div.mainPanels div.gridComponent.empty div.body table.rows thead {
2038 visibility: hidden;
2039}
2040div.mainPanels div.gridComponent.empty div.body div.rows {
2041 background: #eaebe6 url(./images/old/lock/background_star.png) no-repeat center center;
2042}
2043div.mainPanels div.gridComponent.noRows div.body div.rows {
2044 background: #eaebe6;
2045}
2046div.mainPanels div.gridComponent div.body table.rows {
2047 display: block;
2048 width: 100%;
2049}
2050div.mainPanels div.gridComponent div.body table.rows tbody tr.odd.selected {
2051 background-color: #a5a696;
2052}
2053div.mainPanels div.gridComponent div.body table.rows tbody tr.even.selected {
2054 background-color: #a5a696;
2055}
2056div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td a {
2057 color: #f3f4eb;
2058}
2059div.mainPanels div.gridComponent div.body table.rows tbody tr.odd {
2060 background-color: #d4d5cf;
2061}
2062div.mainPanels div.gridComponent div.body table.rows tbody tr.even {
2063 background-color: #eaebe6;
2064}
2065div.mainPanels div.gridComponent div.body table.rows tbody tr.odd:hover {
2066 background-color: #a5a696;
2067}
2068div.mainPanels div.gridComponent div.body table.rows tbody tr.even:hover {
2069 background-color: #a5a696;
2070}
2071div.mainPanels div.gridComponent div.body table.rows tbody tr td {
2072 height: 23px;
2073 max-height: 23px;
2074 /*
2075 white-space: nowrap;
2076 overflow: hidden;
2077*/
2078
2079}
2080div.mainPanels div.gridComponent div.body table.rows tbody tr td span {
2081 color: #828479;
2082 font-size: 10pt;
2083}
2084div.mainPanels div.gridComponent div.body table.rows tbody tr td a {
2085 color: #828479;
2086 font-size: 10pt;
2087 text-decoration: none;
2088}
2089div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td span {
2090 color: #f3f4eb;
2091}
2092div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td span {
2093 color: #f3f4eb;
2094}
2095div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td a {
2096 color: #f3f4eb;
2097}
2098div.mainPanels div.gridComponent div.body table.rows tbody tr td.title a {
2099 font-weight: bold;
2100}
2101div.mainPanels div.gridComponent div.body table.rows tbody tr td img.favicon {
2102 float: right;
2103 padding-right: 6px;
2104}
2105/* @group header */
2106div.gridComponent table.rows thead img {
2107 padding-left: 10px;
2108 vertical-align: middle;
2109}
2110div.gridComponent table.rows thead tr th {
2111 background-color: #eaebe6;
2112 border-bottom: 1px solid #b3b4af;
2113}
2114div.gridComponent table.rows thead span {
2115 color: #8c8f7e;
2116}
2117div.gridComponent table.rows thead tr th.unsorted span.sortable a {
2118 background-image: url(./images/old/main/grid/unsorted.png);
2119}
2120div.gridComponent table.rows thead tr th.descending span.sortable a {
2121 background-image: url(./images/old/main/grid/descending.png);
2122}
2123div.gridComponent table.rows thead tr th.ascending span.sortable a {
2124 background-image: url(./images/old/main/grid/ascending.png);
2125}
2126div.gridComponent table.rows thead tr th.faviconTH {
2127 width: 53px;
2128}
2129div.gridComponent table.rows thead tr th.titleTH {
2130 width: 200px;
2131 max-width: 200px;
2132}
2133div.gridComponent table.rows thead tr th.deleteTH {
2134 width: 50px;
2135}
2136/* @end */
2137/* @end */
2138/* @group Direct login Grid */
2139/*
2140div.mainPanels div.directLoginGrid div.header {
2141/*
2142 height: 90px;
2143 background: url(./images/old/main/blocks/cardGridBackground.png) no-repeat;
2144* /
2145}
2146
2147div.mainPanels div.directLoginGrid div.header form.search {
2148 background: url(./images/old/main/blocks/directLoginGridBackground.png) no-repeat;
2149 padding-left: 40px;
2150 padding-top: 20px;
2151 padding-bottom: 10px;
2152 margin: 0px;
2153}
2154
2155div.mainPanels div.directLoginGrid div.header form.search input.search {
2156 border: 1px solid #76786a;
2157 color: #666666;
2158 font-size: 12pt;
2159 padding: 4px;
2160 background-color: #e8ecde;
2161}
2162
2163div.mainPanels div.directLoginGrid div.header form.search input.searchButton {
2164 background-color: #858877;
2165 border: 0px;
2166 color: white;
2167 font-size: 10pt;
2168}
2169
2170div.mainPanels div.directLoginGrid div.body {
2171 background: url(./images/old/main/blocks/directLoginGridBackground.png) repeat-y -836px;
2172}
2173
2174div.mainPanels div.directLoginGrid div.footer {
2175 background: url(./images/old/main/blocks/directLoginGridBackground.png) 834px -28px;
2176 height: 35px;
2177}
2178
2179div.mainPanels div.directLoginGrid div.body h1 {
2180 margin: 0px;
2181}
2182
2183div.mainPanels div.directLoginGrid div.body div.rows {
2184 margin-left: 9px;
2185 margin-right: 6px;
2186 min-height: 582px;
2187 background: url(./images/old/main/blocks/directLoginGridStripes.png) 0 7px;
2188}
2189
2190div.mainPanels div.directLoginGrid div.body table.rows {
2191 display: block;
2192 width: 100%;
2193}
2194
2195div.mainPanels div.directLoginGrid div.body table.rows img {
2196 border: 0px;
2197}
2198
2199div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even {
2200 background-color: #787666;
2201}
2202
2203div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd {
2204 background-color: #646351;
2205}
2206
2207div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd:hover {
2208 background-color: #d1d4c6;
2209}
2210
2211div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even:hover {
2212 background-color: #d1d4c6;
2213}
2214
2215div.mainPanels div.directLoginGrid div.body table.rows tbody tr td {
2216 height: 23px;
2217 color: #e1e0d6;
2218 font-size: 10pt;
2219}
2220
2221div.mainPanels div.directLoginGrid div.body table.rows tbody tr:hover td {
2222 color: #777867;
2223}
2224
2225div.mainPanels div.directLoginGrid div.body table.rows tbody tr td.title {
2226 font-weight: bold;
2227}
2228
2229div.directLoginGrid div.body table.rows tbody tr a {
2230 color: #e1e0d6;
2231 text-decoration: none;
2232}
2233
2234div.directLoginGrid div.body table.rows tbody tr:hover a {
2235 color: #777867;
2236}
2237*/
2238/* @group DirectLogin links */
2239/*
2240td.card_directLogins div {
2241 display: inline-table;
2242}
2243
2244td.card_directLogins span {
2245 display: inline-table;
2246}
2247*/
2248div.directLogin_directLogin {
2249 display: inline-block;
2250 height: 19px;
2251 padding-left: 7px;
2252}
2253div.directLogin_directLogin div.directLogin_directLogin_body {
2254 display: inline-block;
2255 height: 19px;
2256 padding-right: 8px;
2257 background-position: left;
2258}
2259div.directLogin_directLogin div.directLogin_directLogin_body a {
2260 vertical-align: -14px;
2261}
2262div.directLogin_directLogin:hover {
2263 background: url(./images/old/directLink_background_left.png) no-repeat 0 0;
2264}
2265div.directLogin_directLogin:hover div.directLogin_directLogin_body {
2266 background: url(./images/old/directLink_background.png) right 0;
2267}
2268table.rows tbody tr td div.directLogin_directLogin:hover div.directLogin_directLogin_body a {
2269 color: #f3f4eb;
2270}
2271/* @end */
2272/* @group header */
2273div.directLoginGrid table.rows thead span {
2274 color: #e1e0d6;
2275}
2276div.directLoginGrid table.rows thead tr th {
2277 background-color: #787762;
2278 border-bottom: 1px solid #999883;
2279}
2280div.directLoginGrid table.rows thead tr th.faviconTH {
2281 min-width: 53px;
2282 width: 53px;
2283}
2284div.directLoginGrid table.rows thead tr th.titleTH {
2285 min-width: 250px;
2286 width: 250px;
2287}
2288div.directLoginGrid table.rows thead tr th.titleTH span {
2289 margin-left: 7px;
2290}
2291div.directLoginGrid table.rows thead tr th.strengthTH {
2292 width: 100px;
2293}
2294div.directLoginGrid table.rows thead tr th.cardTitleTH {
2295 width: 400px;
2296}
2297div.directLoginGrid table.rows thead tr th.bookmarkableLinkTH {
2298 width: 64px;
2299}
2300div.directLoginGrid table.rows thead tr th.deleteTH {
2301 width: 50px;
2302}
2303div.directLoginGrid table.rows thead tr th.latestAccessTH {
2304 width: 100px;
2305}
2306div.directLoginGrid table.rows thead tr th.commandsTH {
2307 width: 100px;
2308}
2309/*
2310div.directLoginGrid table.rows thead a {
2311 font-weight: normal;
2312 text-decoration: none;
2313 color: #e9e9df;
2314 font-size: 9pt;
2315 line-height: 20px;
2316}
2317*/
2318div.directLoginGrid table.rows thead img {
2319 padding-left: 10px;
2320 vertical-align: middle;
2321}
2322div.directLoginGrid table.rows thead tr th.unsorted span.sortable a {
2323 background: url(./images/old/main/grid/directLogins/unsorted.png) no-repeat;
2324}
2325div.directLoginGrid table.rows thead tr th.descending span.sortable a {
2326 background: url(./images/old/main/grid/directLogins/descending.png) no-repeat;
2327}
2328div.directLoginGrid table.rows thead tr th.ascending span.sortable a {
2329 background: url(./images/old/main/grid/directLogins/ascending.png) no-repeat;
2330}
2331/* @end */
2332/* @end */
2333/* @end */
2334/* @end */
2335/* @group other Panels */
2336/* @group common styles */
2337/*
2338div.subPanelTabs ul {
2339 margin: 0px;
2340 margin-right: 7px;
2341 padding: 0px;
2342}
2343div.subPanelTabs ul li {
2344 display: inline-block;
2345 vertical-align: middle;
2346 /*width: 130px; * /
2347
2348 height: 50px;
2349 /*border-right: 1px solid #a5a79c;
2350 border-bottom: 1px solid #a5a79c;* /
2351
2352 border-right: 1px solid #eef0e3;
2353 border-bottom: 1px solid #d5d5bc;
2354}
2355div.subPanelTabs ul li.first:hover {
2356 /*background: url(./images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px; * /
2357
2358}
2359div.subPanelTabs ul li:hover {
2360 /*background: url(./images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px; * /
2361
2362 border-right: 1px solid #d5d5bc;
2363 background-color: #eef0e3;
2364}
2365div.subPanelTabs ul li a {
2366 color: #787872;
2367 text-decoration: none;
2368 display: block;
2369 text-align: center;
2370 padding-top: 15px;
2371 padding-left: 20px;
2372 padding-right: 20px;
2373 font-size: 13pt;
2374}
2375div.subPanelTabs ul li.first {
2376 /*background: url(./images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px; * /
2377
2378 -webkit-border-top-left-radius: 20px;
2379 -moz-border-radius-topleft: 20px;
2380 border-top-left-radius: 20px;
2381}
2382div.subPanelTabs ul li.selected {
2383 /*background: url(./images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px; * /
2384
2385 background-color: #eef0e3;
2386 border-bottom: 1px solid #eef0e3;
2387 border-right: 1px solid #d5d5bc;
2388}
2389div.subPanelTabs ul li.selected:hover {
2390 border-right: 1px solid #d5d5bc;
2391}
2392div.subPanelTabs ul li.selected a {
2393 color: #444440;
2394}
2395div.subPanelContent {
2396 padding-top: 20px;
2397 padding-left: 30px;
2398 padding-right: 30px;
2399 min-height: 280px;
2400 color: #787872;
2401 margin: 0px 6px 0 9px;
2402}
2403div.subPanelContent ul {
2404 margin: 0px;
2405 padding: 0px;
2406 list-style-type: none;
2407}
2408div.subPanelContent ul li.selected {
2409 display: block;
2410}
2411div.subPanelContent ul li {
2412 display: none;
2413}
2414div.subPanelContent h3 {
2415 margin: 0px;
2416 border: 0px;
2417 padding: 0px;
2418}
2419*/
2420/* @end */
2421/* @group mainPanels otherPanel */
2422div.mainPanels div.otherPanel {
2423 margin: 5px 10px;
2424 background-color: #eef0e3;
2425 -webkit-border-radius: 20px;
2426 -moz-border-radius: 20px;
2427 border-radius: 20px;
2428 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2429 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2430 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2431}
2432div.mainPanels div.otherPanel div.header {
2433 /*background: url(./images/old/main/blocks/otherPanelBackground.png) no-repeat; */
2434
2435 /*
2436 height: 90px;
2437*/
2438
2439 background-color: #d5d5bc;
2440 /*padding-left: 9px;
2441 padding-top: 5px; */
2442
2443 margin: 0px;
2444 margin-bottom: 0px;
2445 -webkit-border-top-left-radius: 20px;
2446 -webkit-border-top-right-radius: 20px;
2447 -moz-border-radius-topleft: 20px;
2448 -moz-border-radius-topright: 20px;
2449 border-top-left-radius: 20px;
2450 border-top-right-radius: 20px;
2451}
2452div.mainPanels div.otherPanel div.body {
2453 /*background: url(./images/old/main/blocks/otherPanelBackground.png) repeat-y -836px; */
2454
2455 margin: 0px;
2456 border: 0px;
2457 padding: 0px;
2458}
2459div.mainPanels div.otherPanel div.footer {
2460 /*background: url(./images/old/main/blocks/otherPanelBackground.png) 834px -18px; */
2461
2462 height: 45px;
2463}
2464div.mainPanels div.otherPanel div.body h1 {
2465 margin: 0px;
2466}
2467/* @end */
2468/* @group Account */
2469form.changePassphrase div.currentCredentials,
2470form.changePassphrase div.newPassphrase {
2471 float: left;
2472 padding: 10px 20px;
2473}
2474form.changePassphrase label {
2475 display: inline-block;
2476 width: 150px;
2477}
2478form.changePassphrase div.confirm {
2479 clear: both;
2480 padding: 10px 20px;
2481}
2482form.changePassphrase div.confirm label {
2483 width: 500px;
2484}
2485div.accountPanel h3.manageOTP {
2486 margin-top: 20px;
2487 margin-left: -20px;
2488 padding-top: 10px;
2489 padding-left: 20px;
2490 border-top: 1px solid #aaaaaa;
2491}
2492/* @end */
2493/* @end */
2494/* @group Message Panel (?) */
2495/*
2496div.messagePanelWrapper div.mask {
2497 position: fixed;
2498 top: 0px;
2499 left: 0px;
2500 right: 0px;
2501 bottom: 0px;
2502
2503 background-color: black;
2504 z-index:50001;
2505
2506 -moz-opacity: 0.0;
2507 opacity:.0;
2508 filter: alpha(opacity=0);
2509/ *
2510 -moz-opacity: 0.7;
2511 opacity:.70;
2512 filter: alpha(opacity=70);
2513* /
2514}
2515
2516div.messagePanelFrame {
2517 border: 1px solid white;
2518 z-index:50002;
2519/ *
2520 width: 443px;
2521 height: 155px;
2522 position: fixed;
2523 top: 205px;
2524 left: 260px;
2525 margin-left: auto;
2526 margin-right: auto;
2527 max-width: 468px;
2528* /
2529}
2530
2531
2532div.messagePanel {
2533 position: fixed;
2534 z-index:50003;
2535 top: 0px;
2536 left: 0px;
2537/ *
2538 margin-left: auto;
2539 margin-right: auto;
2540 max-width: 468px;
2541 top: 200px;
2542 left: 250px;
2543 left: 100px;
2544 right: 100px;
2545* /
2546}
2547
2548 div.messagePanel div.header {
2549 height: 34px;
2550 width: 468;
2551 background-image: url(./images/old/alert/header.png);
2552}
2553
2554 div.messagePanel div.body {
2555 background-image: url(./images/old/alert/body.png);
2556 padding: 0px 20px 10px 20px;
2557 min-height: 100px;
2558}
2559/ *
2560div#javaScriptAlert div.body div.alert {
2561 padding-left: 100px;
2562 background: url(./images/old/alert/alert.png) no-repeat;
2563}
2564* /
2565
2566div.messagePanel div.body img.alert {
2567 float: left;
2568}
2569
2570div.messagePanel div.body div.alert {
2571 padding-left: 100px;
2572}
2573
2574 div.messagePanel div.footer {
2575 height: 34px;
2576 width: 468;
2577 background-image: url(./images/old/alert/footer.png);
2578}
2579
2580div.messagePanel div.message h1 {
2581 font-size: 16pt;
2582 margin: 0px;
2583 color: #ff5930;
2584}
2585
2586div.messagePanel div.message p {
2587 margin-top: 0px;
2588 color: #999999;
2589}
2590
2591div.messagePanel div.message h3 {
2592 font-size: 12pt;
2593 margin-bottom: 0px;
2594 color: #ff5930;
2595}
2596
2597div.messagePanel div.message h5 {
2598 margin: 0px;
2599 color: #999999;
2600}
2601
2602
2603*/
2604/* @end */
2605/* @group LoginProgress (?) */
2606/*
2607div#loginProgress {
2608 position: relative;
2609 left: -198px;
2610 top: -118px;
2611 width: 397px;
2612 height: 236px;
2613 background: url(./images/old/loginProgress/background.png);
2614}
2615
2616div#loginProgress div.header {
2617 height: 52px;
2618}
2619
2620div#loginProgress div.header h3 {
2621 font-size: 12pt;
2622 font-weight: normal;
2623 margin: 0px;
2624 color: #787872;
2625 padding-top: 25px;
2626 padding-left: 35px;
2627}
2628
2629div#loginProgress div.body {
2630 height: 120px;
2631 overflow: auto;
2632 margin-left: 19px;
2633 margin-right: 18px;
2634}
2635
2636div#loginProgress div.footer {
2637 margin-left: 19px;
2638 margin-right: 18px;
2639}
2640
2641div#loginProgress div.footer a {
2642 font-weight: bold;
2643 text-decoration: none;
2644 text-align: center;
2645 color: #787872;
2646 display: block;
2647 font-size: 11pt;
2648 width: 100px;
2649 margin-top: 13px;
2650 margin-left: auto;
2651 margin-right: auto;
2652}
2653
2654div#loginProgress div.footer a:hover {
2655 color: #515247;
2656}
2657
2658*/
2659/* @end */
2660div#modalDialogMask,
2661div.modalDialogMask {
2662 z-index: 20000;
2663 /* position: absolute;*/
2664
2665 position: fixed;
2666 top: 0;
2667 left: 0;
2668 -moz-opacity: 0.5;
2669 opacity: .50;
2670 filter: alpha(opacity=50);
2671 /* background-color: #cccccc;*/
2672
2673 background-color: #000000;
2674 width: 100%;
2675 height: 100%;
2676 zoom: 1;
2677}
2678div#modalDialogFrame,
2679div.modalDialogFrame {
2680 position: absolute;
2681 /* border: 1px solid white;*/
2682
2683 -moz-opacity: 0.5;
2684 opacity: .50;
2685 filter: alpha(opacity=50);
2686 background-color: #333333;
2687 z-index: 20001;
2688 -webkit-border-radius: 20px;
2689 -moz-border-radius: 20px;
2690 border-radius: 20px;
2691}
2692div#modalDialog,
2693div.modalDialog {
2694 z-index: 20001;
2695}
2696/*div#modalDialog.scrollable,*/
2697div.modalDialog.scrollable {
2698 position: absolute;
2699 top: 0;
2700 left: 50%;
2701}
2702/*div#modalDialog.fixed,*/
2703div.modalDialog.fixed {
2704 position: fixed;
2705 top: 40%;
2706 left: 50%;
2707}
2708div#modalDialog div,
2709div.modalDialog div {
2710 z-index: 20002;
2711 list-style-type: circle;
2712}
2713div.modalDialogMask.simpleMessagePanelMask {
2714 z-index: 20010;
2715}
2716div.modalDialogFrame.simpleMessagePanelMask {
2717 z-index: 20011;
2718}
2719div.modalDialog.simpleMessagePanelMask {
2720 z-index: 20011;
2721}
2722div.modalDialog.simpleMessagePanelMask div {
2723 z-index: 20012;
2724}
2725/* @group Bookmarklet */
2726div.bookmarklet div.bookmarklet_link {
2727 /*
2728 padding-top: 5px;
2729 padding-left: 4px;
2730 padding-right: 3px;
2731
2732 float: right;
2733 margin-top: 12px;
2734 margin-right: 13px;
2735*/
2736
2737 height: 34px;
2738}
2739div.bookmarklet div.bookmarklet_link a {
2740 color: #838975;
2741 text-decoration: none;
2742 font-weight: bold;
2743 font-size: 10pt;
2744 /*
2745 display: block;
2746 text-align: right;
2747 padding-top: 7px;
2748 padding-right: 11px;
2749 padding-bottom: 6px;
2750*/
2751
2752}
2753div.bookmarklet div.bookmarklet_link a div.icon {
2754 background: url(./images/old/bookmarklet/placeholder_icon.png) no-repeat 0 0;
2755 float: left;
2756 width: 34px;
2757 height: 34px;
2758}
2759div.bookmarklet div.bookmarklet_link a:hover div.icon {
2760 background: url(./images/old/bookmarklet/placeholder_selected_icon.png) no-repeat 0 0;
2761}
2762div.bookmarklet div.bookmarklet_link a div.text {
2763 display: block;
2764 float: right;
2765 background: url(./images/old/bookmarklet/placeholder.png) no-repeat right 0;
2766 white-space: nowrap;
2767 height: 34px;
2768}
2769div.bookmarklet div.bookmarklet_link a:hover div.text {
2770 background: url(./images/old/bookmarklet/placeholder_selected.png) no-repeat right 0;
2771}
2772div.bookmarklet div.bookmarklet_link a div.text span {
2773 display: block;
2774 padding-top: 10px;
2775 padding-right: 10px;
2776 padding-left: 6px;
2777 clear: both;
2778}
2779/* @end */
2780/* @group Tooltip */
2781/*
2782div#Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode {
2783 position: absolute;
2784 top: 0px;
2785 left: 0px;
2786}
2787*/
2788/* @end */
2789/* @group News */
2790/*
2791div#news {
2792 top: 11px;
2793 left: 240px;
2794 width: 353px;
2795 height: 85px;
2796 padding-top: 4px;
2797 position: absolute;
2798 overflow: hidden;
2799 background: url(./images/old/note.png) 1px 3px;
2800}
2801
2802div#news.hidden {
2803 display: none;
2804}
2805
2806div#news div.close {
2807 display: inline;
2808 margin-top: 6px;
2809 margin-left: 17px;
2810 float: left;
2811 width: 15px;
2812}
2813
2814div#news div.close a {
2815 text-decoration: none;
2816 color: #929c1b;
2817}
2818
2819div#news div.close a:hover {
2820 text-decoration: none;
2821 color: #3d420b;
2822}
2823
2824div#news div#newsframe {
2825 display: block;
2826 overflow: hidden;
2827 width: 305px;
2828 height: 70px;
2829}
2830
2831div#news div#newsframe iframe {
2832 border: 0px;
2833}
2834*/
2835/* --------------------------------------- */
2836div#news {
2837 top: -82px;
2838 left: 240px;
2839 width: 310px;
2840 height: 90px;
2841 position: absolute;
2842 /*background: url(./images/old/tips/Tips_background.png) 0 -5px; */
2843
2844 background-color: #616474;
2845 -webkit-border-bottom-right-radius: 8px;
2846 -webkit-border-bottom-left-radius: 8px;
2847 -moz-border-radius-bottomright: 8px;
2848 -moz-border-radius-bottomleft: 8px;
2849 border-bottom-right-radius: 8px;
2850 border-bottom-left-radius: 8px;
2851 -webkit-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2852 -moz-box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2853 box-shadow: 2px 2px 9px rgba(0, 0, 0, 0.6);
2854}
2855/*
2856div#news.open {
2857 background: url(./images/old/tips/Tips_open.png) 0 -5px;
2858}
2859
2860div#news.hidden {
2861 background: url(./images/old/tips/Tips_close.png) 0 -5px;
2862}
2863*/
2864/*
2865div#news div#newsframe {
2866 margin-left: 10px;
2867 margin-right: 10px;
2868 height: 75px;
2869 overflow: hidden;
2870}
2871div#news div#newsframe.loading {
2872 background: url(./images/old/loading/news.gif) no-repeat center center;
2873}
2874div#news div#newsframe iframe {
2875 width: 290px;
2876 border: 0px;
2877 color: #616474;
2878 background-color: #616474;
2879}
2880div#news div.grip {
2881 width: 310px;
2882 height: 12px;
2883 margin-top: 2px;
2884 cursor: pointer;
2885}
2886div#news.open div.grip {
2887 background: url(./images/old/tips/close.png) no-repeat center 6px;
2888}
2889div#news.hidden div.grip {
2890 background: url(./images/old/tips/open.png) no-repeat center 6px;
2891}
2892*/
2893/* @end */
2894/* @group mainDialog */
2895div.mainDialog {
2896 position: relative;
2897 left: -263px;
2898 width: 525px;
2899 height: 325px;
2900}
2901div.scrollable div.mainDialog {
2902 top: 0px;
2903}
2904div.fixed div.mainDialog {
2905 top: -118px;
2906}
2907div.mainDialog div.header {
2908 height: 55px;
2909 background: url(./images/old/cardDialog/background_header.png) no-repeat;
2910}
2911div.mainDialog div.header div.title {
2912 padding-top: 16px;
2913 padding-left: 20px;
2914 padding-right: 20px;
2915}
2916div.mainDialog div.header div.title input {
2917 width: 100%;
2918 display: block;
2919 font-size: 16pt;
2920 margin: 0px;
2921 border: 0px;
2922 padding: 3px 10px;
2923 color: #787872;
2924 border: 1px solid #cccec0;
2925 background-color: #cccec0;
2926}
2927div.mainDialog div.header div.title h3 {
2928 display: block;
2929 font-size: 16pt;
2930 color: #787872;
2931 margin: 0px;
2932 border: 0px;
2933 padding: 3px 10px;
2934}
2935div.mainDialog div.header div.title.selectedField input,
2936div.mainDialog div.header div.title:hover input {
2937 border: 1px solid #515247;
2938 background-color: #b5b7ab;
2939}
2940div.mainDialog div.header div.title.disabled:hover input {
2941 border: 1px solid #cccec0;
2942 background-color: #cccec0;
2943}
2944div.mainDialog div.body {
2945 padding-top: 0px;
2946 padding-left: 10px;
2947 padding-right: 9px;
2948 min-height: 200px;
2949 background: url(./images/old/cardDialog/background_body.png) repeat-y;
2950}
2951div.mainDialog div.body div.mask {
2952 display: none;
2953}
2954div.mainDialog.loading div.body div.mask {
2955 display: block;
2956 position: absolute;
2957 top: 55px;
2958 left: 10px;
2959 right: 9px;
2960 bottom: 70px;
2961 z-index: 1001;
2962 background-color: white;
2963 padding-left: 146px;
2964 padding-right: 146px;
2965 padding-top: 70px;
2966}
2967div.mainDialog.loading div.body .tabPanels {
2968 display: none;
2969}
2970div.mainDialog.loading div.body div.mask h3.progressDescription {
2971 margin: 0px;
2972 text-align: center;
2973 padding-bottom: 10px;
2974 color: #cccec0;
2975 font-size: 14pt;
2976 font-weight: normal;
2977}
2978div.loadingBar {
2979 height: 22px;
2980 width: 214px;
2981 background: url(./images/old/loading/loadingBar.gif) no-repeat center top;
2982}
2983div.loadingBar div.loadingBarProgressBox {
2984 padding: 2px;
2985}
2986div.loadingBar div.loadingBarProgress {
2987 height: 18px;
2988 width: 0%;
2989 /* background-repeat: no-repeat;*/
2990
2991 background-color: rgba(248, 79, 0, 0.6);
2992 -webkit-border-radius: 9px;
2993 -moz-border-radius: 9px;
2994 border-radius: 9px;
2995}
2996/*
2997div.loadingBar div.loadingBarProgress div.loadingBarProgress_left {
2998 height: 100%;
2999 max-width: 8px;
3000 background: url(./images/old/loading/loadingBarProgress.png) no-repeat 0;
3001}
3002
3003div.loadingBar div.loadingBarProgress div.loadingBarProgress_right {
3004 position: relative;
3005 height: 100%;
3006 margin-left: 8px;
3007 background: url(./images/old/loading/loadingBarProgress.png) no-repeat right;
3008 top: -22px;
3009}
3010*/
3011div.mainDialog div.body div ul {
3012 padding: 0px;
3013 clear: both;
3014 margin: 0px;
3015 list-style-type: none;
3016}
3017div.mainDialog div.body div.tabs {
3018 height: 20px;
3019}
3020div.mainDialog div.body div.tabs ul.tabs {
3021 height: 33px;
3022 /*border-bottom: 1px solid #515247;*/
3023
3024 /*background: #cccec0 url(./images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px;*/
3025
3026 background: url(./images/old/cardDialog/tabs_background.png) repeat-x;
3027}
3028div.mainDialog div.body div.tabs ul.tabs li {
3029 /* width: 150px;*/
3030
3031 height: 32px;
3032 font-size: 11pt;
3033 text-align: center;
3034 border-right: 1px solid #515247;
3035 float: left;
3036 color: #787872;
3037 border-bottom: 1px solid #515247;
3038 background: #cccec0 url(./images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px;
3039 cursor: pointer;
3040}
3041div.mainDialog div.body div.tabs ul.tabs li div {
3042 display: none;
3043}
3044div.mainDialog div.body div.tabs ul.tabs li span {
3045 display: block;
3046 padding-top: 9px;
3047 padding-bottom: 6px;
3048 padding-left: 40px;
3049 padding-right: 40px;
3050}
3051div.mainDialog div.body div.tabs ul.tabs li:hover {
3052 color: #515247;
3053}
3054div.mainDialog div.body div.tabs ul.tabs li.disabled:hover {
3055 color: #787872;
3056 cursor: default;
3057}
3058div.mainDialog div.body div.tabs ul.tabs li.selected {
3059 color: #515247;
3060 background-color: #f1f2e9;
3061 border-bottom: 1px solid #f1f2e9;
3062 cursor: default;
3063}
3064div.mainDialog div.body div.tabs ul.tabs li.selected.disabled:hover {
3065 color: #515247;
3066}
3067div.mainDialog div.body div.tabs ul.tabs li.selected div.backToDirectLoginList {
3068 position: absolute;
3069 display: block;
3070 top: 63px;
3071 left: 140;
3072 width: 20px;
3073}
3074div.mainDialog div.body div.tabs ul.tabs li.selected div.addDirectLoginButton {
3075 position: absolute;
3076 display: block;
3077 top: 63px;
3078 left: 265px;
3079 width: 20px;
3080}
3081div.mainDialog div.body div.tabs ul.tabs li.selected div span {
3082 padding: 0px;
3083 margin: 0px;
3084}
3085div.mainDialog div.body div.tabs ul.tabs li.selected div:hover {
3086 cursor: pointer;
3087}
3088div.mainDialog div.body .tabPanels {
3089 clear: both;
3090}
3091div.mainDialog div.body ul.tabPanels li.tabPanel {
3092 display: none;
3093}
3094div.mainDialog div.body ul.tabPanels li.tabPanel.selected {
3095 display: block;
3096}
3097div.mainDialog div.body ul.tabPanels li.tabPanel.selected h2 {
3098 margin: 0px;
3099 text-align: center;
3100 padding-top: 50px;
3101 color: #787872;
3102}
3103div.mainDialog div.body ul.tabPanels li.tabPanel.selected div.wizardStepDescription {
3104 margin: 0px 20px 10px;
3105 font-size: 10pt;
3106 color: b0b0b0;
3107 font-style: italic;
3108 text-align: center;
3109}
3110div.mainDialog div.footer {
3111 height: 70px;
3112 background: url(./images/old/cardDialog/background_footer.png) no-repeat 0 -14px;
3113}
3114div.mainDialog div.footer div.buttonArea {
3115 padding-left: 40px;
3116 padding-right: 40px;
3117 padding-top: 15px;
3118}
3119div.mainDialog div.footer div.buttonArea div {
3120 padding-left: 20px;
3121 padding-right: 20px;
3122 float: left;
3123 font-weight: bold;
3124 color: #787872;
3125}
3126div.mainDialog div.footer div.buttonArea div.disabled {
3127 color: #b1b1a8;
3128}
3129div.mainDialog div.footer div.buttonArea div.disabled:hover {
3130 color: #b1b1a8;
3131 cursor: default;
3132}
3133div.mainDialog div.footer div.buttonArea div:hover {
3134 color: #515247;
3135 cursor: pointer;
3136}
3137div.mainDialog div.footer div.buttonArea div.save {
3138 float: right;
3139}
3140/* @end */
3141/* @group Card Dialog */
3142div.addDirectLoginButton {
3143 height: 20px;
3144 width: 20px;
3145 background: url(./images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat -9px -9px;
3146 color: white;
3147 font-weight: bold;
3148}
3149div.addDirectLoginButton span {
3150 display: block;
3151 height: 20px;
3152 width: 20px;
3153}
3154div.addDirectLoginButton:hover {
3155 background: url(./images/old/cardDialog/addDirectLogin_background.png) no-repeat -9px -9px;
3156}
3157/* @group Card Dialog - Direct Login */
3158div.directLoginsComponentContainer {
3159 overflow: hidden;
3160 /* background-color: green;*/
3161
3162}
3163div.CardDialog div.directLogins {
3164 /* background-color: yellow;*/
3165
3166 padding-top: 2px;
3167}
3168div.CardDialog div.addNewDirectLoginSplash {
3169 margin: 0px 80px;
3170}
3171div.CardDialog div.addNewDirectLoginSplash h3 {
3172 color: #aaaaaa;
3173 text-align: center;
3174 font-weight: normal;
3175 font-size: 11pt;
3176}
3177div.CardDialog div.addNewDirectLoginSplash a {
3178 display: block;
3179 text-decoration: none;
3180 margin-left: auto;
3181 margin-right: auto;
3182 width: 190px;
3183 /* color: #787878;*/
3184
3185 color: rgba(255, 98, 6, 0.75);
3186 text-transform: uppercase;
3187 background: url(./images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat right;
3188}
3189div.CardDialog div.addNewDirectLoginSplash a span {
3190 text-align: center;
3191}
3192div.CardDialog div.addNewDirectLoginSplash a:hover {
3193 color: #ff6206;
3194 background: url(./images/old/cardDialog/addDirectLogin_background.png) no-repeat right;
3195}
3196div.CardDialog div.directLoginItem {
3197 clear: both;
3198 min-height: 32px;
3199 padding-left: 10px;
3200 padding-top: 4px;
3201 padding-bottom: 2px;
3202 /* width: 100px;*/
3203
3204 max-height: 32px;
3205 overflow: hidden;
3206}
3207div.CardDialog div.directLoginItem:hover {
3208 background-color: #cccec0;
3209}
3210div.CardDialog div.addDirectLoginListItem {
3211 min-height: 32px;
3212 padding-left: 10px;
3213 padding-top: 4px;
3214 padding-bottom: 2px;
3215 max-height: 32px;
3216 overflow: hidden;
3217 background: url(./images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat 22px 0;
3218}
3219div.CardDialog div.addDirectLoginListItem a {
3220 display: block;
3221 font-size: 11pt;
3222 padding-top: 6px;
3223 padding-left: 50px;
3224 color: rgba(255, 98, 6, 0.75);
3225 text-decoration: none;
3226 text-transform: uppercase;
3227}
3228div.CardDialog div.addDirectLoginListItem:hover {
3229 background: url(./images/old/cardDialog/addDirectLogin_background.png) no-repeat 22px 0;
3230 color: #ff6206;
3231 background-color: #cccec0;
3232}
3233div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_favicon img.favicon {
3234 width: 32px;
3235 height: 32px;
3236 float: left;
3237}
3238div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_label input {
3239 float: left;
3240 font-size: 11pt;
3241 border: 0px;
3242 padding: 5px;
3243 color: #787872;
3244 border: 1px solid #ededeb;
3245 background-color: #ededeb;
3246 height: 30px;
3247 margin-left: 10px;
3248 width: 68%;
3249 margin-right: 5px;
3250}
3251div.CardDialog div.directLoginItem:hover div.cardDialogRecordDirectLoginComponent_label input {
3252 border: 1px solid #515247;
3253 background-color: #b5b7ab;
3254}
3255div.CardDialog div.directLoginItem > div.open {
3256 float: left;
3257 margin-top: 5px;
3258 margin-right: 2px;
3259 padding-left: 5px;
3260 visibility: hidden;
3261}
3262div.CardDialog div.directLoginItem > div.edit,
3263div.CardDialog div.directLoginItem > div.delete {
3264 float: left;
3265 margin-top: 5px;
3266 margin-left: 3px;
3267 padding-left: 5px;
3268 visibility: hidden;
3269}
3270div.CardDialog div.directLoginItem > div.open a {
3271 display: block;
3272 width: 22px;
3273 height: 22px;
3274 background: url(./images/old/cardDialog/openDirectLogin.png) no-repeat 0 -2px;
3275}
3276div.CardDialog div.directLoginItem > div.open a:hover {
3277 background: url(./images/old/cardDialog/openDirectLogin_selected.png) no-repeat 0 -2px;
3278}
3279div.CardDialog div.directLoginItem:hover > div.open,
3280div.CardDialog div.directLoginItem:hover > div.edit,
3281div.CardDialog div.directLoginItem:hover > div.delete {
3282 visibility: visible;
3283}
3284div.CardDialog div.directLoginItem div.edit span {
3285 padding-right: 6px;
3286 display: block;
3287}
3288div.CardDialog div.directLoginItem div.open span a,
3289div.CardDialog div.directLoginItem div.edit span a,
3290div.CardDialog div.directLoginItem div.delete span a {
3291 font-size: 8pt;
3292 color: #666666;
3293 text-decoration: none;
3294 line-height: 19px;
3295}
3296div.CardDialog div.directLoginItem div.edit:hover {
3297 background: url(./images/old/new_background_left.png) no-repeat;
3298}
3299div.CardDialog div.directLoginItem div:hover span a {
3300 color: white;
3301}
3302div.CardDialog div.directLoginItem div.edit:hover span {
3303 background: url(./images/old/new_background.png) no-repeat right center;
3304}
3305div.CardDialog div.directLoginItem div.delete:hover {
3306 background: url(./images/old/delete_background_left.png) no-repeat;
3307}
3308div.CardDialog div.directLoginItem div.delete:hover span {
3309 background: url(./images/old/delete_background.png) right;
3310}
3311/* @group Direct Login Editing */
3312div.CardDialog div.directLoginEditDetail {
3313 position: relative;
3314 /* background-color: red;*/
3315
3316}
3317/*
3318div.CardDialog div.directLoginEditDetail div.back {
3319 float: left;
3320 width: 30px;
3321}
3322
3323div.CardDialog div.directLoginEditDetail div.back a {
3324 display: block;
3325 padding: 5px;
3326 text-decoration: none;
3327 font-weight: bold;
3328 font-size: 14pt;
3329 color: #cccec0;
3330
3331 background: url(./images/old/cardDialog/back.png) no-repeat 5px 14px;
3332 width: 20px;
3333 height: 200px;
3334}
3335
3336div.CardDialog div.directLoginEditDetail div.back a:hover {
3337 color: #7f7872;
3338 background: url(./images/old/cardDialog/back_selected.png) no-repeat 5px 14px;
3339}
3340*/
3341form.directLoginEditingForm div.title,
3342form.directLoginEditingForm div.favicon {
3343 padding: 5px 10px;
3344}
3345form.directLoginEditingForm div.title.disabled:hover {
3346 background-color: #f1f2e9;
3347}
3348form.directLoginEditingForm div.title:hover,
3349form.directLoginEditingForm div.favicon:hover {
3350 background-color: #cccec0;
3351}
3352form.directLoginEditingForm div.title input {
3353 /* width: 100%; */
3354
3355 margin: 0px;
3356 margin-left: 10px;
3357 width: 440px;
3358}
3359form.directLoginEditingForm div.favicon {
3360 padding-left: 10px;
3361}
3362/*form.directLoginEditingForm div.favicon img.favicon {*/
3363form.directLoginEditingForm img.favicon {
3364 float: left;
3365 width: 32px;
3366 height: 32px;
3367}
3368form.directLoginEditingForm div.favicon input {
3369 margin-top: 1px;
3370 width: 465px;
3371}
3372form.directLoginEditingForm div.disabled:hover input,
3373form.directLoginEditingForm div input {
3374 font-size: 11pt;
3375 border: 0px;
3376 padding: 5px;
3377 color: #787872;
3378 border: 1px solid #ededeb;
3379 background-color: #ededeb;
3380 height: 30px;
3381}
3382form.directLoginEditingForm div:hover input {
3383 border: 1px solid #515247;
3384 background-color: #b5b7ab;
3385}
3386/* @group Bindings */
3387div.bindings div.binding > span.formFieldName {
3388 display: inline-block;
3389 width: 140px;
3390 overflow: hidden;
3391 margin-right: 10px;
3392 color: #6b5147;
3393 text-overflow: ellipsis;
3394}
3395div.bindings div.binding {
3396 padding-bottom: 3px;
3397}
3398div.bindings div.binding > input {
3399 margin-right: 10px;
3400 background: #cccec0;
3401 width: 150px;
3402 border: 1px solid #cccec0;
3403}
3404div.bindings div.binding:hover > input {
3405 border: 1px solid #cccec0;
3406}
3407div.bindings div.binding > select {
3408 font-size: 13pt;
3409}
3410div.bindings div.binding span.fieldLock {
3411 display: inline-block;
3412 width: 20px;
3413 height: 20px;
3414 margin-right: 3px;
3415}
3416div.bindings div.binding.showLocked input {
3417 background: url(./images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3418 /* color: black;*/
3419
3420 overflow: hidden;
3421 background: #cccec0 url(./images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3422 color: rgba(237, 237, 235, 0.1);
3423}
3424div.bindings div.binding span.fieldLock a {
3425 display: none;
3426}
3427div.bindings div.binding.locked span.fieldLock a {
3428 display: block;
3429 width: 20px;
3430 height: 20px;
3431 text-decoration: none;
3432 background-image: url(./images/old/cardDialog/lock_open.png);
3433}
3434div.bindings div.binding.locked.showLocked span.fieldLock a {
3435 background-image: url(./images/old/cardDialog/lock_closed.png);
3436 text-decoration: none;
3437}
3438/* @end */
3439/* @group FormValues */
3440div.formValues {
3441 padding-top: 15px;
3442}
3443div.formValues div.formValue div {
3444 margin: 0px;
3445 display: inline-block;
3446}
3447div.formValues div.formValue > span.formFieldName {
3448 display: inline-table;
3449 width: 160px;
3450 overflow: hidden;
3451 margin-right: 10px;
3452 color: #6b5147;
3453}
3454/* @end */
3455/* @group FormValues */
3456/*
3457div.formValues {
3458 padding-top: 15px;
3459}
3460
3461div.formValues div.formValue > span.formFieldName {
3462 display: inline-table;
3463 width: 150px;
3464 overflow: hidden;
3465 margin-right: 35px;
3466 color: #6b5147;
3467}
3468
3469div.formValues div.formValue > select {
3470 padding-left: 20px;
3471}
3472*/
3473/* @end */
3474/* @group Panels */
3475div.directLoginEditing {
3476 padding-top: 2px;
3477}
3478div.directLoginEditing div.tabContainer {
3479 min-height: 150px;
3480 height: 200px;
3481}
3482div.directLoginEditing div.tabContainer > ul.tabs {
3483 display: none;
3484}
3485/*
3486div.directLoginEditing li.configuration,
3487div.directLoginEditing li.bindings,
3488div.directLoginEditing li.favicon {
3489 padding: 10px;
3490}
3491*/
3492div.directLoginEditing li {
3493 padding: 10px;
3494}
3495div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper > textarea {
3496 float: left;
3497 width: 320px;
3498 height: 125px;
3499 font-family: monospace;
3500 font-weight: normal;
3501 font-size: 8pt;
3502 border: 1px solid #ccc;
3503}
3504div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper .bookmarkletComponent {
3505 float: right;
3506}
3507div.directLoginEditing li.configuration > textarea.error {
3508 border: 1px solid red;
3509 background-color: rgba(255, 0, 0, 0.1);
3510}
3511/*
3512div.directLoginEditing > form.directLoginEditingForm > div.tabContainer {
3513 padding-top: 10px;
3514}
3515
3516div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li {
3517 float: left;
3518 padding-left: 10px;
3519 padding-right: 10px;
3520 display: block;
3521 font-size: 10pt;
3522 color: #787872;
3523 cursor: pointer;
3524
3525 height: 22px;
3526 text-align: center;
3527 border-right: 1px solid #aaa;
3528 border-bottom: 1px solid #aaa;
3529 border-top: 1px solid #aaa;
3530
3531 background-color: #cccec0;
3532}
3533
3534div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li:first-child {
3535 border-left: 1px solid #aaa;
3536}
3537
3538div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs {
3539 height: 23px;
3540 padding-left: 10px;
3541 border-bottom: 1px solid #aaa;
3542 margin-left: 10px;
3543 margin-right: 10px;
3544}
3545
3546div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li > span {
3547 line-height: 23px;
3548}
3549
3550div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li.selected {
3551 color: #6a5147;
3552 cursor: default;
3553 border-bottom: 1px solid #f1f2e9;
3554 background-color: #f1f2e9;
3555}
3556
3557div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li:hover {
3558 color: #6a5147;
3559}
3560
3561div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabPanels {
3562 padding-bottom: 5px;
3563 margin-left: 10px;
3564 margin-right: 10px;
3565}
3566
3567div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabPanels > li.selected {
3568 border-bottom: 1px solid #aaa;
3569 border-left: 1px solid #aaa;
3570 border-right: 1px solid #aaa;
3571}
3572
3573div.directLoginEditing li.configuration {
3574 padding: 5px;
3575}
3576
3577div.directLoginEditing li.configuration > textarea {
3578 width: 100%;
3579 height: 100px;
3580 font-family: monospace;
3581 font-weight: normal;
3582 font-size: 8pt;
3583}
3584*/
3585/* @end */
3586/* @end */
3587/* @end */
3588/* @group Card Dialog FIELDS */
3589div.CardDialog div.body {
3590 padding-bottom: 1px;
3591}
3592div.CardDialog div.body table.fields {
3593 width: 100%;
3594 padding-top: 8px;
3595 padding-bottom: 1px;
3596}
3597div.CardDialog div.body table.fields thead {
3598 background: url(./images/old/cardDialog/dottedLine_background.png) repeat-x 0 15px;
3599}
3600div.CardDialog div.body table.fields tfoot {
3601 background: url(./images/old/cardDialog/dottedLine_background.png) repeat-x 0 bottom;
3602}
3603div.CardDialog div.body table.fields thead th {
3604 text-align: left;
3605 font-weight: normal;
3606 font-size: 9pt;
3607 color: #787872;
3608 padding-left: 10px;
3609 padding-bottom: 3px;
3610 /*
3611 border-bottom: 1px dotted;
3612*/
3613
3614}
3615div.CardDialog div.body table.fields thead th.fieldStateTH {
3616 width: 10px;
3617}
3618div.CardDialog div.body table.fields tbody td.fieldLabel input {
3619 width: 130px;
3620}
3621div.CardDialog div.body table.fields thead th.fieldLockTH {
3622 width: 10px;
3623}
3624div.CardDialog div.body table.fields tbody td.fieldValue input {
3625 width: 280px;
3626}
3627div.CardDialog div.body table.fields thead th.fieldActionTH {
3628 width: 30px;
3629}
3630div.CardDialog div.body table.fields thead th.fieldDeleteTH {
3631 width: 40px;
3632}
3633div.CardDialog div.body table.fields tbody tr:hover,
3634div.CardDialog div.body table.fields tbody tr.selectedField {
3635 background-color: #cccec0;
3636}
3637div.CardDialog div.body table.fields tbody tr td {
3638 font-size: 11pt;
3639 color: #787872;
3640 height: 35px;
3641}
3642div.CardDialog div.body table.fields tbody tr td input {
3643 font-size: 11pt;
3644 border: 0px;
3645 padding: 5px;
3646 color: #787872;
3647 border: 1px solid #ededeb;
3648 background-color: #ededeb;
3649 height: 30px;
3650}
3651/*
3652div.CardDialog div.body table.fields tbody tr td.fieldValue div {
3653 margin-right: 10px;
3654}
3655
3656div.CardDialog div.body table.fields tbody tr td.fieldValue div input {
3657 width: 100%;
3658}
3659*/
3660div.CardDialog div.body table.fields tbody tr td.fieldValue div.locked input {
3661 background: #ededeb url(./images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3662 color: #ededeb;
3663 color: rgba(237, 237, 235, 0.1);
3664 /* color: black;*/
3665
3666 /* line-height: 100px;*/
3667
3668 overflow: hidden;
3669}
3670div.locked input.value::-moz-selection {
3671 background: #ff0000;
3672}
3673div.locked input.value::selection {
3674 background: #ff0000;
3675}
3676div.CardDialog div.body table.fields tbody tr.new.selectedField td input,
3677div.CardDialog div.body table.fields tbody tr.new:hover td input,
3678div.CardDialog div.body table.fields tbody tr:hover td input,
3679div.CardDialog div.body table.fields tbody tr.selectedField td input {
3680 border: 1px solid #515247;
3681 background-color: #b5b7ab;
3682}
3683div.CardDialog div.body table.fields tbody tr:hover td.fieldValue div.locked input,
3684div.CardDialog div.body table.fields tbody tr.selectedField td.fieldValue div.locked input {
3685 background: #b5b7ab url(./images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3686 color: #b5b7ab;
3687 color: rgba(237, 237, 235, 0.1);
3688}
3689div.CardDialog div.body table.fields tbody td.fieldLock div {
3690 width: 20px;
3691 height: 19px;
3692 cursor: pointer;
3693}
3694div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.locked {
3695 background-image: url(./images/old/cardDialog/lock_closed.png);
3696}
3697div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.unlocked {
3698 background-image: url(./images/old/cardDialog/lock_open.png);
3699}
3700div.CardDialog div.body table.fields tbody tr td.fieldAddDelete div span a {
3701 text-decoration: none;
3702 visibility: hidden;
3703 font-size: 8pt;
3704 vertical-align: -13px;
3705 color: black;
3706}
3707div.CardDialog div.body table.fields tbody tr.selectedField td.fieldAddDelete div span a {
3708 visibility: visible;
3709}
3710div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div span a {
3711 visibility: visible;
3712}
3713div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div:hover span a {
3714 color: white;
3715}
3716div.CardDialog div.body div.notes {
3717 background: url(./images/old/cardDialog/dottedLine_background.png) repeat-x 0 0;
3718 padding-top: 2px;
3719}
3720div.CardDialog div.body div.notes div {
3721 padding-left: 20px;
3722 padding-right: 20px;
3723 padding-top: 4px;
3724 padding-bottom: 4px;
3725}
3726div.CardDialog div.body div.notes div:hover,
3727div.CardDialog div.body div.notes.selectedField div {
3728 background-color: #cccec0;
3729}
3730div.CardDialog.loading div.body div.notes div textarea {
3731 display: none;
3732}
3733div.CardDialog div.body div.notes div textarea {
3734 border: 0;
3735 width: 470px;
3736 /*
3737 width: 100%;
3738 height: 100px;
3739 min-height: 400px;
3740 overflow: hidden;
3741*/
3742
3743 color: #787872;
3744 border: 1px solid #ededeb;
3745 background-color: #ededeb;
3746 display: block;
3747 line-height: 12pt;
3748 min-height: 50px;
3749}
3750div.CardDialog div.body div.notes div:hover textarea,
3751div.CardDialog div.body div.notes.selectedField div textarea {
3752 border: 1px solid #515247;
3753 background-color: #b5b7ab;
3754}
3755div.CardDialog div.body table.fields tbody tr td.fieldAction {
3756 /* background-color: red;*/
3757
3758 padding-left: 4px;
3759}
3760div.CardDialog div.body table.fields tbody tr td.fieldAction a {
3761 display: inline-block;
3762 text-decoration: none;
3763 text-align: center;
3764 width: 16px;
3765 height: 16px;
3766}
3767div.CardDialog div.body table.fields tbody tr td.fieldAction a.email {
3768 background: url(./images/old/cardDialog/fieldTypes/email.png) no-repeat 0 0;
3769}
3770div.CardDialog div.body table.fields tbody tr td.fieldAction a.email:hover {
3771 background: url(./images/old/cardDialog/fieldTypes/email_selected.png) no-repeat 0 0;
3772}
3773div.CardDialog div.body table.fields tbody tr td.fieldAction a.url {
3774 background: url(./images/old/cardDialog/fieldTypes/url.png) no-repeat 0 0;
3775}
3776div.CardDialog div.body table.fields tbody tr td.fieldAction a.url:hover {
3777 background: url(./images/old/cardDialog/fieldTypes/url_selected.png) no-repeat 0 0;
3778}
3779div.CardDialog div.body table.fields tbody tr td.fieldAction a.password {
3780 background: url(./images/old/cardDialog/fieldTypes/password.png) no-repeat 0 0;
3781}
3782div.CardDialog div.body table.fields tbody tr td.fieldAction a.password:hover {
3783 background: url(./images/old/cardDialog/fieldTypes/password_selected.png) no-repeat 0 0;
3784}
3785/*
3786/ *div.CardDialog div.body table.fields tbody* / tr.new {
3787 background: yellow;
3788}
3789
3790div.CardDialog div.body table.fields tbody tr.new td input {
3791 border: 1px solid red;
3792 background-color: green;
3793}
3794*/
3795/* @end */
3796/* @end */
3797div#disabledZone {
3798 display: block;
3799 visibility: visible;
3800}
3801div#messageZone {
3802 display: block;
3803 visibility: visible;
3804}
3805div.CardDialog div.error div.img {
3806 margin: 10px;
3807 width: 50px;
3808 height: 50px;
3809 float: left;
3810 background-image: url(./images/old/simpleMessageBox/Alert.png);
3811}
3812/* @group Ruler */
3813/*
3814div.rulerExtraWrapper {
3815 position: absolute;
3816 top: 0px;
3817 left: 0px;
3818 width: 100%;
3819 height: 100%;
3820 overflow: hidden;
3821 background-color: rgba(255, 0, 0, 0.2);
3822 z-index: 24999;
3823}
3824*/
3825div.rulerWrapper {
3826 left: -1000px;
3827 margin-top: -30px;
3828 margin-left: 50%;
3829 z-index: 25000;
3830}
3831div.rulerWrapper.fixed {
3832 position: fixed;
3833}
3834div.rulerWrapper.scrollable {
3835 position: absolute;
3836}
3837div.ruler {
3838 /* position: absolute;*/
3839
3840 width: 541px;
3841 height: 96px;
3842 margin-left: -270px;
3843 background: url(./images/old/ruler/ruler.png) no-repeat;
3844}
3845div.ruler a {
3846 position: absolute;
3847 display: block;
3848 width: 15px;
3849 height: 15px;
3850 top: 3px;
3851 text-decoration: none;
3852}
3853div.ruler a.exit {
3854 margin-left: 2px;
3855 background: url(./images/old/ruler/exit.png) no-repeat;
3856}
3857div.ruler a.exit:hover {
3858 background: url(./images/old/ruler/exit_selected.png) no-repeat;
3859}
3860div.ruler a.smallButton.previous {
3861 right: 16px;
3862 background: url(./images/old/ruler/small_previous.png) no-repeat;
3863}
3864div.ruler a.smallButton.previous:hover {
3865 cursor: pointer;
3866 background: url(./images/old/ruler/small_previous_selected.png) no-repeat;
3867}
3868div.ruler a.smallButton.previous.disabled,
3869div.ruler a.smallButton.previous.disabled:hover {
3870 cursor: default;
3871 background: url(./images/old/ruler/small_previous_disabled.png) no-repeat;
3872}
3873div.ruler a.smallButton.next {
3874 right: 3px;
3875 background: url(./images/old/ruler/small_next.png) no-repeat;
3876}
3877div.ruler a.smallButton.next:hover {
3878 cursor: pointer;
3879 background: url(./images/old/ruler/small_next_selected.png) no-repeat;
3880}
3881div.ruler a.smallButton.next.disabled,
3882div.ruler a.smallButton.next.disabled:hover {
3883 cursor: default;
3884 background: url(./images/old/ruler/small_next_disabled.png) no-repeat;
3885}
3886div.ruler div.steps,
3887div.ruler div.dots {
3888 position: absolute;
3889 background-color: rgba(255, 255, 255, 0);
3890 margin-left: 30px;
3891 margin-right: 30px;
3892}
3893div.ruler div.steps {
3894 top: 25px;
3895 height: 30px;
3896}
3897div.ruler div.dots {
3898 top: 58px;
3899 height: 25px;
3900}
3901div.ruler div ul {
3902 list-style-type: none;
3903 margin: 0px;
3904 padding: 0px;
3905}
3906div.ruler div ul li {
3907 display: inline-block;
3908 vertical-align: top;
3909}
3910div.ruler > div.steps > ul > li:first-child,
3911div.ruler > div.dots > ul > li:first-child {
3912 margin-left: 0px;
3913}
3914div.ruler div.steps_3 ul li {
3915 margin-left: 135px;
3916}
3917div.ruler div.steps_4 ul li {
3918 margin-left: 67px;
3919}
3920div.ruler div.steps_5 ul li {
3921 margin-left: 32px;
3922}
3923div.ruler div.steps_6 ul li {
3924 margin-left: 12px;
3925}
3926div.ruler div ul li span {
3927 font-weight: bold;
3928 text-align: center;
3929 width: 70px;
3930 display: block;
3931 font-size: 8pt;
3932 overflow: hidden;
3933 color: rgba(0, 0, 0, 0.3);
3934}
3935div.ruler div ul li.selected span {
3936 color: black;
3937}
3938div.ruler div.dots ul li span {
3939 /*
3940 text-align: center;
3941 width: 26px;
3942 margin-left: 22px;
3943 margin-right: 22px;
3944 height: 25px;
3945 background-color: #e57218;
3946*/
3947
3948 font-size: 40pt;
3949 line-height: 47px;
3950}
3951div.ruler div.marker {
3952 position: absolute;
3953 top: -3px;
3954 /* left: -246px;*/
3955
3956}
3957div.ruler div.marker div.markerBody {
3958 width: 77px;
3959 height: 97px;
3960 background: url(./images/old/ruler/marker.png) no-repeat;
3961}
3962div.ruler div.marker div.next {
3963 position: absolute;
3964 top: 25px;
3965 left: 76px;
3966 width: 27px;
3967 height: 65px;
3968 background: url(./images/old/ruler/next.png) no-repeat -13px;
3969 z-index: 26000;
3970}
3971div.ruler div.marker div.next:hover {
3972 cursor: pointer;
3973 background: url(./images/old/ruler/next.png) no-repeat -2px;
3974}
3975div.ruler div.marker div.disabled {
3976 display: none;
3977}
3978div.ruler div.marker div.previous {
3979 position: absolute;
3980 top: 25px;
3981 left: -24px;
3982 width: 27px;
3983 height: 65px;
3984 /* background: url(./images/old/ruler/previous.png) no-repeat 13px 1px;*/
3985
3986 background: url(./images/old/ruler/previous.png) no-repeat 18px 1px;
3987 z-index: 26000;
3988}
3989div.ruler div.marker div.previous:hover {
3990 cursor: pointer;
3991 /* background: url(./images/old/ruler/previous.png) no-repeat 2px 1px;*/
3992
3993 background: url(./images/old/ruler/previous.png) no-repeat 7px 1px;
3994}
3995/* @end */
3996div.createNewCardSplash {
3997 margin-top: -450px;
3998 margin-left: 250px;
3999 width: 354px;
4000 float: left;
4001 height: 186px;
4002 text-align: center;
4003 background: url(./images/old/main/grid/createNewCardSplash.png) no-repeat;
4004}
4005div.createNewCardSplash:hover {
4006 cursor: pointer;
4007 background: url(./images/old/main/grid/createNewCardSplash_selected.png) no-repeat;
4008}
4009div.createNewCardSplash span {
4010 display: block;
4011 padding-top: 130px;
4012 font-size: 14pt;
4013 color: #9a9586;
4014}
4015div.createNewCardSplash:hover span {
4016 color: #605c4e;
4017}
4018/*=============================================*/
4019div.NewUserCreation div.tabContainer {
4020 min-height: 150px;
4021 height: 200px;
4022}
4023div.NewUserCreation div.tabContainer > ul.tabs {
4024 display: none;
4025}
4026ul.createUserStates li.creating {
4027 background: url(./images/old/creatingUser.gif) no-repeat center center;
4028}
4029ul.createUserStates li {
4030 height: 100px;
4031}
4032ul.createUserStates li span {
4033 display: block;
4034 width: 100%;
4035 text-align: center;
4036 color: #999;
4037 font-style: italic;
4038}
4039div.NewUserCreation form.newUserCreationForm ul.tabPanels {
4040 padding-top: 10px;
4041}
4042div.NewUserCreation form.newUserCreationForm ul ul {
4043 margin-left: auto;
4044 margin-right: auto;
4045 width: 400px;
4046}
4047div.NewUserCreation form.newUserCreationForm ul.credentials li {
4048 height: 45px;
4049}
4050div.NewUserCreation form.newUserCreationForm ul.credentials span.label {
4051 text-align: right;
4052 display: inline-block;
4053 font-size: 12pt;
4054 color: #787872;
4055 width: 110px;
4056 vertical-align: baseline;
4057}
4058div.NewUserCreation form.newUserCreationForm ul.credentials input {
4059 font-size: 13pt;
4060 color: #787872;
4061 height: 35px;
4062 margin-left: 15px;
4063 padding-left: 5px;
4064}
4065div.NewUserCreation form.newUserCreationForm ul.termsOfService li {
4066 padding: 0 0 15 0;
4067}
4068div.NewUserCreation form.newUserCreationForm ul.termsOfService input {
4069 display: inline-block;
4070}
4071div.NewUserCreation form.newUserCreationForm ul.termsOfService .label {
4072 display: inline-block;
4073 text-align: left;
4074 font-size: 12pt;
4075 color: #787872;
4076 width: 350px;
4077 vertical-align: top;
4078 padding-left: 10px;
4079}
4080div.NewUserCreation form.newUserCreationForm ul.termsOfService a {
4081 font-weight: bold;
4082 color: #787872;
4083 text-decoration: none;
4084}
4085div.NewUserCreation form.newUserCreationForm ul.termsOfService a:hover {
4086 color: #444;
4087}
4088div.NewUserCreation form.newUserCreationForm ul.createUserStates li.done span {
4089 font-size: 16pt;
4090 color: green;
4091}
4092div.NewUserCreation form.newUserCreationForm ul.createUserStates li.fail span {
4093 font-size: 16pt;
4094 color: red;
4095}
diff --git a/frontend/gamma/html/exitPage_template.html b/frontend/gamma/html/exit_template.html
index e17bee0..e17bee0 100644
--- a/frontend/gamma/html/exitPage_template.html
+++ b/frontend/gamma/html/exit_template.html
diff --git a/frontend/gamma/html/index_template.html b/frontend/gamma/html/index_template.html
index 5f5ed2d..699e0e9 100644
--- a/frontend/gamma/html/index_template.html
+++ b/frontend/gamma/html/index_template.html
@@ -1,70 +1,78 @@
1<html> 1<html>
2<head> 2<head>
3 <title>@page.title@</title> 3 <title>@page.title@</title>
4 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 4 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
5<!-- 5<!--
6@copyright@ 6@copyright@
7--> 7-->
8 8
9@css@ 9@css@
10 10
11 <link rel="shortcut icon" href="./clipperz.ico" /> 11 <link rel="shortcut icon" href="./clipperz.ico" />
12 12
13 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> 13 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
14 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 14 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
15<script> 15<script>
16 Clipperz_IEisBroken = false; 16 Clipperz_IEisBroken = false;
17 Clipperz_normalizedNewLine = '\n'; 17 Clipperz_normalizedNewLine = '\n';
18 Clipperz_dumpUrl = "/dump/"; 18 Clipperz_dumpUrl = "/../dump/";
19 "use strict";
19</script> 20</script>
20 21
21<!--[if IE]><script> 22<!--[if IE]><script>
22Clipperz_IEisBroken = true; 23Clipperz_IEisBroken = true;
23Clipperz_normalizedNewLine = '\x0d\x0a'; 24Clipperz_normalizedNewLine = '\x0d\x0a';
24</script><![endif]--> 25</script><![endif]-->
25 26
26@js_LINKED@ 27@js_LINKED@
27 28
28</head> 29</head>
29<body> 30<body>
30<div id="mainDiv"> 31<div id="mainDiv">
31 <div id="loading"> 32 <div id="loading">
32 <div> 33 <div>
33 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a --> 34 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a -->
34 <h1>clipperz</h1> 35 <h1>clipperz</h1>
35 <h3 class="clipperzPayoff">keep it to yourself!</h3> 36 <h3 class="clipperzPayoff">keep it to yourself!</h3>
36 <!-- h5>loading ...</h5 --> 37 <!-- h5>loading ...</h5 -->
37 </div> 38 </div>
38 </div> 39 </div>
39 40
40@js_EMBEDDED@ 41@js_EMBEDDED@
41 42
42</div> 43</div>
43<!-- div id="applicationVersionType" class="@application.version.type@"></div --> 44<!-- div id="applicationVersionType" class="@application.version.type@"></div -->
44 45
45<script> 46<script>
46 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@}); 47 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
47 /*offline_data_placeholder*/ 48 /*offline_data_placeholder*/
49
50/* * /
51 MochiKit.DOM.addLoadEvent(function () {
52 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
53 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'j', passphrase:'j'});
54 });
55/ * */
48</script> 56</script>
49 57
50<!-- --> 58<!-- -->
51<!-- div id="javaScriptAlert"> 59<!-- div id="javaScriptAlert">
52 <div class="mask"></div> 60 <div class="mask"></div>
53 <div class="message"> 61 <div class="message">
54 <div class="header"></div> 62 <div class="header"></div>
55 <div class="body"> 63 <div class="body">
56 <div class="alertLogo"></div> 64 <div class="alertLogo"></div>
57 <div class="alert"> 65 <div class="alert">
58 <h1>Attention!</h1> 66 <h1>Attention!</h1>
59 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p> 67 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
60 <h3>Javascript is required to access Clipperz.</h3> 68 <h3>Javascript is required to access Clipperz.</h3>
61 <h5>Please enable scripting or upgrade your browser.</h5> 69 <h5>Please enable scripting or upgrade your browser.</h5>
62 </div> 70 </div>
63 </div> 71 </div>
64 <div class="footer"></div> 72 <div class="footer"></div>
65 </div> 73 </div>
66</div --> 74</div -->
67<!-- --> 75<!-- -->
68 76
69</body> 77</body>
70</html> 78</html>
diff --git a/frontend/gamma/html/mobile.appcache b/frontend/gamma/html/mobile.appcache
new file mode 100644
index 0000000..237b5ad
--- a/dev/null
+++ b/frontend/gamma/html/mobile.appcache
@@ -0,0 +1,24 @@
1CACHE MANIFEST
2# 2012-02-23-v0.0.1
3
4# Entry to add into Apache config:
5# AddType text/cache-manifest .appcache
6
7# Explicitly cached entries
8CACHE:
9index.mobile.html
10*.favico
11
12# static.html will be served if the user is offline
13FALLBACK:
14/index.mobile.html /index.mobile.html
15
16# /main.py /static.html
17# images/large/ images/offline.jpg
18# *.html /offline.html
19
20
21# Resources that require the user to be online.
22NETWORK:
23*
24# login.php, http://api.twitter.com, etc.
diff --git a/frontend/gamma/html/mobile_template.html b/frontend/gamma/html/mobile_template.html
index 0a1b54c..184fbd9 100644
--- a/frontend/gamma/html/mobile_template.html
+++ b/frontend/gamma/html/mobile_template.html
@@ -1,84 +1,66 @@
1<!-- 1<!doctype html>
2<!-- Conditional comment for mobile ie7 blogs.msdn.com/b/iemobile/ -->
3<!--[if IEMobile 7 ]> <html class="no-js iem7" lang="en"> <![endif]-->
4<!--[if (gt IEMobile 7)|!(IEMobile)]><!--> <html class="no-js" lang="en" manifest="mobile.appcache"> <!--<![endif]-->
5<head>
6 <title>@page.title@</title>
7 <meta charset="utf-8">
2 8
3Copyright 2008-2011 Clipperz Srl 9 <meta name="HandheldFriendly" content="True">
10 <meta name="MobileOptimized" content="320">
11 <meta name="viewport" content="width=device-width">
4 12
5This file is part of Clipperz Community Edition. 13<!-- link rel="apple-touch-icon-precomposed" ... -->
6Clipperz Community Edition is an online password manager. 14 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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">
7For further information about its features and functionalities please 15 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAIAAADajyQQAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAKJGNVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXjEKMJAAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAAPZklEQVRoge2aeXAcVX7Hv+9199ySRhrdl3XYGNvY2LLB2OCLw0ZlYwfIbrFU7QJbSyoklWQJqV0I2QuySW2ygTLU7lKV3SQUBSHcXm5zLGCDMb5k2eBLsmTJts7RaEaa6enpfu+XP+bQSNYxM8h/UOVfdbVaM/3e/D79O/r3ft3AJbkkl+SS5CBs1mdUVdVmsxFRRj/PmBDCMIzZV2PWZ7z//vvvvffezLjAGNuz57O77rpr1tWYfbDKysp58+aBDCAdjpLeQWluQmCOnp7zs64DLgaYEBIAwn4wIGW4+AFL52IgCU++FT9/tmX2wZJCIAIoaTZK7ZKfMEAiQ5fNXi4aGIkEGJBGRUmjMQCgbypY3MfSqDDBaDQ+DmdTLj4YpRstGWnxPyS/gWBSgGQyfyTZxpkLgIS8WN54EcASWV2AZMIDJwRbSohAFkkx+zpcFLAEggSJiVSp0GIAMUBCfIPA4kIiLTGmAix1W4vvJaRF9E0BIwnIiWDpVGN4EvKbYzEiCVjjwMbyPo2PsosIxqf6QlGUhx9+eNOmm202W1YzkpSJlCAFyALFIS2QlfZJ/F8LUuQAVlZa/Bd3f+e3j/2zw26f6pwpLbbg8ssfffRRxmj//oPPPvvsyy+/3N3dnREYScgkzFhhlRZsSN3cJKSZOZiiKCtXLL3jti3NN62vrS4XQj793Et797dkB7Zt2zbGGHT/imXzV6z494d+/A9vvPn2M888s/vTzyzLmpZMQiRdMY40eaQBJDK0WGVF2ZZN13/71s0rli50OzUSMTL8XM3bevOG7MA0Tdu27RYIHWAwdMhQaR77/t3f+t6dt3+xv+XZ555/bcfr53t6JudKWMxKxpgcD4a02krQtOle09RVVzXdcfuWjddfV1Pu42RARhTBmaKBqRE9tHH96l8+9lQkomcKtvTKJUsWL6RYJFn9cEgLo36VxOqmuatX/stDP/rh62++++xzz+/Zu0/K8esOmXLF8WATUz8ASdIiOYn9a6oqtjbf8Ofbbl62eL7bRmSFFXOAKxxcBQBpgXHI6Ny6ypVNV/xp975MwW7dttXu0Eg3wBhIJoo6xkAMsTD0QHWBct89t979nT/7fP/h555/+fW33unrH4iPpbgrSgkIECULQprEbheke5tNu3bl8jtu23zT+lVVpflcjDLRp5gAUwAOSWAA42AErthUkLBu2bg2UzCn07G5+SYyIozxhFpx/RI3KALjkCbC/Q6SG66q33DNzzoe+Ksdb73/vy+88sWBQ7GYQXGLQY5dlNQ84ywmSFqWGQNQV1O1tfmG27duXLqwwaXFEAsqeoBxDsZBPPGj4CAC5/EiU1XViD66YXVTQb4nGBqdQDFJM2fdmmt3vvmKyiRXtXhGTgTMuIPUZkGaYArs+SMRfLj7gMvlWrNysV0/zSAmBxvDE4ZSfLhDP3Tkq03rr6kqdnJrmFmjnMkEBmMATx6nNiVxwNVwaNgQ9u/+7SNvfbBnAoVyIdj9f3PftauWA5whXkak9EsaIX4wziAWYiEbhS5vKKuuKDWMmJ1CbJzR5JgNEXdOCRK6pfp8JdcsKilQ/KrZz6XOkPKR1FWQk+QeEABOlmkK05JvXgA20RXz8zwbb1grYoZic4EIXAWpYAJkQjAQgRGgAhxQoAhIC5JAIrEqjoXsckiVBCYTqxJMMFpqkUYAOWmImwFuCYADDAQwCWIAS5gLDOCgpLkgAQWQIAUgVdXIGr52+cISn3fAPzwd2LWrrm6sq4HqBlMQ7cFoB0InED6DyFkYfogoIMFUKE5o+bAXw1EGZyXsxVA94BokgQmFiXEWnjzSCIDKkqk/DhzPT4wB8QOeIGQKiCWdkBJ7KcFVmyLLfZ51Kxe/9Nau6cBuvaVZFSF27LcY/Byh44gOIL2LlNY4G/uEc9gK4apBwSIULIKnDooT0oSUicVLeuIZh5c+Ufw/lsADA+MJNmKIRx1JMAUsbQ/YHZoejW5ev3w6MF9R4YZ1a62uN2yHfwWedIRJwnCCSBh+RP3wt0ABnNUoaoJvJVy1AAeZyTaBHJ/9k5UxJS9QojPHxlyRsYQTTnBFkuAKQJCkqiqT+lWLG6vLfWd7/Smdxmm9eeOGu++8lZ/4tRLtgpJN/5slYgEAzBCCJzDwCUZOQdFgLwZTIM1kHkpPIakDMeariWwhJyaPSZbhBBA4JyuqcKWtq6/1+JnJwf7xgb++otahtW1nViyhaw6SGCih98G/F6ETUD2wlySSJyXTYzoV5LiNkjyUyp+pe3qKjRLmBRSIcDiiqeqr7+9LNVDGwCoryv71p3/vdLp1T5O0FTER4WYAMr2vlBNhdAhDX0DvgaMcqgeUMl2a0cZtNA57YgEd14fAQMKKRfVQMDgyEuFczS/w/vGDA6HRyEQwAuvu9RPXiioXuao3WKWb9LyrheblIsytYO6EcbxIL4YPgqtwVgISUqTdHi+w21iymZhFAUlSGFEjFIoEQ0bEwGhMPXEu8uIHRx9/+t22zm6RTHWTaFpbW7N+zaotN629aukin9dDxrAc/lIL7LGH9qrRM8mCLXvCuGLeJahshuKGjE2+lkFaYoznRsbBGBEME+EoMyyFuMMQakfv6CcH2nbubmn58mQ0Er7wek4pc+bM2bBm5eYbr1u+eH5RgVtGhyh4zBbcax/ZrxndORJKwFmG6m1wlCXYJrSx4t3vRFYESUQtHjFUQ9iIOw2hdfSN7jrYvnNXS8uXJ/ULeDICS0l9Xd31a1c2X79q2cK5hXkOGR2i0HF7aJ8jfEiLnR3L1xkKAaoHVVvgrhtvt/g8BMR5lHDMZggHKa6YtHX2hXcdat+5q6Xl6KlIZGLJmyNYShoa6m9Ys/Lm9VdfuaDO67JJYwihE/bRA85Iq2b2Ahk/ECJAsaOiGZ6GJBtARCSjljoasxvSCcVjSNuZ/vDuQ6d37j586OjJSHhmnhzBUqMaG+tvXHv1xjXLl1xWY1ekjI24w3t9g08zZNyZIUCxoeJmuGpBJkBGTPaES2LSAdV1zq/vaul479PWg60nsuIZUzGHMWmj+dyG+id+8v3FjcVFvb9xRVqzm48AxYHKZthLQCaR7B0pCFq+R/7w8WvvfaFn4G/TyJTtt8w0kw0V7sYqb57/1aypADBARNH3AcwASDCIUteghwc2LPFJc5I2RlYycyE4jTTWlj31i78s58cKAy8yltNDEwYIA+YwXNUgwbmwIVxWUq1ptt0tnV9Ht9zBnA7bkz+5Z3EN9w38XpHR3J2aAeYIGOAohrRUxYSINM6p7+4Lnujyzzx8Cskd7MEfbL5twxXegf+2W71f93URBhh+2IvA7SDh0KLCkovm1u850j04nKNP5gi2Zd2SB3+wOT/4Rn60ZXZegiGCNQJnaXyN49TCgOOy2vKd+zqNWC7N/VzA5taWbH/ozlJ85Qu/k3loCdj4NDcDBlg6VBtUF8jiTNh52OUsLMxzfnToXA7hmzWY22nb/uNvL6qSpaEXFGT6qpAJdydvdlG/imldS4ThKIz3eTTVZEKvKC0LRWKtpwPZ6pk12IP33LB1zVxf6EWHHMx81DmsHuX1unR7WSebqkBhgLCgKFDt8XW30x6NGWJ+bXnr6aHz/uyCLTuwW9YueOC7673h9wvE8cxHBajunFx2rEcW5nmkMPN4/5SnMkAasLsBCzBBwmMPGzF1YW3xR4f7R6NZBFsWYJfVFv/HD28p5SdKzV2Z54sYuXuVNe8cCv3oiZ0rFjd487x28jv4lFU5pAWFQwEoBjI5M12qDririx0fHh4SMtNwyxTM7bQ9fn/zwgqzwnhbgZnhKICdFU0doeIHf/fxoD9w9Exw0zVzTWEvVHsUNsXlJwAmNAHoIB1kaFqEU7TAXcgg953KtM7KFOzB761uXllVFn3HgeGZz07KoFUziEX/9sKxfUc6AQwFgkHTft0V5dEYFWlThCgDpIBmADHABGKgmMsxahiyrtR7pt/o6Itl8tMZgW1dM/fvvrW82PzMi84MkQBEpeucWPbeEf3J/9tPiWYbjnX0V1dX1Zc6mYx4tKkdMt78S+sJ5Dkjo2G2oMr2+cloIDyzQ84MNr+28Ff3rS3XTpfjYIZIAAisS1/QNVL00H/uD46kAZBsOeW/rqleZZSvhWzKFA9H4/3MtEYb5/DYo4ZhNpbKD4+SOVMemQGsKN/x6/tWNZbyGuxS2LRPaMer1R+tGBR1j+3o3nuka8KX0Wi0rZ9ubCrRddPnHOFT3eLjqqWMJqHZSVjCwajIjc/bMH0emWHZUlNVXl9fZwrZaVxhkCtDKt109hmVHx+L7Pj45KSnHDza/oePwjq5u4Y9k1dk8bZVshMXN93AALp6wKDNn9focjmm12IGi/UNDu/+Knj5ZY3F+a6BSL6dR51qZPohBNYeqj4fKXj4f04GQlNG0dH2wOXzqnyOIYdiumyTXfzUNWeQEm1nWVs3FK1gZ0f9L57vHw7OkB5njrFBf+CdzzudhVULawuGIg5T8nxtZMoSkeH8aKE/VvzE26E9rWenmVZK68gZa/0yr9ADPjfUCxVJNuDCOo62YzCAmK36N7t9v/tje1SfOutkDgbANGOfHmzrDLmaFlSQwJDuyNMi2oVxzzBq2LpCRZ+etm1/pZ3kDL2dkdFIb9h33XyuR/SS/AtckgMcvYM40gZL2E4bc3/2qvnJgdPI7N2rLCqP9jM9H3852tDQUFFAvUFF5ZbHNu6WIsFODrr6Iu5/es4fCM58UQF0ng8VlNQ1FoQYiQJPWhrksAROdqOtG4rN+/aZukdeOH+uZyBzbbOrFYOh0M5958hVs7jOMRzS9RgrcJg8HgwMXQHmjypP/Un7tHXqanCiUGuH3rRwjt30e12w2xJUoTAOn4J/GIa95snPvP/1VnvMmCG2J0jW1b0U5v4vu44P5l85v1QVff1By20nhw0hHZ1+tre7ePsOv8zm9SjLjB3vt61b6I0EQxU+cAVn+3GkHZLsp2Lzfr7D2HO4M4uOZVJyXEF3nx/88IhZOWderVfvHdQJOB/AQNT78xeFfzgjJ0yXoeGRsFK+vMqK6sbAMNrPQXEWvdE555cvnevtz2JxlC659zwikfAHB/xh27wr69wjgYAg7fefeT85nKMeJ7tDNXPqy9WhkTBF7HO278575t02M5Z7E+5rtd9A4uip3pbeoqUL6joGlcd3DMjJ3h/KbCrZ2m2uaarrMXw/fS2y7+iZHNxv9sVbWFhWUvT156muLPN48r7+PJfkklySiy7/D8RU38I8pVv5AAAAAElFTkSuQmCCCg==">
8refer to http://www.clipperz.com. 16 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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">
17 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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">
9 18
10* Clipperz Community Edition is free software: you can redistribute 19 <meta http-equiv="cleartype" content="on">
11 it and/or modify it under the terms of the GNU Affero General Public 20 <meta name="apple-mobile-web-app-capable" content="yes">
12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version.
14 21
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 22
20* You should have received a copy of the GNU Affero General Public 23 <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" -->
21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>.
23 24
25<!--
26@copyright@
24--> 27-->
25 28
26<html>
27<head>
28 <title>@page.title@</title>
29 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
30@copyright@
31@css@ 29@css@
32 30
33 <link rel="shortcut icon" href="./clipperz.ico" /> 31 <link rel="shortcut icon" href="./clipperz.ico" />
34 32
35 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> 33 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
36 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 34 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
37<script> 35<script>
38 Clipperz_IEisBroken = false; 36 Clipperz_IEisBroken = false;
39 Clipperz_normalizedNewLine = '\n'; 37 Clipperz_normalizedNewLine = '\n';
40 Clipperz_dumpUrl = "/dump/"; 38 Clipperz_dumpUrl = "/dump/";
41</script> 39</script>
42 40
43<!--[if IE]><script> 41@js_LINKED@
44Clipperz_IEisBroken = true;
45Clipperz_normalizedNewLine = '\x0d\x0a';
46</script><![endif]-->
47
48@CLIPPERZ_DEBUG_VERSION@
49 42
50</head> 43</head>
51<body> 44<body>
52<div id="mainDiv"> 45<div id="mainDiv">
53 <div id="loading"> 46 <div id="loading">
54 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a> 47 <div>
55 <h5 class="clipperzPayoff">keep it to yourself!</h5> 48 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a -->
56 <h2>loading ...</h2> 49 <h1>clipperz</h1>
50 <h3 class="clipperzPayoff">keep it to yourself!</h3>
51 <!-- h5>loading ...</h5 -->
52 </div>
57 </div> 53 </div>
58 54
59@CLIPPERZ_INSTALLED_VERSION@ 55@js_EMBEDDED@
60
61</div>
62<div id="applicationVersionType" class="@application.version.type@"></div>
63 56
64<!-- -->
65<div id="javaScriptAlert">
66 <div class="mask"></div>
67 <div class="message">
68 <div class="header"></div>
69 <div class="body">
70 <div class="alertLogo"></div>
71 <div class="alert">
72 <h1>Attention!</h1>
73 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
74 <h3>Javascript is required to access Clipperz.</h3>
75 <h5>Please enable scripting or upgrade your browser.</h5>
76 </div>
77 </div>
78 <div class="footer"></div>
79 </div>
80</div> 57</div>
81<!-- --> 58<!-- div id="applicationVersionType" class="@application.version.type@"></div -->
59
60<script>
61 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
62 /*offline_data_placeholder*/
63</script>
82 64
83</body> 65</body>
84</html> 66</html>
diff --git a/frontend/gamma/images/old/alert/alert.png b/frontend/gamma/images/old/alert/alert.png
new file mode 100644
index 0000000..ade6040
--- a/dev/null
+++ b/frontend/gamma/images/old/alert/alert.png
Binary files differ
diff --git a/frontend/gamma/images/old/alert/body.png b/frontend/gamma/images/old/alert/body.png
new file mode 100644
index 0000000..3f0ab21
--- a/dev/null
+++ b/frontend/gamma/images/old/alert/body.png
Binary files differ
diff --git a/frontend/gamma/images/old/alert/footer.png b/frontend/gamma/images/old/alert/footer.png
new file mode 100644
index 0000000..a9587c8
--- a/dev/null
+++ b/frontend/gamma/images/old/alert/footer.png
Binary files differ
diff --git a/frontend/gamma/images/old/alert/header.png b/frontend/gamma/images/old/alert/header.png
new file mode 100644
index 0000000..079dd13
--- a/dev/null
+++ b/frontend/gamma/images/old/alert/header.png
Binary files differ
diff --git a/frontend/gamma/images/old/bookmarklet/placeholder.png b/frontend/gamma/images/old/bookmarklet/placeholder.png
new file mode 100644
index 0000000..792dbf5
--- a/dev/null
+++ b/frontend/gamma/images/old/bookmarklet/placeholder.png
Binary files differ
diff --git a/frontend/gamma/images/old/bookmarklet/placeholder_icon.png b/frontend/gamma/images/old/bookmarklet/placeholder_icon.png
new file mode 100644
index 0000000..dc06721
--- a/dev/null
+++ b/frontend/gamma/images/old/bookmarklet/placeholder_icon.png
Binary files differ
diff --git a/frontend/gamma/images/old/bookmarklet/placeholder_selected.png b/frontend/gamma/images/old/bookmarklet/placeholder_selected.png
new file mode 100644
index 0000000..d01ac89
--- a/dev/null
+++ b/frontend/gamma/images/old/bookmarklet/placeholder_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/bookmarklet/placeholder_selected_icon.png b/frontend/gamma/images/old/bookmarklet/placeholder_selected_icon.png
new file mode 100644
index 0000000..c8c2a86
--- a/dev/null
+++ b/frontend/gamma/images/old/bookmarklet/placeholder_selected_icon.png
Binary files differ
diff --git a/frontend/gamma/images/old/button/clicked_left.png b/frontend/gamma/images/old/button/clicked_left.png
new file mode 100644
index 0000000..332260d
--- a/dev/null
+++ b/frontend/gamma/images/old/button/clicked_left.png
Binary files differ
diff --git a/frontend/gamma/images/old/button/clicked_main.png b/frontend/gamma/images/old/button/clicked_main.png
new file mode 100644
index 0000000..d0fe732
--- a/dev/null
+++ b/frontend/gamma/images/old/button/clicked_main.png
Binary files differ
diff --git a/frontend/gamma/images/old/button/default_left.png b/frontend/gamma/images/old/button/default_left.png
new file mode 100644
index 0000000..94178fc
--- a/dev/null
+++ b/frontend/gamma/images/old/button/default_left.png
Binary files differ
diff --git a/frontend/gamma/images/old/button/default_main.png b/frontend/gamma/images/old/button/default_main.png
new file mode 100644
index 0000000..8b97bea
--- a/dev/null
+++ b/frontend/gamma/images/old/button/default_main.png
Binary files differ
diff --git a/frontend/gamma/images/old/button/hover_left.png b/frontend/gamma/images/old/button/hover_left.png
new file mode 100644
index 0000000..de09c1a
--- a/dev/null
+++ b/frontend/gamma/images/old/button/hover_left.png
Binary files differ
diff --git a/frontend/gamma/images/old/button/hover_main.png b/frontend/gamma/images/old/button/hover_main.png
new file mode 100644
index 0000000..6c07f57
--- a/dev/null
+++ b/frontend/gamma/images/old/button/hover_main.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/addDirectLogin_background.png b/frontend/gamma/images/old/cardDialog/addDirectLogin_background.png
new file mode 100644
index 0000000..130d060
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/addDirectLogin_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/addDirectLogin_disabled_background.png b/frontend/gamma/images/old/cardDialog/addDirectLogin_disabled_background.png
new file mode 100644
index 0000000..e67f5c4
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/addDirectLogin_disabled_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/back.png b/frontend/gamma/images/old/cardDialog/back.png
new file mode 100644
index 0000000..97ef21e
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/back.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/back_selected.png b/frontend/gamma/images/old/cardDialog/back_selected.png
new file mode 100644
index 0000000..18d4f0a
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/back_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/background_body.png b/frontend/gamma/images/old/cardDialog/background_body.png
new file mode 100644
index 0000000..9640d23
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/background_body.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/background_footer.png b/frontend/gamma/images/old/cardDialog/background_footer.png
new file mode 100644
index 0000000..4d70eb3
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/background_footer.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/background_header.png b/frontend/gamma/images/old/cardDialog/background_header.png
new file mode 100644
index 0000000..3223a1e
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/background_header.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/dottedLine_background.png b/frontend/gamma/images/old/cardDialog/dottedLine_background.png
new file mode 100644
index 0000000..c447f02
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/dottedLine_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/fieldTypes/email.png b/frontend/gamma/images/old/cardDialog/fieldTypes/email.png
new file mode 100644
index 0000000..afe4e8a
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/fieldTypes/email.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/fieldTypes/email_selected.png b/frontend/gamma/images/old/cardDialog/fieldTypes/email_selected.png
new file mode 100644
index 0000000..017904c
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/fieldTypes/email_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/fieldTypes/password.png b/frontend/gamma/images/old/cardDialog/fieldTypes/password.png
new file mode 100644
index 0000000..fff876d
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/fieldTypes/password.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/fieldTypes/passwordTooltip.png b/frontend/gamma/images/old/cardDialog/fieldTypes/passwordTooltip.png
new file mode 100644
index 0000000..3eb4d4f
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/fieldTypes/passwordTooltip.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/fieldTypes/password_selected.png b/frontend/gamma/images/old/cardDialog/fieldTypes/password_selected.png
new file mode 100644
index 0000000..b9dc839
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/fieldTypes/password_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/fieldTypes/url.png b/frontend/gamma/images/old/cardDialog/fieldTypes/url.png
new file mode 100644
index 0000000..3ac1266
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/fieldTypes/url.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/fieldTypes/url_selected.png b/frontend/gamma/images/old/cardDialog/fieldTypes/url_selected.png
new file mode 100644
index 0000000..77b1143
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/fieldTypes/url_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/loading.gif b/frontend/gamma/images/old/cardDialog/loading.gif
new file mode 100644
index 0000000..a846634
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/loading.gif
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/lock_closed.png b/frontend/gamma/images/old/cardDialog/lock_closed.png
new file mode 100644
index 0000000..5ea9b9e
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/lock_closed.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/lock_open.png b/frontend/gamma/images/old/cardDialog/lock_open.png
new file mode 100644
index 0000000..cb94955
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/lock_open.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/openDirectLogin.png b/frontend/gamma/images/old/cardDialog/openDirectLogin.png
new file mode 100644
index 0000000..e0b6a25
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/openDirectLogin.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/openDirectLogin_selected.png b/frontend/gamma/images/old/cardDialog/openDirectLogin_selected.png
new file mode 100644
index 0000000..a2a6f47
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/openDirectLogin_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/password_background.png b/frontend/gamma/images/old/cardDialog/password_background.png
new file mode 100644
index 0000000..9432573
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/password_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/tabs_background.png b/frontend/gamma/images/old/cardDialog/tabs_background.png
new file mode 100644
index 0000000..ebaad24
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/tabs_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/cardDialog/tabs_shadow.png b/frontend/gamma/images/old/cardDialog/tabs_shadow.png
new file mode 100644
index 0000000..04b51e6
--- a/dev/null
+++ b/frontend/gamma/images/old/cardDialog/tabs_shadow.png
Binary files differ
diff --git a/frontend/gamma/images/old/creatingUser.gif b/frontend/gamma/images/old/creatingUser.gif
new file mode 100644
index 0000000..69448f8
--- a/dev/null
+++ b/frontend/gamma/images/old/creatingUser.gif
Binary files differ
diff --git a/frontend/gamma/images/old/delete_background.png b/frontend/gamma/images/old/delete_background.png
new file mode 100644
index 0000000..b9bc088
--- a/dev/null
+++ b/frontend/gamma/images/old/delete_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/delete_background_left.png b/frontend/gamma/images/old/delete_background_left.png
new file mode 100644
index 0000000..af3beac
--- a/dev/null
+++ b/frontend/gamma/images/old/delete_background_left.png
Binary files differ
diff --git a/frontend/gamma/images/old/directLink_background.png b/frontend/gamma/images/old/directLink_background.png
new file mode 100644
index 0000000..b36757a
--- a/dev/null
+++ b/frontend/gamma/images/old/directLink_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/directLink_background_left.png b/frontend/gamma/images/old/directLink_background_left.png
new file mode 100644
index 0000000..11f282d
--- a/dev/null
+++ b/frontend/gamma/images/old/directLink_background_left.png
Binary files differ
diff --git a/frontend/gamma/images/old/directLink_no_background.png b/frontend/gamma/images/old/directLink_no_background.png
new file mode 100644
index 0000000..21a18e2
--- a/dev/null
+++ b/frontend/gamma/images/old/directLink_no_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/directLogins_background.png b/frontend/gamma/images/old/directLogins_background.png
new file mode 100644
index 0000000..959ecaf
--- a/dev/null
+++ b/frontend/gamma/images/old/directLogins_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/directLogins_background_bottom.png b/frontend/gamma/images/old/directLogins_background_bottom.png
new file mode 100644
index 0000000..c3c40d0
--- a/dev/null
+++ b/frontend/gamma/images/old/directLogins_background_bottom.png
Binary files differ
diff --git a/frontend/gamma/images/old/filter/clearFilter_notSelected.png b/frontend/gamma/images/old/filter/clearFilter_notSelected.png
new file mode 100644
index 0000000..ec2e2fe
--- a/dev/null
+++ b/frontend/gamma/images/old/filter/clearFilter_notSelected.png
Binary files differ
diff --git a/frontend/gamma/images/old/filter/clearFilter_selected.png b/frontend/gamma/images/old/filter/clearFilter_selected.png
new file mode 100644
index 0000000..6bfb463
--- a/dev/null
+++ b/frontend/gamma/images/old/filter/clearFilter_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/br.png b/frontend/gamma/images/old/flags/br.png
new file mode 100644
index 0000000..51ac06e
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/br.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/cn.png b/frontend/gamma/images/old/flags/cn.png
new file mode 100644
index 0000000..4be2967
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/cn.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/de.png b/frontend/gamma/images/old/flags/de.png
new file mode 100644
index 0000000..a66d634
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/de.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/en.png b/frontend/gamma/images/old/flags/en.png
new file mode 100644
index 0000000..6d193aa
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/en.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/es.png b/frontend/gamma/images/old/flags/es.png
new file mode 100644
index 0000000..503ffca
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/es.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/it.png b/frontend/gamma/images/old/flags/it.png
new file mode 100644
index 0000000..a271baf
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/it.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/jp.png b/frontend/gamma/images/old/flags/jp.png
new file mode 100644
index 0000000..19e81e3
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/jp.png
Binary files differ
diff --git a/frontend/gamma/images/old/flags/ru.png b/frontend/gamma/images/old/flags/ru.png
new file mode 100644
index 0000000..7391499
--- a/dev/null
+++ b/frontend/gamma/images/old/flags/ru.png
Binary files differ
diff --git a/frontend/gamma/images/old/footer/star.png b/frontend/gamma/images/old/footer/star.png
new file mode 100644
index 0000000..7c6e53c
--- a/dev/null
+++ b/frontend/gamma/images/old/footer/star.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/box/box_body.png b/frontend/gamma/images/old/home/box/box_body.png
new file mode 100644
index 0000000..168c776
--- a/dev/null
+++ b/frontend/gamma/images/old/home/box/box_body.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/box/box_bottom.png b/frontend/gamma/images/old/home/box/box_bottom.png
new file mode 100644
index 0000000..f8e72be
--- a/dev/null
+++ b/frontend/gamma/images/old/home/box/box_bottom.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/box/box_top.png b/frontend/gamma/images/old/home/box/box_top.png
new file mode 100644
index 0000000..ff7b607
--- a/dev/null
+++ b/frontend/gamma/images/old/home/box/box_top.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/download.png b/frontend/gamma/images/old/home/download.png
new file mode 100644
index 0000000..deffc1b
--- a/dev/null
+++ b/frontend/gamma/images/old/home/download.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/features/bullet.png b/frontend/gamma/images/old/home/features/bullet.png
new file mode 100644
index 0000000..1f51609
--- a/dev/null
+++ b/frontend/gamma/images/old/home/features/bullet.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/look.png b/frontend/gamma/images/old/home/look.png
new file mode 100644
index 0000000..a2a49eb
--- a/dev/null
+++ b/frontend/gamma/images/old/home/look.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/register.png b/frontend/gamma/images/old/home/register.png
new file mode 100644
index 0000000..be7c151
--- a/dev/null
+++ b/frontend/gamma/images/old/home/register.png
Binary files differ
diff --git a/frontend/gamma/images/old/home/register_selected.png b/frontend/gamma/images/old/home/register_selected.png
new file mode 100644
index 0000000..f29aaae
--- a/dev/null
+++ b/frontend/gamma/images/old/home/register_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/backButton.png b/frontend/gamma/images/old/iPhone/backButton.png
new file mode 100644
index 0000000..e27ea8c
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/backButton.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/icon.png b/frontend/gamma/images/old/iPhone/icon.png
new file mode 100644
index 0000000..1c97389
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/icon.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/listArrow.png b/frontend/gamma/images/old/iPhone/listArrow.png
new file mode 100644
index 0000000..6421a16
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/listArrow.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/locked.png b/frontend/gamma/images/old/iPhone/locked.png
new file mode 100644
index 0000000..e00d5f6
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/locked.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/logo_and_header.png b/frontend/gamma/images/old/iPhone/logo_and_header.png
new file mode 100644
index 0000000..0fe26a3
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/logo_and_header.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/password_background.png b/frontend/gamma/images/old/iPhone/password_background.png
new file mode 100644
index 0000000..9432573
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/password_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/pinstripes.png b/frontend/gamma/images/old/iPhone/pinstripes.png
new file mode 100644
index 0000000..c997775
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/pinstripes.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/thumb.png b/frontend/gamma/images/old/iPhone/thumb.png
new file mode 100644
index 0000000..cefa8fc
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/thumb.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/toggle.png b/frontend/gamma/images/old/iPhone/toggle.png
new file mode 100644
index 0000000..3b62ebf
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/toggle.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/toggleOn.png b/frontend/gamma/images/old/iPhone/toggleOn.png
new file mode 100644
index 0000000..b016814
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/toggleOn.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/toolbar.png b/frontend/gamma/images/old/iPhone/toolbar.png
new file mode 100644
index 0000000..3dde94c
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/toolbar.png
Binary files differ
diff --git a/frontend/gamma/images/old/iPhone/whiteButton.png b/frontend/gamma/images/old/iPhone/whiteButton.png
new file mode 100644
index 0000000..5514b27
--- a/dev/null
+++ b/frontend/gamma/images/old/iPhone/whiteButton.png
Binary files differ
diff --git a/frontend/gamma/images/old/loading/loadingBar.gif b/frontend/gamma/images/old/loading/loadingBar.gif
new file mode 100644
index 0000000..b111948
--- a/dev/null
+++ b/frontend/gamma/images/old/loading/loadingBar.gif
Binary files differ
diff --git a/frontend/gamma/images/old/loading/loadingBarProgress.png b/frontend/gamma/images/old/loading/loadingBarProgress.png
new file mode 100644
index 0000000..68436ed
--- a/dev/null
+++ b/frontend/gamma/images/old/loading/loadingBarProgress.png
Binary files differ
diff --git a/frontend/gamma/images/old/loading/news.gif b/frontend/gamma/images/old/loading/news.gif
new file mode 100644
index 0000000..33d70b5
--- a/dev/null
+++ b/frontend/gamma/images/old/loading/news.gif
Binary files differ
diff --git a/frontend/gamma/images/old/lock/background_star.png b/frontend/gamma/images/old/lock/background_star.png
new file mode 100644
index 0000000..4dff077
--- a/dev/null
+++ b/frontend/gamma/images/old/lock/background_star.png
Binary files differ
diff --git a/frontend/gamma/images/old/lock/locked.png b/frontend/gamma/images/old/lock/locked.png
new file mode 100644
index 0000000..e00d5f6
--- a/dev/null
+++ b/frontend/gamma/images/old/lock/locked.png
Binary files differ
diff --git a/frontend/gamma/images/old/lock/locked_hover.png b/frontend/gamma/images/old/lock/locked_hover.png
new file mode 100644
index 0000000..62ad133
--- a/dev/null
+++ b/frontend/gamma/images/old/lock/locked_hover.png
Binary files differ
diff --git a/frontend/gamma/images/old/lock/unlocked.png b/frontend/gamma/images/old/lock/unlocked.png
new file mode 100644
index 0000000..13eadfe
--- a/dev/null
+++ b/frontend/gamma/images/old/lock/unlocked.png
Binary files differ
diff --git a/frontend/gamma/images/old/lock/unlocked_hover.png b/frontend/gamma/images/old/lock/unlocked_hover.png
new file mode 100644
index 0000000..1a45c2f
--- a/dev/null
+++ b/frontend/gamma/images/old/lock/unlocked_hover.png
Binary files differ
diff --git a/frontend/gamma/images/old/logo.png b/frontend/gamma/images/old/logo.png
new file mode 100644
index 0000000..62b58d9
--- a/dev/null
+++ b/frontend/gamma/images/old/logo.png
Binary files differ
diff --git a/frontend/gamma/images/old/logo_blue.png b/frontend/gamma/images/old/logo_blue.png
new file mode 100644
index 0000000..fff4a51
--- a/dev/null
+++ b/frontend/gamma/images/old/logo_blue.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/blocks/cardGridBackground.png b/frontend/gamma/images/old/main/blocks/cardGridBackground.png
new file mode 100644
index 0000000..66dabf8
--- a/dev/null
+++ b/frontend/gamma/images/old/main/blocks/cardGridBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/blocks/cardGridStripes.png b/frontend/gamma/images/old/main/blocks/cardGridStripes.png
new file mode 100644
index 0000000..fdda774
--- a/dev/null
+++ b/frontend/gamma/images/old/main/blocks/cardGridStripes.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/blocks/directLoginGridBackground.png b/frontend/gamma/images/old/main/blocks/directLoginGridBackground.png
new file mode 100644
index 0000000..92dd1b8
--- a/dev/null
+++ b/frontend/gamma/images/old/main/blocks/directLoginGridBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/blocks/directLoginGridStripes.png b/frontend/gamma/images/old/main/blocks/directLoginGridStripes.png
new file mode 100644
index 0000000..a6fc345
--- a/dev/null
+++ b/frontend/gamma/images/old/main/blocks/directLoginGridStripes.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/blocks/otherPanelBackground.png b/frontend/gamma/images/old/main/blocks/otherPanelBackground.png
new file mode 100644
index 0000000..d9f5ec5
--- a/dev/null
+++ b/frontend/gamma/images/old/main/blocks/otherPanelBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/blocks/otherPanelBackground_selected.png b/frontend/gamma/images/old/main/blocks/otherPanelBackground_selected.png
new file mode 100644
index 0000000..0ce1d0c
--- a/dev/null
+++ b/frontend/gamma/images/old/main/blocks/otherPanelBackground_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/ascending.png b/frontend/gamma/images/old/main/grid/ascending.png
new file mode 100644
index 0000000..9a05f48
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/ascending.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/createNewCardSplash.png b/frontend/gamma/images/old/main/grid/createNewCardSplash.png
new file mode 100644
index 0000000..f7289a5
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/createNewCardSplash.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/createNewCardSplash_selected.png b/frontend/gamma/images/old/main/grid/createNewCardSplash_selected.png
new file mode 100644
index 0000000..13d536f
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/createNewCardSplash_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/descending.png b/frontend/gamma/images/old/main/grid/descending.png
new file mode 100644
index 0000000..868857b
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/descending.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/directLogins/ascending.png b/frontend/gamma/images/old/main/grid/directLogins/ascending.png
new file mode 100644
index 0000000..e1ace30
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/directLogins/ascending.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/directLogins/descending.png b/frontend/gamma/images/old/main/grid/directLogins/descending.png
new file mode 100644
index 0000000..47b0685
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/directLogins/descending.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/directLogins/unsorted.png b/frontend/gamma/images/old/main/grid/directLogins/unsorted.png
new file mode 100644
index 0000000..ecf674e
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/directLogins/unsorted.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/favicon.png b/frontend/gamma/images/old/main/grid/favicon.png
new file mode 100644
index 0000000..00d208d
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/favicon.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/running_search.gif b/frontend/gamma/images/old/main/grid/running_search.gif
new file mode 100644
index 0000000..d02d3b7
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/running_search.gif
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/search.png b/frontend/gamma/images/old/main/grid/search.png
new file mode 100644
index 0000000..5bc8d62
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/search.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/grid/unsorted.png b/frontend/gamma/images/old/main/grid/unsorted.png
new file mode 100644
index 0000000..4bbcee3
--- a/dev/null
+++ b/frontend/gamma/images/old/main/grid/unsorted.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/messageBoxBackground.png b/frontend/gamma/images/old/main/messageBoxBackground.png
new file mode 100644
index 0000000..de598b2
--- a/dev/null
+++ b/frontend/gamma/images/old/main/messageBoxBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/messageBoxCloseButton.png b/frontend/gamma/images/old/main/messageBoxCloseButton.png
new file mode 100644
index 0000000..061a7bb
--- a/dev/null
+++ b/frontend/gamma/images/old/main/messageBoxCloseButton.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/messageBoxCloseButtonActive.png b/frontend/gamma/images/old/main/messageBoxCloseButtonActive.png
new file mode 100644
index 0000000..dbc6871
--- a/dev/null
+++ b/frontend/gamma/images/old/main/messageBoxCloseButtonActive.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/cardsBackground.png b/frontend/gamma/images/old/main/tabs/cardsBackground.png
new file mode 100644
index 0000000..dd3643e
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/cardsBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/directLoginBackground.png b/frontend/gamma/images/old/main/tabs/directLoginBackground.png
new file mode 100644
index 0000000..23a9b22
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/directLoginBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/groupsBackground.png b/frontend/gamma/images/old/main/tabs/groupsBackground.png
new file mode 100644
index 0000000..9cbc9ba
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/groupsBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/itemsBackground.png b/frontend/gamma/images/old/main/tabs/itemsBackground.png
new file mode 100644
index 0000000..1a276a5
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/itemsBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/selectionHighligher.png b/frontend/gamma/images/old/main/tabs/selectionHighligher.png
new file mode 100644
index 0000000..f93fb02
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/selectionHighligher.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/selectionHighligherGray copy.png b/frontend/gamma/images/old/main/tabs/selectionHighligherGray copy.png
new file mode 100644
index 0000000..7741a7a
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/selectionHighligherGray copy.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/selectionHighligherGray.png b/frontend/gamma/images/old/main/tabs/selectionHighligherGray.png
new file mode 100644
index 0000000..8f6a690
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/selectionHighligherGray.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/tabs/tagsBackground.png b/frontend/gamma/images/old/main/tabs/tagsBackground.png
new file mode 100644
index 0000000..4a8091d
--- a/dev/null
+++ b/frontend/gamma/images/old/main/tabs/tagsBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/userInfoBackground.png b/frontend/gamma/images/old/main/userInfoBackground.png
new file mode 100644
index 0000000..6756c83
--- a/dev/null
+++ b/frontend/gamma/images/old/main/userInfoBackground.png
Binary files differ
diff --git a/frontend/gamma/images/old/main/userInfoBullet.png b/frontend/gamma/images/old/main/userInfoBullet.png
new file mode 100644
index 0000000..3817764
--- a/dev/null
+++ b/frontend/gamma/images/old/main/userInfoBullet.png
Binary files differ
diff --git a/frontend/gamma/images/old/new_background.png b/frontend/gamma/images/old/new_background.png
new file mode 100644
index 0000000..f946a47
--- a/dev/null
+++ b/frontend/gamma/images/old/new_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/new_background_left.png b/frontend/gamma/images/old/new_background_left.png
new file mode 100644
index 0000000..e9bd958
--- a/dev/null
+++ b/frontend/gamma/images/old/new_background_left.png
Binary files differ
diff --git a/frontend/gamma/images/old/note.png b/frontend/gamma/images/old/note.png
new file mode 100644
index 0000000..4e43691
--- a/dev/null
+++ b/frontend/gamma/images/old/note.png
Binary files differ
diff --git a/frontend/gamma/images/old/passwordField/background copy.png b/frontend/gamma/images/old/passwordField/background copy.png
new file mode 100644
index 0000000..05050bb
--- a/dev/null
+++ b/frontend/gamma/images/old/passwordField/background copy.png
Binary files differ
diff --git a/frontend/gamma/images/old/passwordField/background.png b/frontend/gamma/images/old/passwordField/background.png
new file mode 100644
index 0000000..3835a86
--- a/dev/null
+++ b/frontend/gamma/images/old/passwordField/background.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/exit.png b/frontend/gamma/images/old/ruler/exit.png
new file mode 100644
index 0000000..30ab430
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/exit.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/exit_selected.png b/frontend/gamma/images/old/ruler/exit_selected.png
new file mode 100644
index 0000000..07dfca6
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/exit_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/marker.png b/frontend/gamma/images/old/ruler/marker.png
new file mode 100644
index 0000000..8d12a88
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/marker.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/next.png b/frontend/gamma/images/old/ruler/next.png
new file mode 100644
index 0000000..9d9662c
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/next.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/previous.png b/frontend/gamma/images/old/ruler/previous.png
new file mode 100644
index 0000000..39f5da3
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/previous.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/ruler.png b/frontend/gamma/images/old/ruler/ruler.png
new file mode 100644
index 0000000..546fa7b
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/ruler.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/small_next.png b/frontend/gamma/images/old/ruler/small_next.png
new file mode 100644
index 0000000..a35c66b
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/small_next.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/small_next_disabled.png b/frontend/gamma/images/old/ruler/small_next_disabled.png
new file mode 100644
index 0000000..69e7f31
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/small_next_disabled.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/small_next_selected.png b/frontend/gamma/images/old/ruler/small_next_selected.png
new file mode 100644
index 0000000..b8aa0c8
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/small_next_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/small_previous.png b/frontend/gamma/images/old/ruler/small_previous.png
new file mode 100644
index 0000000..03f90f7
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/small_previous.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/small_previous_disabled.png b/frontend/gamma/images/old/ruler/small_previous_disabled.png
new file mode 100644
index 0000000..86a7565
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/small_previous_disabled.png
Binary files differ
diff --git a/frontend/gamma/images/old/ruler/small_previous_selected.png b/frontend/gamma/images/old/ruler/small_previous_selected.png
new file mode 100644
index 0000000..5c61b45
--- a/dev/null
+++ b/frontend/gamma/images/old/ruler/small_previous_selected.png
Binary files differ
diff --git a/frontend/gamma/images/old/tabPanels/background.png b/frontend/gamma/images/old/tabPanels/background.png
new file mode 100644
index 0000000..17350c9
--- a/dev/null
+++ b/frontend/gamma/images/old/tabPanels/background.png
Binary files differ
diff --git a/frontend/gamma/images/old/tips/Tips_background.png b/frontend/gamma/images/old/tips/Tips_background.png
new file mode 100644
index 0000000..34170b9
--- a/dev/null
+++ b/frontend/gamma/images/old/tips/Tips_background.png
Binary files differ
diff --git a/frontend/gamma/images/old/tips/close.png b/frontend/gamma/images/old/tips/close.png
new file mode 100644
index 0000000..554fc8e
--- a/dev/null
+++ b/frontend/gamma/images/old/tips/close.png
Binary files differ
diff --git a/frontend/gamma/images/old/tips/open.png b/frontend/gamma/images/old/tips/open.png
new file mode 100644
index 0000000..66861d8
--- a/dev/null
+++ b/frontend/gamma/images/old/tips/open.png
Binary files differ
diff --git a/frontend/gamma/images/old/tooltips/body.png b/frontend/gamma/images/old/tooltips/body.png
new file mode 100644
index 0000000..ae5b5a3
--- a/dev/null
+++ b/frontend/gamma/images/old/tooltips/body.png
Binary files differ
diff --git a/frontend/gamma/images/old/tooltips/body_bottom.png b/frontend/gamma/images/old/tooltips/body_bottom.png
new file mode 100644
index 0000000..4567b5f
--- a/dev/null
+++ b/frontend/gamma/images/old/tooltips/body_bottom.png
Binary files differ
diff --git a/frontend/gamma/images/old/tooltips/bottom_arrow.png b/frontend/gamma/images/old/tooltips/bottom_arrow.png
new file mode 100644
index 0000000..5884c94
--- a/dev/null
+++ b/frontend/gamma/images/old/tooltips/bottom_arrow.png
Binary files differ
diff --git a/frontend/gamma/images/old/tooltips/left_arrow.png b/frontend/gamma/images/old/tooltips/left_arrow.png
new file mode 100644
index 0000000..290d062
--- a/dev/null
+++ b/frontend/gamma/images/old/tooltips/left_arrow.png
Binary files differ
diff --git a/frontend/gamma/images/old/tooltips/right_arrow.png b/frontend/gamma/images/old/tooltips/right_arrow.png
new file mode 100644
index 0000000..d0bb64f
--- a/dev/null
+++ b/frontend/gamma/images/old/tooltips/right_arrow.png
Binary files differ
diff --git a/frontend/gamma/images/old/tooltips/top_arrow.png b/frontend/gamma/images/old/tooltips/top_arrow.png
new file mode 100644
index 0000000..a5e8845
--- a/dev/null
+++ b/frontend/gamma/images/old/tooltips/top_arrow.png
Binary files differ
diff --git a/frontend/gamma/js/Clipperz/Async.js b/frontend/gamma/js/Clipperz/Async.js
index 97d8ecf..f7a9517 100644
--- a/frontend/gamma/js/Clipperz/Async.js
+++ b/frontend/gamma/js/Clipperz/Async.js
@@ -452,131 +452,131 @@ MochiKit.Base.update(Clipperz.Async, {
452 synchronizer = new Clipperz.Async.DeferredSynchronizer(aName, someMethods); 452 synchronizer = new Clipperz.Async.DeferredSynchronizer(aName, someMethods);
453 result = synchronizer.run(args, aValue); 453 result = synchronizer.run(args, aValue);
454 454
455 return result; 455 return result;
456 }, aName, someMethods, args); 456 }, aName, someMethods, args);
457 }, 457 },
458 458
459 //------------------------------------------------------------------------- 459 //-------------------------------------------------------------------------
460 460
461 'collectResults': function(aName, someRequests, args) { 461 'collectResults': function(aName, someRequests, args) {
462 return MochiKit.Base.partial(function(aName, someRequests, args, aValue) { 462 return MochiKit.Base.partial(function(aName, someRequests, args, aValue) {
463 var deferredResult; 463 var deferredResult;
464 var requestKeys; 464 var requestKeys;
465 var methods; 465 var methods;
466 466
467 requestKeys = MochiKit.Base.keys(someRequests); 467 requestKeys = MochiKit.Base.keys(someRequests);
468 methods = MochiKit.Base.values(someRequests); 468 methods = MochiKit.Base.values(someRequests);
469 469
470 deferredResult = new Clipperz.Async.Deferred(aName, args); 470 deferredResult = new Clipperz.Async.Deferred(aName, args);
471 deferredResult.addCallback(Clipperz.Async.forkAndJoin(aName + " [inner forkAndJoin]", methods, args)); 471 deferredResult.addCallback(Clipperz.Async.forkAndJoin(aName + " [inner forkAndJoin]", methods, args));
472 deferredResult.addBoth(function(someResults) { 472 deferredResult.addBoth(function(someResults) {
473 var returnFunction; 473 var returnFunction;
474 var results; 474 var results;
475 var i,c; 475 var i,c;
476 var result; 476 var result;
477 477
478 if (someResults instanceof MochiKit.Async.CancelledError) { 478 if (someResults instanceof MochiKit.Async.CancelledError) {
479 returnFunction = MochiKit.Async.fail; 479 returnFunction = MochiKit.Async.fail;
480 result = someResults; 480 result = someResults;
481 } else { 481 } else {
482 if (someResults instanceof Error) { 482 if (someResults instanceof Error) {
483 returnFunction = MochiKit.Async.fail; 483 returnFunction = MochiKit.Async.fail;
484 results = someResults['message']; 484 results = someResults['message'];
485 } else { 485 } else {
486 returnFunction = MochiKit.Async.succeed; 486 returnFunction = MochiKit.Async.succeed;
487 results = someResults; 487 results = someResults;
488 } 488 }
489 489
490 result = {}; 490 result = {};
491 491
492 c = requestKeys.length; 492 c = requestKeys.length;
493 for (i=0; i<c; i++) { 493 for (i=0; i<c; i++) {
494 result[requestKeys[i]] = results[i]; 494 result[requestKeys[i]] = results[i];
495 } 495 }
496 } 496 }
497 497
498 return returnFunction.call(null, result); 498 return returnFunction.call(null, result);
499 }); 499 });
500 deferredResult.callback(aValue); 500 deferredResult.callback(aValue);
501 501
502 return deferredResult; 502 return deferredResult;
503 }, aName, someRequests, args); 503 }, aName, someRequests, args);
504 }, 504 },
505 505
506 //------------------------------------------------------------------------- 506 //-------------------------------------------------------------------------
507 507
508 'collectAll': function (someDeferredObjects) { 508 'collectAll': function (someDeferredObjects) {
509 var deferredResult; 509 var deferredResult;
510 510
511 deferredResult = new MochiKit.Async.DeferredList(someDeferredObjects, false, false, false); 511 deferredResult = new MochiKit.Async.DeferredList(someDeferredObjects, false, false, false);
512 deferredResult.addCallback(function (aResultList) { 512 deferredResult.addCallback(function (aResultList) {
513 return MochiKit.Base.map(function (aResult) { 513 return MochiKit.Base.map(function (aResult) {
514 if (aResult[0]) { 514 if (aResult[0]) {
515 return aResult[1]; 515 return aResult[1];
516 } else { 516 } else {
517 throw aResult[1]; 517 throw aResult[1];
518 } 518 }
519 }, aResultList); 519 }, aResultList);
520 }); 520 });
521 521
522 return deferredResult; 522 return deferredResult;
523 }, 523 },
524 524
525 //------------------------------------------------------------------------- 525 //-------------------------------------------------------------------------
526 526
527 'setItem': function (anObject, aKey, aValue) { 527 'setItem': function (anObject, aKey, aValue) {
528 anObject[aKey] = aValue; 528 anObject[aKey] = aValue;
529 529
530 return anObject; 530 return anObject;
531 }, 531 },
532 532
533 'setItemOnObject': function (aKey, aValue, anObject) { 533 'setItemOnObject': function (aKey, aValue, anObject) {
534 anObject[aKey] = aValue; 534 anObject[aKey] = aValue;
535 535
536 return anObject; 536 return anObject;
537 }, 537 },
538 538
539 'setDeferredItemOnObject': function (aKey, aDeferredFunction, anObject) { 539 'setDeferredItemOnObject': function (aKey, aDeferredFunction, anObject) {
540 return Clipperz.Async.callbacks("Clipperz.Async.setDeferredItemOnObject", [ 540 return Clipperz.Async.callbacks("Clipperz.Async.setDeferredItemOnObject", [
541 aDeferredFunction, 541 aDeferredFunction,
542 MochiKit.Base.partial(Clipperz.Async.setItem, anObject, aKey) 542 MochiKit.Base.partial(Clipperz.Async.setItem, anObject, aKey)
543 ], {trace:false}, anObject); 543 ], {trace:false}, anObject);
544 }, 544 },
545 545
546 //------------------------------------------------------------------------- 546 //-------------------------------------------------------------------------
547 547
548 'deferredIf': function (aName, aThenBlock, anElseBlock) { 548 'deferredIf': function (aName, aThenBlock, anElseBlock) {
549 return function (aValue) { 549 return function (aValue) {
550 var deferredResult; 550 var deferredResult;
551 551
552 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) { 552 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
553 deferredResult = Clipperz.Async.callbacks(aName + " <then>", aThenBlock, null, aValue); 553 deferredResult = Clipperz.Async.callbacks(aName + " <then>", aThenBlock, null, aValue);
554 } else { 554 } else {
555 deferredResult = Clipperz.Async.callbacks(aName + " <else>", anElseBlock, null, aValue); 555 deferredResult = Clipperz.Async.callbacks(aName + " <else>", anElseBlock, null, aValue);
556 } 556 }
557 557
558 return deferredResult; 558 return deferredResult;
559 } 559 }
560 }, 560 },
561 561
562 //------------------------------------------------------------------------- 562 //-------------------------------------------------------------------------
563 563
564 'log': function(aMessage, aResult) { 564 'log': function(aMessage, aResult) {
565 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) { 565 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
566 Clipperz.log(aMessage + " ", aResult); 566 Clipperz.log(aMessage + " ", aResult);
567 } 567 }
568 568
569 return aResult; 569 return aResult;
570 }, 570 },
571 571
572 //========================================================================= 572 //=========================================================================
573 573
574 'deferredCompare': function (aComparator, aDeferred, bDeferred) { 574 'deferredCompare': function (aComparator, aDeferred, bDeferred) {
575 var deferredResult; 575 var deferredResult;
576 576
577 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredCompare", {trace:false}); 577 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredCompare", {trace:false});
578 deferredResult.addCallback(Clipperz.Async.collectAll, [aDeferred, bDeferred]); 578 deferredResult.addCallback(Clipperz.Async.collectAll, [aDeferred, bDeferred]);
579 deferredResult.addCallback(function (someResults) { 579 deferredResult.addCallback(function (someResults) {
580 var result; 580 var result;
581 581
582 if (aComparator(someResults[0], someResults[1]) > 0) { 582 if (aComparator(someResults[0], someResults[1]) > 0) {
diff --git a/frontend/gamma/js/Clipperz/Base.js b/frontend/gamma/js/Clipperz/Base.js
index 76b2c3f..9d399d9 100644
--- a/frontend/gamma/js/Clipperz/Base.js
+++ b/frontend/gamma/js/Clipperz/Base.js
@@ -16,128 +16,133 @@ refer to http://www.clipperz.com.
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
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; } 27if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; }
28 28
29Clipperz.Base.VERSION = "0.2"; 29Clipperz.Base.VERSION = "0.2";
30Clipperz.Base.NAME = "Clipperz.Base"; 30Clipperz.Base.NAME = "Clipperz.Base";
31 31
32MochiKit.Base.update(Clipperz.Base, { 32MochiKit.Base.update(Clipperz.Base, {
33 33
34 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
35 35
36 '__repr__': function () { 36 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
38 }, 38 },
39 39
40 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
41 41
42 'toString': function () { 42 'toString': function () {
43 return this.__repr__(); 43 return this.__repr__();
44 }, 44 },
45 45
46 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
47 47
48 'itemgetter': function (aKeyPath) { 48 'itemgetter': function (aKeyPath) {
49 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]); 49 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]);
50 return MochiKit.Base.compose.apply(null, 50 return MochiKit.Base.compose.apply(null,
51 MochiKit.Base.map( 51 MochiKit.Base.map(
52 MochiKit.Base.itemgetter, 52 MochiKit.Base.itemgetter,
53 MochiKit.Iter.reversed( 53 MochiKit.Iter.reversed(
54 aKeyPath.split('.') 54 aKeyPath.split('.')
55 ) 55 )
56 ) 56 )
57 ); 57 );
58 }, 58 },
59 59
60 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
61 61
62 'isUrl': function (aValue) { 62 'isUrl': function (aValue) {
63 return (MochiKit.Base.urlRegExp.test(aValue)); 63 return (MochiKit.Base.urlRegExp.test(aValue));
64 }, 64 },
65 65
66 'isEmail': function (aValue) { 66 'isEmail': function (aValue) {
67 return (MochiKit.Base.emailRegExp.test(aValue)); 67 return (MochiKit.Base.emailRegExp.test(aValue));
68 }, 68 },
69 69
70 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
71 71
72 'caseInsensitiveCompare': function (a, b) { 72 'caseInsensitiveCompare': function (a, b) {
73 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase()); 73 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase());
74 }, 74 },
75 75
76 'reverseComparator': function (aComparator) { 76 'reverseComparator': function (aComparator) {
77 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator); 77 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator);
78 }, 78 },
79 79
80 'caseInsensitiveKeyComparator': function (aKey) {
81 return function (a, b) {
82 return MochiKit.Base.compare(a[aKey].toLowerCase(), b[aKey].toLowerCase());
83 }
84 },
80 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
81/* 86/*
82 'dependsOn': function(module, deps) { 87 'dependsOn': function(module, deps) {
83 if (!(module in Clipperz)) { 88 if (!(module in Clipperz)) {
84 MochiKit[module] = {}; 89 MochiKit[module] = {};
85 } 90 }
86 91
87 if (typeof(dojo) != 'undefined') { 92 if (typeof(dojo) != 'undefined') {
88 dojo.provide('Clipperz.' + module); 93 dojo.provide('Clipperz.' + module);
89 } 94 }
90 for (var i = 0; i < deps.length; i++) { 95 for (var i = 0; i < deps.length; i++) {
91 if (typeof(dojo) != 'undefined') { 96 if (typeof(dojo) != 'undefined') {
92 dojo.require('Clipperz.' + deps[i]); 97 dojo.require('Clipperz.' + deps[i]);
93 } 98 }
94 if (typeof(JSAN) != 'undefined') { 99 if (typeof(JSAN) != 'undefined') {
95 JSAN.use('Clipperz.' + deps[i], []); 100 JSAN.use('Clipperz.' + deps[i], []);
96 } 101 }
97 if (!(deps[i] in Clipperz)) { 102 if (!(deps[i] in Clipperz)) {
98 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!' 103 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!'
99 } 104 }
100 } 105 }
101 }, 106 },
102*/ 107*/
103 //------------------------------------------------------------------------- 108 //-------------------------------------------------------------------------
104 109
105 'trim': function (aValue) { 110 'trim': function (aValue) {
106 return aValue.replace(/^\s+|\s+$/g, ""); 111 return aValue.replace(/^\s+|\s+$/g, "");
107 }, 112 },
108 113
109 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
110 115
111 'stringToByteArray': function (aValue) { 116 'stringToByteArray': function (aValue) {
112 varresult; 117 varresult;
113 var i, c; 118 var i, c;
114 119
115 result = []; 120 result = [];
116 121
117 c = aValue.length; 122 c = aValue.length;
118 for (i=0; i<c; i++) { 123 for (i=0; i<c; i++) {
119 result[i] = aValue.charCodeAt(i); 124 result[i] = aValue.charCodeAt(i);
120 } 125 }
121 126
122 return result; 127 return result;
123 }, 128 },
124 129
125 //......................................................................... 130 //.........................................................................
126 131
127 'byteArrayToString': function (anArrayOfBytes) { 132 'byteArrayToString': function (anArrayOfBytes) {
128 varresult; 133 varresult;
129 var i, c; 134 var i, c;
130 135
131 result = ""; 136 result = "";
132 137
133 c = anArrayOfBytes.length; 138 c = anArrayOfBytes.length;
134 for (i=0; i<c; i++) { 139 for (i=0; i<c; i++) {
135 result += String.fromCharCode(anArrayOfBytes[i]); 140 result += String.fromCharCode(anArrayOfBytes[i]);
136 } 141 }
137 142
138 return result; 143 return result;
139 }, 144 },
140 145
141 //------------------------------------------------------------------------- 146 //-------------------------------------------------------------------------
142 147
143 'getValueForKeyInFormContent': function (aFormContent, aKey) { 148 'getValueForKeyInFormContent': function (aFormContent, aKey) {
diff --git a/frontend/gamma/js/Clipperz/PM/Connection.js b/frontend/gamma/js/Clipperz/PM/Connection.js
index b4e8aaa..a05a310 100644
--- a/frontend/gamma/js/Clipperz/PM/Connection.js
+++ b/frontend/gamma/js/Clipperz/PM/Connection.js
@@ -1,212 +1,223 @@
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
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28 28
29//----------------------------------------------------------------------------- 29//-----------------------------------------------------------------------------
30// 30//
31 // Abstract C O N N E C T I O N class 31 // Abstract C O N N E C T I O N class
32// 32//
33//----------------------------------------------------------------------------- 33//-----------------------------------------------------------------------------
34 34
35Clipperz.PM.Connection = function (args) { 35Clipperz.PM.Connection = function (args) {
36 args = args || {}; 36 args = args || {};
37 37
38 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy; 38 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy;
39 this._getCredentialsFunction = args.getCredentialsFunction; 39 this._getCredentialsFunction = args.getCredentialsFunction;
40 40
41 this._clipperz_pm_crypto_version = null; 41 this._clipperz_pm_crypto_version = null;
42 this._connectionId = null; 42 this._connectionId = null;
43 this._sharedSecret = null; 43 this._sharedSecret = null;
44 this._serverLockValue = null;
44 45
45 return this; 46 return this;
46} 47}
47 48
48Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, { 49Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
49 50
50 'toString': function() { 51 'toString': function() {
51 return "Connection [" + this.version() + "]"; 52 return "Connection [" + this.version() + "]";
52 }, 53 },
53 54
54 //========================================================================= 55 //=========================================================================
55 56
56 'version': function() { 57 'version': function() {
57 throw Clipperz.Base.exception.AbstractMethod; 58 throw Clipperz.Base.exception.AbstractMethod;
58 }, 59 },
59 60
60 'clipperz_pm_crypto_version': function() { 61 'clipperz_pm_crypto_version': function() {
61 if (this._clipperz_pm_crypto_version == null) { 62 if (this._clipperz_pm_crypto_version == null) {
62 var connectionVersions; 63 var connectionVersions;
63 varversions; 64 varversions;
64 varversion; 65 varversion;
65 var i, c; 66 var i, c;
66 67
67 version = null; 68 version = null;
68 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions; 69 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions;
69 versions = MochiKit.Base.keys(connectionVersions); 70 versions = MochiKit.Base.keys(connectionVersions);
70 c = versions.length; 71 c = versions.length;
71 for (i=0; i<c; i++) { 72 for (i=0; i<c; i++) {
72 if (! (versions[i] == 'current')) { 73 if (! (versions[i] == 'current')) {
73 if (this instanceof connectionVersions[versions[i]]) { 74 if (this instanceof connectionVersions[versions[i]]) {
74 version = versions[i]; 75 version = versions[i];
75 }; 76 };
76 } 77 }
77 } 78 }
78 79
79 this._clipperz_pm_crypto_version = version; 80 this._clipperz_pm_crypto_version = version;
80 } 81 }
81 82
82 return this._clipperz_pm_crypto_version; 83 return this._clipperz_pm_crypto_version;
83 }, 84 },
84 85
85 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
86 87
87 'defaultErrorHandler': function(anErrorString, anException) { 88 'defaultErrorHandler': function(anErrorString, anException) {
88MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")"); 89MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
89 }, 90 },
90 91
91 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
92 93
93 'getCredentialsFunction': function () { 94 'getCredentialsFunction': function () {
94 return this._getCredentialsFunction; 95 return this._getCredentialsFunction;
95 }, 96 },
96 97
97 'normalizedCredentials': function(someValues) { 98 'normalizedCredentials': function(someValues) {
98 throw Clipperz.Base.exception.AbstractMethod; 99 throw Clipperz.Base.exception.AbstractMethod;
99 }, 100 },
100 101
101 //========================================================================= 102 //=========================================================================
102 103
103 'proxy': function () { 104 'proxy': function () {
104 return this._proxy; 105 return this._proxy;
105 }, 106 },
106 107
107 //========================================================================= 108 //=========================================================================
108 109
109 'register': function () { 110 'register': function () {
110 throw Clipperz.Base.exception.AbstractMethod; 111 throw Clipperz.Base.exception.AbstractMethod;
111 }, 112 },
112 113
113 'login': function() { 114 'login': function() {
114 throw Clipperz.Base.exception.AbstractMethod; 115 throw Clipperz.Base.exception.AbstractMethod;
115 }, 116 },
116 117
117 //------------------------------------------------------------------------- 118 //-------------------------------------------------------------------------
118 119
119 'message': function(someArguments, aCallback) { 120 'message': function(someArguments, aCallback) {
120 throw Clipperz.Base.exception.AbstractMethod; 121 throw Clipperz.Base.exception.AbstractMethod;
121 }, 122 },
122 123
123 //------------------------------------------------------------------------- 124 //-------------------------------------------------------------------------
124 125
125 'serverSideUserCredentials': function() { 126 'serverSideUserCredentials': function() {
126 throw Clipperz.Base.exception.AbstractMethod; 127 throw Clipperz.Base.exception.AbstractMethod;
127 }, 128 },
128 129
129 //========================================================================= 130 //=========================================================================
130 131
131 'sharedSecret': function () { 132 'sharedSecret': function () {
132 return this._sharedSecret; 133 return this._sharedSecret;
133 }, 134 },
134 135
135 'setSharedSecret': function (aValue) { 136 'setSharedSecret': function (aValue) {
136 this._sharedSecret = aValue; 137 this._sharedSecret = aValue;
137 }, 138 },
138 139
139 //------------------------------------------------------------------------- 140 //-------------------------------------------------------------------------
140 141
141 'connectionId': function() { 142 'connectionId': function() {
142 return this._connectionId; 143 return this._connectionId;
143 }, 144 },
144 145
145 'setConnectionId': function(aValue) { 146 'setConnectionId': function(aValue) {
146 this._connectionId = aValue; 147 this._connectionId = aValue;
147 }, 148 },
148 149
150 //-------------------------------------------------------------------------
151
152 'serverLockValue': function () {
153 return this._serverLockValue;
154 },
155
156 'setServerLockValue': function (aValue) {
157 this._serverLockValue = aValue;
158 },
159
149 //========================================================================= 160 //=========================================================================
150/* 161/*
151 //TODO: ????? 162 //TODO: ?????
152 'oneTimePassword': function() { 163 'oneTimePassword': function() {
153 return this._oneTimePassword; 164 return this._oneTimePassword;
154 }, 165 },
155 166
156 'setOneTimePassword': function(aValue) { 167 'setOneTimePassword': function(aValue) {
157 this._oneTimePassword = aValue; 168 this._oneTimePassword = aValue;
158 }, 169 },
159*/ 170*/
160 //========================================================================= 171 //=========================================================================
161 172
162 'reset': function() { 173 'reset': function() {
163 this.setSharedSecret(null); 174 this.setSharedSecret(null);
164 this.setConnectionId(null); 175 this.setConnectionId(null);
165 }, 176 },
166 177
167 //========================================================================= 178 //=========================================================================
168 __syntaxFix__: "syntax fix" 179 __syntaxFix__: "syntax fix"
169 180
170} 181}
171); 182);
172 183
173 184
174if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; } 185if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
175//----------------------------------------------------------------------------- 186//-----------------------------------------------------------------------------
176// 187//
177 // S R P [ 1 . 0 ] C O N N E C T I O N class 188 // S R P [ 1 . 0 ] C O N N E C T I O N class
178// 189//
179//----------------------------------------------------------------------------- 190//-----------------------------------------------------------------------------
180 191
181Clipperz.PM.Connection.SRP['1.0'] = function (args) { 192Clipperz.PM.Connection.SRP['1.0'] = function (args) {
182 Clipperz.PM.Connection.call(this, args); 193 Clipperz.PM.Connection.call(this, args);
183 194
184 return this; 195 return this;
185} 196}
186 197
187Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), { 198Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
188 199
189 'version': function() { 200 'version': function() {
190 return '1.0'; 201 return '1.0';
191 }, 202 },
192 203
193 //========================================================================= 204 //=========================================================================
194 205
195 'register': function (someUserData) { 206 'register': function (someUserData) {
196 vardeferredResult; 207 vardeferredResult;
197 var cryptoVersion; 208 var cryptoVersion;
198 var srpConnection; 209 var srpConnection;
199 210
200 cryptoVersion = this.clipperz_pm_crypto_version(); 211 cryptoVersion = this.clipperz_pm_crypto_version();
201 212
202 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false}); 213 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false});
203 deferredResult.collectResults({ 214 deferredResult.collectResults({
204 'credentials': [ 215 'credentials': [
205 this.getCredentialsFunction(), 216 this.getCredentialsFunction(),
206 MochiKit.Base.method(this, 'normalizedCredentials'), 217 MochiKit.Base.method(this, 'normalizedCredentials'),
207 MochiKit.Base.bind(function(someCredentials) { 218 MochiKit.Base.bind(function(someCredentials) {
208 var srpConnection; 219 var srpConnection;
209 var result; 220 var result;
210 221
211 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 222 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
212 result = srpConnection.serverSideCredentials(); 223 result = srpConnection.serverSideCredentials();
@@ -259,259 +270,271 @@ Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.
259 270
260 }, 271 },
261 272
262 //========================================================================= 273 //=========================================================================
263 274
264 'redeemOneTimePassword': function (someParameters) { 275 'redeemOneTimePassword': function (someParameters) {
265//console.log("Connections.redeemOneTimePassword", someParameters['username'], someParameters['password']); 276//console.log("Connections.redeemOneTimePassword", someParameters['username'], someParameters['password']);
266/* 277/*
267 //========================================================================= 278 //=========================================================================
268 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js) 279 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js)
269 deferredResult.addCallback(function(anUsername, aOneTimePassword) { 280 deferredResult.addCallback(function(anUsername, aOneTimePassword) {
270 var args; 281 var args;
271 282
272 args = { 283 args = {
273 'message': 'oneTimePassword', 284 'message': 'oneTimePassword',
274 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion, 285 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion,
275 'parameters': { 286 'parameters': {
276 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword), 287 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword),
277 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword) 288 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword)
278 } 289 }
279 } 290 }
280 291
281 return args; 292 return args;
282 }, anUsername, oneTimePassword); 293 }, anUsername, oneTimePassword);
283 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP'); 294 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP');
284 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake')); 295 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
285 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase'); 296 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase');
286 deferredResult.addCallback(function(aResult) { 297 deferredResult.addCallback(function(aResult) {
287 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']); 298 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']);
288 }); 299 });
289 deferredResult.addCallback(function(aResult) { 300 deferredResult.addCallback(function(aResult) {
290 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); 301 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
291 }); 302 });
292 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername), 303 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername),
293*/ 304*/
294 var args; 305 var args;
295 var normalizedOTP; 306 var normalizedOTP;
296 307
297 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']); 308 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']);
298 309
299 args = { 310 args = {
300 'message': 'oneTimePassword', 311 'message': 'oneTimePassword',
301 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion, 312 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion,
302 'parameters': { 313 'parameters': {
303 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP), 314 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP),
304 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP) 315 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP)
305 } 316 }
306 } 317 }
307 318
308 return Clipperz.Async.callbacks("Connction.redeemOTP", [ 319 return Clipperz.Async.callbacks("Connction.redeemOTP", [
309 MochiKit.Base.method(this.proxy(), 'handshake', args), 320 MochiKit.Base.method(this.proxy(), 'handshake', args),
310 function(aResult) { 321 function(aResult) {
311 return Clipperz.PM.Crypto.deferredDecrypt({ 322 return Clipperz.PM.Crypto.deferredDecrypt({
312 value:aResult['data'], 323 value:aResult['data'],
313 key:normalizedOTP, 324 key:normalizedOTP,
314 version:aResult['version'] 325 version:aResult['version']
315 }); 326 });
316 }, 327 },
317 function(aResult) { 328 function(aResult) {
318 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); 329 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
319 } 330 }
320 ], {trace:false}) 331 ], {trace:false})
321 }, 332 },
322 333
323 'login': function(/*anUsername, aPassphrase*/) { 334 'login': function(isReconnecting) {
324 vardeferredResult; 335 vardeferredResult;
325 var cryptoVersion; 336 var cryptoVersion;
326 var srpConnection; 337 var srpConnection;
327 338
328 cryptoVersion = this.clipperz_pm_crypto_version(); 339 cryptoVersion = this.clipperz_pm_crypto_version();
329
330 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false}); 340 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false});
331 deferredResult.addCallback(this.getCredentialsFunction()); 341 deferredResult.addCallback(this.getCredentialsFunction());
332 deferredResult.addMethod(this, 'normalizedCredentials'); 342 deferredResult.addMethod(this, 'normalizedCredentials');
333 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials'); 343 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials');
334 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 344 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
335 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) { 345 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) {
336 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 346 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
337 }, this)); 347 }, this));
338 deferredResult.addCallback(function() { 348 deferredResult.addCallback(function() {
339 var result; 349 var result;
340 350
341 result = { 351 result = {
342 message: 'connect', 352 message: 'connect',
343 version: cryptoVersion, 353 version: cryptoVersion,
344 parameters: { 354 parameters: {
345 C: srpConnection.C(), 355 C: srpConnection.C(),
346 A: srpConnection.A().asString(16) 356 A: srpConnection.A().asString(16)
347 // reconnecting: this.connectionId() 357 // reconnecting: this.connectionId()
348 } 358 }
349 }; 359 };
350 360
351 // TODO: ????? 361 // TODO: ?????
352 // if (isReconnecting == true) { 362 // if (isReconnecting == true) {
353 // args.parameters['reconnecting'] = aConnection.connectionId(); 363 // args.parameters['reconnecting'] = aConnection.connectionId();
354 // } 364 // }
355 365
356 return result; 366 return result;
357 }); 367 });
358 deferredResult.addMethod(this.proxy(), 'handshake'); 368 deferredResult.addMethod(this.proxy(), 'handshake');
359 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification'); 369 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification');
360 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 370 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
361 deferredResult.addCallback(function(someParameters) { 371 deferredResult.addCallback(function(someParameters) {
362 var result; 372 var result;
363 373
364 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16)); 374 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
365 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16)); 375 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
366 376
367 //TODO: ????? 377 //TODO: ?????
368 // if (typeof(someParameters['oneTimePassword']) != 'undefined') { 378 // if (typeof(someParameters['oneTimePassword']) != 'undefined') {
369 // this.setOneTimePassword(someParameters['oneTimePassword']); 379 // this.setOneTimePassword(someParameters['oneTimePassword']);
370 // } 380 // }
371 381
372 result = { 382 result = {
373 message: 'credentialCheck', 383 message: 'credentialCheck',
374 version: cryptoVersion, 384 version: cryptoVersion,
375 parameters: { 385 parameters: {
376 M1: srpConnection.M1() 386 M1: srpConnection.M1()
377 } 387 }
378 }; 388 };
379 389
380 return result; 390 return result;
381 }); 391 });
382 deferredResult.addMethod(this.proxy(), 'handshake'); 392 deferredResult.addMethod(this.proxy(), 'handshake');
383 deferredResult.addCallback(function(someParameters) { 393 deferredResult.addCallback(function(someParameters) {
384 var result; 394 var result;
385 395
386 if (someParameters['M2'] == srpConnection.M2()) { 396 if (someParameters['M2'] == srpConnection.M2()) {
387 result = MochiKit.Async.succeed(someParameters); 397 result = MochiKit.Async.succeed(someParameters);
388 } else { 398 } else {
389 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum); 399 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
390 } 400 }
391 401
392 return result; 402 return result;
393 }); 403 });
394 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) { 404 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
395 this.setConnectionId(someParameters['connectionId']); 405 this.setConnectionId(someParameters['connectionId']);
396 this.setSharedSecret(srpConnection.K()); 406 this.setSharedSecret(srpConnection.K());
397 407
398 // TODO: ????? 408 // TODO: ?????
399 // if (this.oneTimePassword() != null) { 409 // if (this.oneTimePassword() != null) {
400 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword())); 410 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword()));
401 // } 411 // }
412
413 if ((isReconnecting == true) && (this.serverLockValue() != someParameters['lock'])) {
414 throw Clipperz.PM.Connection.exception.StaleData;
415 } else {
416 this.setServerLockValue(someParameters['lock']);
417 }
418
402 return someParameters; 419 return someParameters;
403 }, this)); 420 }, this));
404 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn'); 421 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn');
405 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 422 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
406 deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"}); 423 deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"});
407 424
408 deferredResult.callback(); 425 deferredResult.callback();
409 426
410 return deferredResult; 427 return deferredResult;
411 }, 428 },
412 429
413 //========================================================================= 430 //=========================================================================
414 431
415 'logout': function() { 432 'logout': function() {
416 return Clipperz.Async.callbacks("Connection.logout", [ 433 return Clipperz.Async.callbacks("Connection.logout", [
417 MochiKit.Base.method(this, 'setSharedSecret'), 434 MochiKit.Base.method(this, 'setSharedSecret'),
418 MochiKit.Base.method(this.proxy(), 'logout', {}) 435 MochiKit.Base.method(this.proxy(), 'logout', {})
419 ], {trace:false}); 436 ], {trace:false});
420 }, 437 },
421 438
422 //========================================================================= 439 //=========================================================================
423 440
424 'ping': function () { 441 'ping': function () {
425 //TODO: ping the server in order to have a valid session 442 //TODO: ping the server in order to have a valid session
426 }, 443 },
427 444
428 //========================================================================= 445 //=========================================================================
429 446
430 'message': function(aMessageName, someParameters) { 447 'message': function(aMessageName, someParameters) {
431 var args; 448 var args;
449 var parameters;
450
451 parameters = someParameters || {};
452 if (typeof(parameters['user']) != 'undefined') {
453 parameters['user']['lock'] = this.serverLockValue();
454 }
432 455
433//console.log(">>> Connection.message", aMessageName, someParameters); 456//console.log(">>> Connection.message", aMessageName, someParameters);
434 args = { 457 args = {
435 message: aMessageName, 458 message: aMessageName,
436 srpSharedSecret: this.sharedSecret(), 459 srpSharedSecret: this.sharedSecret(),
437 parameters: (someParameters || {}) 460 // parameters: (someParameters || {})
461 parameters: parameters
438 } 462 }
439 463
440 return this.sendMessage(args); 464 return this.sendMessage(args);
441 }, 465 },
442 466
443 //------------------------------------------------------------------------- 467 //-------------------------------------------------------------------------
444 468
445 'sendMessage': function(someArguments) { 469 'sendMessage': function(someArguments) {
446 vardeferredResult; 470 vardeferredResult;
447 471
448 deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false}); 472 deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false});
449 deferredResult.addMethod(this.proxy(), 'message', someArguments); 473 deferredResult.addMethod(this.proxy(), 'message', someArguments);
450 deferredResult.addCallback(MochiKit.Base.bind(function(res) { 474 deferredResult.addCallback(MochiKit.Base.bind(function(res) {
451 if (typeof(res['lock']) != 'undefined') { 475 if (typeof(res['lock']) != 'undefined') {
452 //TODO: ????? 476 this.setServerLockValue(res['lock']);
453 // ?? this.user().setLock(res['lock']);
454 } 477 }
455 return res; 478 return res;
456 }, this)); 479 }, this));
457 480
458 deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments); 481 deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments);
459 deferredResult.callback(); 482 deferredResult.callback();
460 483
461 return deferredResult 484 return deferredResult
462 }, 485 },
463 486
464 //------------------------------------------------------------------------- 487 //-------------------------------------------------------------------------
465 488
466 'messageExceptionHandler': function(anOriginalMessageArguments, anError) { 489 'messageExceptionHandler': function(anOriginalMessageArguments, anError) {
467 var result; 490 var result;
468 491
469console.log(">>> Connection.messageExceptionHandler", anError, anError.message); 492console.log(">>> Connection.messageExceptionHandler", anError, anError.message);
470 if (anError instanceof MochiKit.Async.CancelledError) { 493 if (anError instanceof MochiKit.Async.CancelledError) {
471 result = anError; 494 result = anError;
472 } else { 495 } else {
473 if ((anError.message == 'Trying to communicate without an active connection')|| 496 if ((anError.message == 'Trying to communicate without an active connection')||
474 (anError.message == 'No tollManager available for current session') 497 (anError.message == 'No tollManager available for current session')
475 ) { 498 ) {
476 result = this.reestablishConnection(anOriginalMessageArguments); 499 result = this.reestablishConnection(anOriginalMessageArguments);
477 } else if (anError.message == 'Session with stale data') { 500 } else if (anError.message == 'Session with stale data') {
478 MochiKit.Signal.signal(this, 'EXCEPTION'); 501 MochiKit.Signal.signal(this, 'EXCEPTION');
479 } else { 502 } else {
480 result = anError; 503 result = anError;
481 } 504 }
482 } 505 }
483console.log("<<< Connection.messageExceptionHandler", anError) 506console.log("<<< Connection.messageExceptionHandler", anError)
484 507
485 return result;; 508 return result;;
486 }, 509 },
487 510
488 //========================================================================= 511 //=========================================================================
489 512
490 'reestablishConnection': function(anOriginalMessageArguments) { 513 'reestablishConnection': function(anOriginalMessageArguments) {
491 var deferredResult; 514 var deferredResult;
492 515
493 deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection"); 516 deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection");
494 deferredResult.addMethod(this, 'reset'); 517 deferredResult.addMethod(this, 'reset');
495 deferredResult.addMethod(this, 'login', true); 518 deferredResult.addMethod(this, 'login', true);
496 deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) { 519 deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) {
497 aMessage['srpSharedSecret'] = this.sharedSecret(); 520 aMessage['srpSharedSecret'] = this.sharedSecret();
498 return aMessage; 521 return aMessage;
499 }, this), anOriginalMessageArguments); 522 }, this), anOriginalMessageArguments);
500 deferredResult.addMethod(this, 'sendMessage'); 523 deferredResult.addMethod(this, 'sendMessage');
501 deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null); 524 deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null);
502 deferredResult.callback(); 525 deferredResult.callback();
503 526
504 return deferredResult; 527 return deferredResult;
505 }, 528 },
506 529
507 //========================================================================= 530 //=========================================================================
508 531
509 'serverSideUserCredentials': function(aUsername, aPassword) { 532 'serverSideUserCredentials': function(aUsername, aPassword) {
510 varresult; 533 varresult;
511 varnewSrpConnection; 534 varnewSrpConnection;
512 var normalizedAttributes; 535 var normalizedAttributes;
513 536
514 normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword}); 537 normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword});
515 newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() }); 538 newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() });
516 result = newSrpConnection.serverSideCredentials(); 539 result = newSrpConnection.serverSideCredentials();
517 result['version'] = this.clipperz_pm_crypto_version(); 540 result['version'] = this.clipperz_pm_crypto_version();
@@ -526,91 +549,92 @@ console.log("<<< Connection.messageExceptionHandler", anError)
526 549
527 result = {} 550 result = {}
528 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2); 551 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2);
529 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2); 552 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
530 553
531 return result; 554 return result;
532 }, 555 },
533 556
534 //----------------------------------------------------------------------------- 557 //-----------------------------------------------------------------------------
535 558
536 'hash': function() { 559 'hash': function() {
537 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash; 560 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash;
538 }, 561 },
539 562
540 //----------------------------------------------------------------------------- 563 //-----------------------------------------------------------------------------
541 __syntaxFix__: "syntax fix" 564 __syntaxFix__: "syntax fix"
542 565
543}); 566});
544 567
545 568
546 569
547//----------------------------------------------------------------------------- 570//-----------------------------------------------------------------------------
548// 571//
549 // S R P [ 1 . 1 ] C O N N E C T I O N class 572 // S R P [ 1 . 1 ] C O N N E C T I O N class
550// 573//
551//----------------------------------------------------------------------------- 574//-----------------------------------------------------------------------------
552 575
553Clipperz.PM.Connection.SRP['1.1'] = function (args) { 576Clipperz.PM.Connection.SRP['1.1'] = function (args) {
554 Clipperz.PM.Connection.SRP['1.0'].call(this, args); 577 Clipperz.PM.Connection.SRP['1.0'].call(this, args);
555 578
556 return this; 579 return this;
557} 580}
558 581
559Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), { 582Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), {
560 583
561 'version': function() { 584 'version': function() {
562 return '1.1'; 585 return '1.1';
563 }, 586 },
564 587
565 //----------------------------------------------------------------------------- 588 //-----------------------------------------------------------------------------
566 589
567 'normalizedCredentials': function(someValues) { 590 'normalizedCredentials': function(someValues) {
568 var result; 591 var result;
569 592
570 result = {} 593 result = {}
571 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2); 594 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2);
572 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2); 595 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
573 596
574 return result; 597 return result;
575 }, 598 },
576 599
577 //----------------------------------------------------------------------------- 600 //-----------------------------------------------------------------------------
578 601
579 'hash': function() { 602 'hash': function() {
580 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash; 603 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash;
581 }, 604 },
582 605
583 //----------------------------------------------------------------------------- 606 //-----------------------------------------------------------------------------
584 __syntaxFix__: "syntax fix" 607 __syntaxFix__: "syntax fix"
585 608
586}); 609});
587 610
588Clipperz.PM.Connection.exception = { 611Clipperz.PM.Connection.exception = {
589 WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue"), 612 WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue"),
613 StaleData: new MochiKit.Base.NamedError("Stale data"),
590 UnexpectedRequest:new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.UnexpectedRequest") 614 UnexpectedRequest:new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.UnexpectedRequest")
591}; 615};
592 616
593 617
594Clipperz.PM.Connection.communicationProtocol = { 618Clipperz.PM.Connection.communicationProtocol = {
595 'currentVersion': '0.2', 619 'currentVersion': '0.2',
596 'versions': { 620 'versions': {
597 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection, 621 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
598 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection 622 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
599 }, 623 },
600 'fallbackVersions': { 624 'fallbackVersions': {
601 // 'current':'0.1', 625 // 'current':'0.1',
602 '0.2': '0.1', 626 '0.2': '0.1',
603 '0.1': null 627 '0.1': null
604 } 628 }
605}; 629};
606 630
607MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, { 631MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
608 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion] 632 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
609}); 633});
610 634
611MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.fallbackVersions, { 635MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.fallbackVersions, {
612 'current': Clipperz.PM.Connection.communicationProtocol.fallbackVersions[Clipperz.PM.Connection.communicationProtocol.currentVersion] 636 'current': Clipperz.PM.Connection.communicationProtocol.fallbackVersions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
613}); 637});
614 638
615 639
616 640
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
index 72d4006..646ce21 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
@@ -1,396 +1,396 @@
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
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 29
30 30
31//############################################################################# 31//#############################################################################
32 32
33Clipperz.PM.DataModel.User = function (args) { 33Clipperz.PM.DataModel.User = function (args) {
34 args = args || {}; 34 args = args || {};
35 35
36 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments); 36 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments);
37 37
38 this._username = args.username || null; 38 this._username = args.username || null;
39 this._getPassphraseFunction = args.getPassphraseFunction || null; 39 this._getPassphraseFunction = args.getPassphraseFunction || null;
40 40
41 this._data = null; 41 this._data = null;
42 42
43 this._connection = null; 43 this._connection = null;
44 this._connectionVersion = 'current'; 44 this._connectionVersion = 'current';
45 45
46 this._serverData = null; 46 this._serverData = null;
47 this._serverLockValue = null; 47 //this._serverLockValue = null;
48 this._transientState = null; 48 this._transientState = null;
49 49
50 this._deferredLocks = { 50 this._deferredLocks = {
51 'passphrase': new MochiKit.Async.DeferredLock(), 51 'passphrase': new MochiKit.Async.DeferredLock(),
52 'serverData': new MochiKit.Async.DeferredLock(), 52 'serverData': new MochiKit.Async.DeferredLock(),
53 // 'recordsIndex': new MochiKit.Async.DeferredLock(), 53 // 'recordsIndex': new MochiKit.Async.DeferredLock(),
54 // 'directLoginsIndex':new MochiKit.Async.DeferredLock() 54 // 'directLoginsIndex':new MochiKit.Async.DeferredLock()
55 // 'preferences': new MochiKit.Async.DeferredLock() 55 // 'preferences': new MochiKit.Async.DeferredLock()
56 // 'oneTimePasswords': new MochiKit.Async.DeferredLock() 56 // 'oneTimePasswords': new MochiKit.Async.DeferredLock()
57 '__syntaxFix__': 'syntax fix' 57 '__syntaxFix__': 'syntax fix'
58 }; 58 };
59 59
60 return this; 60 return this;
61} 61}
62 62
63Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, { 63Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
64 64
65 'toString': function () { 65 'toString': function () {
66 return "Clipperz.PM.DataModel.User - " + this.username(); 66 return "Clipperz.PM.DataModel.User - " + this.username();
67 }, 67 },
68 68
69 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
70 70
71 'username': function () { 71 'username': function () {
72 return this._username; 72 return this._username;
73 }, 73 },
74 74
75 'setUsername': function (aValue) { 75 'setUsername': function (aValue) {
76 this._username = aValue; 76 this._username = aValue;
77 }, 77 },
78 78
79 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
80 80
81 'displayName': function() { 81 'displayName': function() {
82 return "" + this.username() + ""; 82 return "" + this.username() + "";
83 }, 83 },
84 84
85 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
86 86
87 'data': function () { 87 'data': function () {
88 if (this._data == null) { 88 if (this._data == null) {
89 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/); 89 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/);
90 }; 90 };
91 91
92 return this._data; 92 return this._data;
93 }, 93 },
94 94
95 //------------------------------------------------------------------------- 95 //-------------------------------------------------------------------------
96 96/*
97 'serverLockValue': function () { 97 'serverLockValue': function () {
98 return this._serverLockValue; 98 return this._serverLockValue;
99 }, 99 },
100 100
101 'setServerLockValue': function (aValue) { 101 'setServerLockValue': function (aValue) {
102 this._serverLockValue = aValue; 102 this._serverLockValue = aValue;
103 }, 103 },
104 104*/
105 //------------------------------------------------------------------------- 105 //-------------------------------------------------------------------------
106 106
107 'transientState': function () { 107 'transientState': function () {
108 if (this._transientState == null) { 108 if (this._transientState == null) {
109 this._transientState = {} 109 this._transientState = {}
110 } 110 }
111 111
112 return this._transientState; 112 return this._transientState;
113 }, 113 },
114 114
115 'resetTransientState': function (isCommitting) { 115 'resetTransientState': function (isCommitting) {
116 this._transientState = null; 116 this._transientState = null;
117 }, 117 },
118 118
119 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
120 120
121 'deferredLockForSection': function(aSectionName) { 121 'deferredLockForSection': function(aSectionName) {
122 return this._deferredLocks[aSectionName]; 122 return this._deferredLocks[aSectionName];
123 }, 123 },
124 124
125 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
126 126
127 'getPassphrase': function() { 127 'getPassphrase': function() {
128 var deferredResult; 128 var deferredResult;
129 129
130 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false}); 130 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false});
131 deferredResult.acquireLock(this.deferredLockForSection('passphrase')); 131 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
132 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction()); 132 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction());
133 deferredResult.releaseLock(this.deferredLockForSection('passphrase')); 133 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
134 deferredResult.callback(); 134 deferredResult.callback();
135 135
136 return deferredResult; 136 return deferredResult;
137 }, 137 },
138 138
139 'getPassphraseFunction': function () { 139 'getPassphraseFunction': function () {
140 return this._getPassphraseFunction; 140 return this._getPassphraseFunction;
141 }, 141 },
142 142
143 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
144 144
145 'getCredentials': function () { 145 'getCredentials': function () {
146 return Clipperz.Async.collectResults("User; get username and passphrase", { 146 return Clipperz.Async.collectResults("User; get username and passphrase", {
147 'username': MochiKit.Base.method(this, 'username'), 147 'username': MochiKit.Base.method(this, 'username'),
148 'password': MochiKit.Base.method(this, 'getPassphrase') 148 'password': MochiKit.Base.method(this, 'getPassphrase')
149 }, {trace:false})(); 149 }, {trace:false})();
150 }, 150 },
151 151
152 //------------------------------------------------------------------------- 152 //-------------------------------------------------------------------------
153 153
154 'changePassphrase': function (aNewValue) { 154 'changePassphrase': function (aNewValue) {
155 return this.updateCredentials(this.username(), aNewValue); 155 return this.updateCredentials(this.username(), aNewValue);
156 }, 156 },
157 157
158 //......................................................................... 158 //.........................................................................
159 159
160 'updateCredentials': function (aUsername, aPassphrase) { 160 'updateCredentials': function (aUsername, aPassphrase) {
161 vardeferredResult; 161 vardeferredResult;
162 162
163 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false}); 163 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false});
164 // deferredResult.addMethod(this, 'getPassphrase'); 164 // deferredResult.addMethod(this, 'getPassphrase');
165 // deferredResult.setValue('currentPassphrase'); 165 // deferredResult.setValue('currentPassphrase');
166 deferredResult.addMethod(this.connection(), 'ping'); 166 deferredResult.addMethod(this.connection(), 'ping');
167 deferredResult.addMethod(this, 'setUsername', aUsername) 167 deferredResult.addMethod(this, 'setUsername', aUsername)
168 deferredResult.acquireLock(this.deferredLockForSection('passphrase')); 168 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
169 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase); 169 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase);
170 deferredResult.releaseLock(this.deferredLockForSection('passphrase')); 170 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
171 // deferredResult.getValue('currentPassphrase'); 171 // deferredResult.getValue('currentPassphrase');
172 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase); 172 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase);
173 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase); 173 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase);
174 deferredResult.callback(); 174 deferredResult.callback();
175 175
176 return deferredResult; 176 return deferredResult;
177 }, 177 },
178 178
179 //------------------------------------------------------------------------- 179 //-------------------------------------------------------------------------
180 180
181 'initialSetupWithNoData': function () { 181 'initialSetupWithNoData': function () {
182 this._serverData = { 182 this._serverData = {
183 'version': '0.1', 183 'version': '0.1',
184 'statistics': "", 184 'statistics': "",
185 'header': { 185 'header': {
186 'data': null, 186 'data': null,
187 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, 187 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
188 188
189 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({ 189 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({
190 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 190 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
191 'recordsData': {'data':null, 'index':{}}, 191 'recordsData': {'data':null, 'index':{}},
192 'recordsStats': null, 192 'recordsStats': null,
193 'directLoginsData': {'data':null, 'index':{}}, 193 'directLoginsData': {'data':null, 'index':{}},
194 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, 194 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
195 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 195 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
196 }), 196 }),
197 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({ 197 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({
198 'name':'preferences', 198 'name':'preferences',
199 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 199 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
200 }), 200 }),
201 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 201 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
202 'name':'preferences', 202 'name':'preferences',
203 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 203 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
204 }) 204 })
205 } 205 }
206 }; 206 };
207 207
208 // this._serverLockValue = Clipperz.PM.Crypto.randomKey(); 208 // this._serverLockValue = Clipperz.PM.Crypto.randomKey();
209 }, 209 },
210 210
211 //......................................................................... 211 //.........................................................................
212 212
213 'registerAsNewAccount': function () { 213 'registerAsNewAccount': function () {
214 var deferredResult; 214 var deferredResult;
215 215
216 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false}); 216 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false});
217 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); 217 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
218 deferredResult.addMethod(this, 'initialSetupWithNoData') 218 deferredResult.addMethod(this, 'initialSetupWithNoData')
219 deferredResult.addMethod(this, 'getPassphrase'); 219 deferredResult.addMethod(this, 'getPassphrase');
220 deferredResult.addMethod(this, 'prepareRemoteDataWithKey'); 220 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
221 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 221 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
222 deferredResult.addMethod(this.connection(), 'register'); 222 deferredResult.addMethod(this.connection(), 'register');
223 deferredResult.addCallback(MochiKit.Base.itemgetter('lock')); 223 // deferredResult.addCallback(MochiKit.Base.itemgetter('lock'));
224 deferredResult.addMethod(this, 'setServerLockValue'); 224 // deferredResult.addMethod(this, 'setServerLockValue');
225 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered'); 225 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered');
226 226
227 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure')); 227 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure'));
228 228
229 deferredResult.callback(); 229 deferredResult.callback();
230 230
231 return deferredResult; 231 return deferredResult;
232 }, 232 },
233 233
234 //------------------------------------------------------------------------- 234 //-------------------------------------------------------------------------
235 235
236 'login': function () { 236 'login': function () {
237 var deferredResult; 237 var deferredResult;
238 238
239 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false}); 239 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false});
240 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); 240 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
241 deferredResult.addMethod(this, 'getPassphrase'); 241 deferredResult.addMethod(this, 'getPassphrase');
242 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue); 242 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue);
243 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [ 243 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [
244 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}), 244 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}),
245 MochiKit.Base.method(this, 'getCredentials'), 245 MochiKit.Base.method(this, 'getCredentials'),
246 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'), 246 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'),
247 MochiKit.Base.method(this.data(), 'setValue', 'passphrase') 247 MochiKit.Base.method(this.data(), 'setValue', 'passphrase')
248 ], [])); 248 ], []));
249 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase')); 249 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase'));
250 deferredResult.addMethod(this.connection(), 'login'); 250 deferredResult.addMethod(this.connection(), 'login', false);
251 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn'); 251 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn');
252 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback')); 252 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback'));
253 253
254 deferredResult.callback(); 254 deferredResult.callback();
255 255
256 return deferredResult; 256 return deferredResult;
257 }, 257 },
258 258
259 //......................................................................... 259 //.........................................................................
260 260
261 'handleConnectionFallback': function(aValue) { 261 'handleConnectionFallback': function(aValue) {
262 var result; 262 var result;
263 263
264 if (aValue instanceof MochiKit.Async.CancelledError) { 264 if (aValue instanceof MochiKit.Async.CancelledError) {
265 result = aValue; 265 result = aValue;
266 } else { 266 } else {
267 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]); 267 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]);
268 268
269 if (this.connectionVersion() != null) { 269 if (this.connectionVersion() != null) {
270 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry"); 270 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry");
271 271
272 result.addMethod(this, 'login'); 272 result.addMethod(this, 'login');
273 result.callback(); 273 result.callback();
274 } else { 274 } else {
275 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [ 275 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [
276 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'), 276 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'),
277 MochiKit.Base.method(this, 'setConnectionVersion', 'current'), 277 MochiKit.Base.method(this, 'setConnectionVersion', 'current'),
278 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'), 278 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'),
279 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed) 279 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed)
280 ], {trace:false}); 280 ], {trace:false});
281 } 281 }
282 } 282 }
283 283
284 return result; 284 return result;
285 }, 285 },
286 286
287 //------------------------------------------------------------------------- 287 //-------------------------------------------------------------------------
288 288
289 'lock': function () { 289 'lock': function () {
290 return Clipperz.Async.callbacks("User.lock", [ 290 return Clipperz.Async.callbacks("User.lock", [
291 MochiKit.Base.method(this, 'deleteAllCleanTextData') 291 MochiKit.Base.method(this, 'deleteAllCleanTextData')
292 ], {trace:false}); 292 ], {trace:false});
293 }, 293 },
294 294
295 //------------------------------------------------------------------------- 295 //-------------------------------------------------------------------------
296 296
297 'logout': function () { 297 'logout': function () {
298 return Clipperz.Async.callbacks("User.logout", [ 298 return Clipperz.Async.callbacks("User.logout", [
299 MochiKit.Base.method(this, 'deleteAllCleanTextData'), 299 MochiKit.Base.method(this, 'deleteAllCleanTextData'),
300 MochiKit.Base.method(this.connection(), 'logout') 300 MochiKit.Base.method(this.connection(), 'logout')
301 ], {trace:false}); 301 ], {trace:false});
302 }, 302 },
303 303
304 //------------------------------------------------------------------------- 304 //-------------------------------------------------------------------------
305 305
306 'headerFormatVersion': function(anHeader) { 306 'headerFormatVersion': function(anHeader) {
307 var result; 307 var result;
308 308
309 if (anHeader.charAt(0) == '{') { 309 if (anHeader.charAt(0) == '{') {
310 varheaderData; 310 varheaderData;
311 311
312 headerData = Clipperz.Base.evalJSON(anHeader); 312 headerData = Clipperz.Base.evalJSON(anHeader);
313 result = headerData['version']; 313 result = headerData['version'];
314 } else { 314 } else {
315 result = 'LEGACY'; 315 result = 'LEGACY';
316 } 316 }
317 317
318 return result; 318 return result;
319 }, 319 },
320 320
321 //------------------------------------------------------------------------- 321 //-------------------------------------------------------------------------
322 322
323 'unpackServerData': function (someServerData) { 323 'unpackServerData': function (someServerData) {
324 var unpackedData; 324 var unpackedData;
325 var headerVersion; 325 var headerVersion;
326 326
327 varrecordsIndex; 327 varrecordsIndex;
328 var preferences; 328 var preferences;
329 var oneTimePasswords; 329 var oneTimePasswords;
330 330
331//console.log(">>> ***************** user.unpackServerData", someServerData); 331//console.log(">>> ***************** user.unpackServerData", someServerData);
332 this.setServerLockValue(someServerData['lock']); 332 // this.setServerLockValue(someServerData['lock']);
333 333
334 headerVersion = this.headerFormatVersion(someServerData['header']); 334 headerVersion = this.headerFormatVersion(someServerData['header']);
335 335
336 switch (headerVersion) { 336 switch (headerVersion) {
337 case 'LEGACY': 337 case 'LEGACY':
338 varlegacyHeader; 338 varlegacyHeader;
339 339
340 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({ 340 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({
341 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 341 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
342 'remoteData': { 342 'remoteData': {
343 'data': someServerData['header'], 343 'data': someServerData['header'],
344 'version': someServerData['version'], 344 'version': someServerData['version'],
345 'recordsStats': someServerData['recordsStats'] 345 'recordsStats': someServerData['recordsStats']
346 }, 346 },
347 // 'encryptedDataKeypath': 'data', 347 // 'encryptedDataKeypath': 'data',
348 // 'encryptedVersionKeypath': 'version', 348 // 'encryptedVersionKeypath': 'version',
349 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 349 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
350 }); 350 });
351 351
352 recordsIndex = legacyHeader; 352 recordsIndex = legacyHeader;
353 preferences = legacyHeader; 353 preferences = legacyHeader;
354 oneTimePasswords= legacyHeader; 354 oneTimePasswords= legacyHeader;
355 break; 355 break;
356 case '0.1': 356 case '0.1':
357 varheaderData; 357 varheaderData;
358 358
359 headerData = Clipperz.Base.evalJSON(someServerData['header']); 359 headerData = Clipperz.Base.evalJSON(someServerData['header']);
360 360
361 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({ 361 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({
362 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 362 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
363 'recordsData': headerData['records'], 363 'recordsData': headerData['records'],
364 'recordsStats': someServerData['recordsStats'], 364 'recordsStats': someServerData['recordsStats'],
365 'directLoginsData': headerData['directLogins'], 365 'directLoginsData': headerData['directLogins'],
366 'encryptedDataVersion': someServerData['version'], 366 'encryptedDataVersion': someServerData['version'],
367 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 367 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
368 }); 368 });
369 369
370 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing 370 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing
371 if (typeof(headerData['preferences']) != 'undefined') { 371 if (typeof(headerData['preferences']) != 'undefined') {
372 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 372 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
373 'name':'preferences', 373 'name':'preferences',
374 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 374 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
375 'remoteData': { 375 'remoteData': {
376 'data': headerData['preferences']['data'], 376 'data': headerData['preferences']['data'],
377 'version': someServerData['version'] 377 'version': someServerData['version']
378 } 378 }
379 }); 379 });
380 } else { 380 } else {
381 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 381 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
382 'name':'preferences', 382 'name':'preferences',
383 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 383 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
384 }); 384 });
385 } 385 }
386 386
387 if (typeof(headerData['oneTimePasswords']) != 'undefined') { 387 if (typeof(headerData['oneTimePasswords']) != 'undefined') {
388 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 388 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
389 'name':'preferences', 389 'name':'preferences',
390 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 390 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
391 'remoteData': { 391 'remoteData': {
392 'data': headerData['oneTimePasswords']['data'], 392 'data': headerData['oneTimePasswords']['data'],
393 'version': someServerData['version'] 393 'version': someServerData['version']
394 } 394 }
395 }); 395 });
396 } else { 396 } else {
@@ -601,207 +601,207 @@ Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
601 601
602 //========================================================================= 602 //=========================================================================
603 603
604 'invokeMethodNamedOnHeader': function (aMethodName, aValue) { 604 'invokeMethodNamedOnHeader': function (aMethodName, aValue) {
605 return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", { 605 return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", {
606 'recordIndex': [ 606 'recordIndex': [
607 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), 607 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
608 MochiKit.Base.methodcaller(aMethodName, aValue) 608 MochiKit.Base.methodcaller(aMethodName, aValue)
609 ], 609 ],
610 'preferences': [ 610 'preferences': [
611 MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'), 611 MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'),
612 MochiKit.Base.methodcaller(aMethodName, aValue) 612 MochiKit.Base.methodcaller(aMethodName, aValue)
613 ], 613 ],
614 'oneTimePasswords': [ 614 'oneTimePasswords': [
615 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'), 615 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
616 MochiKit.Base.methodcaller(aMethodName, aValue) 616 MochiKit.Base.methodcaller(aMethodName, aValue)
617 ]//, 617 ]//,
618 // 'statistics': [ 618 // 'statistics': [
619 // MochiKit.Base.method(this, 'getStatistics'), 619 // MochiKit.Base.method(this, 'getStatistics'),
620 // MochiKit.Base.methodcaller(aMethodName, aValue) 620 // MochiKit.Base.methodcaller(aMethodName, aValue)
621 // ] 621 // ]
622 }, {trace:false})(); 622 }, {trace:false})();
623 }, 623 },
624 624
625 //------------------------------------------------------------------------- 625 //-------------------------------------------------------------------------
626 626
627 'invokeMethodNamedOnRecords': function (aMethodName, aValue) { 627 'invokeMethodNamedOnRecords': function (aMethodName, aValue) {
628 return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [ 628 return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [
629 MochiKit.Base.method(this, 'getRecords'), 629 MochiKit.Base.method(this, 'getRecords'),
630 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)), 630 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)),
631 Clipperz.Async.collectAll 631 Clipperz.Async.collectAll
632 ], {trace:false}); 632 ], {trace:false});
633 }, 633 },
634 634
635 //========================================================================= 635 //=========================================================================
636 636
637 'hasPendingChanges': function () { 637 'hasPendingChanges': function () {
638 vardeferredResult; 638 vardeferredResult;
639 639
640 deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false}); 640 deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false});
641 deferredResult.collectResults({ 641 deferredResult.collectResults({
642 'header': [ 642 'header': [
643 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'), 643 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'),
644 MochiKit.Base.values 644 MochiKit.Base.values
645 ], 645 ],
646 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges') 646 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges')
647 }); 647 });
648 deferredResult.addCallback(Clipperz.Async.or); 648 deferredResult.addCallback(Clipperz.Async.or);
649 deferredResult.callback(); 649 deferredResult.callback();
650 // recordsIndex = legacyHeader; 650 // recordsIndex = legacyHeader;
651 // preferences = legacyHeader; 651 // preferences = legacyHeader;
652 // oneTimePasswords= legacyHeader; 652 // oneTimePasswords= legacyHeader;
653 653
654 return deferredResult; 654 return deferredResult;
655 }, 655 },
656 656
657 //========================================================================= 657 //=========================================================================
658 658
659 'commitTransientState': function () { 659 'commitTransientState': function () {
660 return Clipperz.Async.callbacks("User.commitTransientState", [ 660 return Clipperz.Async.callbacks("User.commitTransientState", [
661 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'), 661 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'),
662 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'), 662 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'),
663 663
664 MochiKit.Base.method(this, 'transientState'), 664 MochiKit.Base.method(this, 'transientState'),
665 MochiKit.Base.itemgetter('lock'), 665 // MochiKit.Base.itemgetter('lock'),
666 MochiKit.Base.method(this, 'setServerLockValue'), 666 // MochiKit.Base.method(this, 'setServerLockValue'),
667 MochiKit.Base.method(this, 'resetTransientState', true) 667 MochiKit.Base.method(this, 'resetTransientState', true)
668 ], {trace:false}); 668 ], {trace:false});
669 }, 669 },
670 670
671 //------------------------------------------------------------------------- 671 //-------------------------------------------------------------------------
672 672
673 'revertChanges': function () { 673 'revertChanges': function () {
674 return Clipperz.Async.callbacks("User.revertChanges", [ 674 return Clipperz.Async.callbacks("User.revertChanges", [
675 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'), 675 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'),
676 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'), 676 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'),
677 MochiKit.Base.method(this, 'resetTransientState', false) 677 MochiKit.Base.method(this, 'resetTransientState', false)
678 ], {trace:false}); 678 ], {trace:false});
679 }, 679 },
680 680
681 //========================================================================= 681 //=========================================================================
682 682
683 'deleteAllCleanTextData': function () { 683 'deleteAllCleanTextData': function () {
684 return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [ 684 return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [
685 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'), 685 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'),
686 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'), 686 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'),
687 687
688 MochiKit.Base.method(this.data(), 'removeAllData'), 688 MochiKit.Base.method(this.data(), 'removeAllData'),
689 MochiKit.Base.method(this, 'resetTransientState', false) 689 MochiKit.Base.method(this, 'resetTransientState', false)
690 ], {trace:false}); 690 ], {trace:false});
691 }, 691 },
692 692
693 //------------------------------------------------------------------------- 693 //-------------------------------------------------------------------------
694 694
695 'hasAnyCleanTextData': function () { 695 'hasAnyCleanTextData': function () {
696 vardeferredResult; 696 vardeferredResult;
697 697
698 deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false}); 698 deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false});
699 deferredResult.collectResults({ 699 deferredResult.collectResults({
700 'header':[ 700 'header':[
701 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'), 701 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'),
702 MochiKit.Base.values 702 MochiKit.Base.values
703 ], 703 ],
704 'records':MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'), 704 'records':MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'),
705 'data': MochiKit.Base.bind(function () { 705 'data': MochiKit.Base.bind(function () {
706 return MochiKit.Async.succeed(! this.data().isEmpty()); 706 return MochiKit.Async.succeed(! this.data().isEmpty());
707 }, this), 707 }, this),
708 'transientState':MochiKit.Base.bind(function () { 708 'transientState':MochiKit.Base.bind(function () {
709 return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0); 709 return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0);
710 }, this) 710 }, this)
711 }); 711 });
712 deferredResult.addCallback(Clipperz.Async.or); 712 deferredResult.addCallback(Clipperz.Async.or);
713 deferredResult.callback(); 713 deferredResult.callback();
714 714
715 return deferredResult; 715 return deferredResult;
716 }, 716 },
717 717
718 //========================================================================= 718 //=========================================================================
719 719
720 'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) { 720 'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) {
721 var deferredResult; 721 var deferredResult;
722 varresult; 722 varresult;
723 723
724 result = {}; 724 result = {};
725 deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false}); 725 deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false});
726 deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/); 726 deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/);
727 deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) { 727 deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) {
728 var header; 728 var header;
729 729
730 header = {}; 730 header = {};
731 header['records'] = someHeaderPackedData['recordIndex']['records']; 731 header['records'] = someHeaderPackedData['recordIndex']['records'];
732 header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins']; 732 header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins'];
733 header['preferences'] = {'data': someHeaderPackedData['preferences']['data']}; // this._serverData['header']['preferences']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['preferences']; //??????????? 733 header['preferences'] = {'data': someHeaderPackedData['preferences']['data']}; // this._serverData['header']['preferences']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['preferences']; //???????????
734 header['oneTimePasswords'] = {'data': someHeaderPackedData['oneTimePasswords']['data']}; // this._serverData['header']['oneTimePasswords']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['oneTimePasswords']; //??????????? 734 header['oneTimePasswords'] = {'data': someHeaderPackedData['oneTimePasswords']['data']}; // this._serverData['header']['oneTimePasswords']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['oneTimePasswords']; //???????????
735 header['version'] = '0.1'; 735 header['version'] = '0.1';
736 736
737 aResult['header'] = Clipperz.Base.serializeJSON(header); 737 aResult['header'] = Clipperz.Base.serializeJSON(header);
738 aResult['statistics'] = this._serverData['statistics']; //"someHeaderPackedData['statistics']['data']"; 738 aResult['statistics'] = this._serverData['statistics']; //"someHeaderPackedData['statistics']['data']";
739 739
740 return aResult; 740 return aResult;
741 }, this), result); 741 }, this), result);
742 deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion); 742 deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion);
743 deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue()); 743 // deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue());
744 deferredResult.callback(); 744 deferredResult.callback();
745 745
746 return deferredResult; 746 return deferredResult;
747 }, 747 },
748 748
749 //========================================================================= 749 //=========================================================================
750 750
751 'saveChanges': function () { 751 'saveChanges': function () {
752 vardeferredResult; 752 vardeferredResult;
753 var messageParameters; 753 var messageParameters;
754 754
755 messageParameters = {}; 755 messageParameters = {};
756 756
757 deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false}); 757 deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false});
758 758
759 deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex'); 759 deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex');
760 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); 760 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
761 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records'); 761 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records');
762 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 762 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
763 763
764 deferredResult.addMethod(this, 'getPassphrase'); 764 deferredResult.addMethod(this, 'getPassphrase');
765 deferredResult.addMethod(this, 'prepareRemoteDataWithKey'); 765 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
766 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user'); 766 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user');
767 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 767 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
768 768
769 deferredResult.addCallback(MochiKit.Async.succeed, messageParameters); 769 deferredResult.addCallback(MochiKit.Async.succeed, messageParameters);
770 deferredResult.addMethod(this.connection(), 'message', 'saveChanges'); 770 deferredResult.addMethod(this.connection(), 'message', 'saveChanges');
771 deferredResult.addCallback(MochiKit.Base.update, this.transientState()) 771 deferredResult.addCallback(MochiKit.Base.update, this.transientState())
772 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 772 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
773 773
774 deferredResult.addMethod(this, 'commitTransientState'); 774 deferredResult.addMethod(this, 'commitTransientState');
775 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 775 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
776 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved'); 776 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved');
777 777
778 deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges')); 778 deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges'));
779 deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData'); 779 deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData');
780 780
781 deferredResult.callback(); 781 deferredResult.callback();
782 782
783 return deferredResult; 783 return deferredResult;
784 }, 784 },
785 785
786 //========================================================================= 786 //=========================================================================
787 __syntaxFix__: "syntax fix" 787 __syntaxFix__: "syntax fix"
788}); 788});
789 789
790//----------------------------------------------------------------------------- 790//-----------------------------------------------------------------------------
791 791
792Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) { 792Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) {
793 vardeferredResult; 793 vardeferredResult;
794 var user; 794 var user;
795 795
796 user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction}); 796 user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction});
797 797
798 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false}); 798 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false});
799 deferredResult.addMethod(user, 'registerAsNewAccount'); 799 deferredResult.addMethod(user, 'registerAsNewAccount');
800 deferredResult.addMethod(user, 'login'); 800 deferredResult.addMethod(user, 'login');
801 deferredResult.addCallback(MochiKit.Async.succeed, user); 801 deferredResult.addCallback(MochiKit.Async.succeed, user);
802 deferredResult.callback(); 802 deferredResult.callback();
803 803
804 return deferredResult; 804 return deferredResult;
805} 805}
806 806
807//----------------------------------------------------------------------------- 807//-----------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/PM/PIN.js b/frontend/gamma/js/Clipperz/PM/PIN.js
new file mode 100644
index 0000000..bc932b2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/PIN.js
@@ -0,0 +1,134 @@
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
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.PIN) == 'undefined') { Clipperz.PM.PIN = {}; }
29
30MochiKit.Base.update(Clipperz.PM.PIN, {
31
32 //-------------------------------------------------------------------------
33
34 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]";
36 },
37
38 //-------------------------------------------------------------------------
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 'CREDENTIALS': 'CLIPPERZ.CREDENTIALS',
45 'FAILURE_COUNT': 'CLIPPERZ.FAILED_LOGIN_COUNT',
46 'ALLOWED_RETRY': 3,
47
48 //-------------------------------------------------------------------------
49
50 'isSet': function () {
51 return (this.storedCredentials() != null);
52 },
53
54 'storedCredentials': function () {
55 return localStorage[this.CREDENTIALS];
56 },
57
58 //-------------------------------------------------------------------------
59
60 'recordFailedAttempt': function () {
61 varfailureCount;
62 varresult;
63
64 failureCount = localStorage[this.FAILURE_COUNT];
65
66 if (failureCount == null) {
67 failureCount = 0
68 }
69
70 failureCount ++;
71
72 if (failureCount < this.ALLOWED_RETRY) {
73 localStorage[this.FAILURE_COUNT] = failureCount;
74 result = failureCount;
75 } else {
76 this.removeLocalCredentials();
77 result = -1;
78 }
79
80 return result;
81 },
82
83 'resetFailedAttemptCount': function () {
84 localStorage.removeItem(this.FAILURE_COUNT);
85 },
86
87 'failureCount': function () {
88 return localStorage[this.FAILURE_COUNT];
89 },
90
91 //-------------------------------------------------------------------------
92
93 'deriveKeyFromPin': function (aPIN) {
94 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aPIN));
95 },
96
97 'credentialsWithPIN': function (aPIN) {
98 varbyteArrayValue;
99 var decryptedValue;
100 varresult;
101
102 byteArrayValue = (new Clipperz.ByteArray()).appendBase64String(localStorage[this.CREDENTIALS]);
103 decryptedValue = Clipperz.Crypto.AES.decrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).asString();
104 try {
105 result = Clipperz.Base.evalJSON(decryptedValue);
106 } catch (error) {
107 result = {'username':'fakeusername', 'passphrase':'fakepassphrase'};
108 }
109
110 return result;
111 },
112
113 'setCredentialsWithPIN': function (aPIN, someCredentials) {
114 varencodedValue;
115 varbyteArrayValue;
116 var encryptedValue;
117
118 encodedValue = Clipperz.Base.serializeJSON(someCredentials);
119 byteArrayValue = new Clipperz.ByteArray(encodedValue);
120 encryptedValue = Clipperz.Crypto.AES.encrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).toBase64String();
121
122 localStorage[this.CREDENTIALS] = encryptedValue;
123 },
124
125 'removeLocalCredentials': function () {
126 localStorage.removeItem(this.CREDENTIALS);
127 localStorage.removeItem(this.FAILURE_COUNT);
128 },
129
130 //-------------------------------------------------------------------------
131 __syntaxFix__: "syntax fix"
132
133});
134
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js
new file mode 100644
index 0000000..803c590
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js
@@ -0,0 +1,65 @@
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
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28
29//=============================================================================
30
31Clipperz.PM.Proxy.OfflineCache = function(args) {
32 args = args || {};
33
34 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
35
36 //this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
37
38 return this;
39}
40
41Clipperz.Base.extend(Clipperz.PM.Proxy.OfflineCache, Clipperz.PM.Proxy, {
42
43 'toString': function () {
44 return "Clipperz.PM.Proxy.OfflineCache";
45 },
46
47 //-------------------------------------------------------------------------
48
49 //'dataStore': function () {
50 // return this._dataStore;
51 //},
52
53 //-------------------------------------------------------------------------
54
55 'sendMessage': function(aFunctionName, someParameters) {
56 throw Clipperz.Base.exception.MethodNotImplementedYet;
57 // return this.dataStore().processMessage(aFunctionName, someParameters);
58 },
59
60 //-------------------------------------------------------------------------
61
62 __syntaxFix__: "syntax fix"
63
64});
65
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
index 2a03fdf..b9d7adf 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
@@ -345,128 +345,132 @@ Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.BaseComponent, /*Ext.Compo
345 MochiKit.DOM.removeElement(this.displayElement()); 345 MochiKit.DOM.removeElement(this.displayElement());
346 } else { 346 } else {
347 this.displayElement().innerHTML = ""; 347 this.displayElement().innerHTML = "";
348 } 348 }
349 } 349 }
350 350
351 if (this.isModal()) { 351 if (this.isModal()) {
352 //TODO: cleanup when the closed element was shown modally. 352 //TODO: cleanup when the closed element was shown modally.
353 } 353 }
354 }, 354 },
355 355
356 356
357 'remove': function() { 357 'remove': function() {
358 varslotName; 358 varslotName;
359 var componentId; 359 var componentId;
360 360
361 for (slotName in this.slotComponents()) { 361 for (slotName in this.slotComponents()) {
362 this.slotComponents()[slotName].remove(); 362 this.slotComponents()[slotName].remove();
363 delete this.slotComponents()[slotName]; 363 delete this.slotComponents()[slotName];
364 } 364 }
365 365
366 for (componentId in this.components()) { 366 for (componentId in this.components()) {
367 this.components()[componentId].remove(); 367 this.components()[componentId].remove();
368 delete this.components()[componentId]; 368 delete this.components()[componentId];
369 } 369 }
370 370
371 this.clear(); 371 this.clear();
372 MochiKit.Signal.disconnectAll(this); 372 MochiKit.Signal.disconnectAll(this);
373 }, 373 },
374 374
375 'append': function(aNode, aValue) { 375 'append': function(aNode, aValue) {
376 return Clipperz.DOM.Helper.append(aNode, aValue); 376 return Clipperz.DOM.Helper.append(aNode, aValue);
377 }, 377 },
378 378
379 'insertBefore': function (aNode, aValue) { 379 'insertBefore': function (aNode, aValue) {
380 return Clipperz.DOM.Helper.insertBefore(aNode, aValue); 380 return Clipperz.DOM.Helper.insertBefore(aNode, aValue);
381 }, 381 },
382 382
383 'insertAfter': function (aNode, aValue) { 383 'insertAfter': function (aNode, aValue) {
384 return Clipperz.DOM.Helper.insertAfter(aNode, aValue); 384 return Clipperz.DOM.Helper.insertAfter(aNode, aValue);
385 }, 385 },
386 386
387 //------------------------------------------------------------------------- 387 //-------------------------------------------------------------------------
388 388
389 'getId': function(aValue) { 389 'getId': function(aValue) {
390 varresult; 390 varresult;
391 391
392 if (typeof(aValue) != 'undefined') { 392 if (typeof(aValue) != 'undefined') {
393 result = this._ids[aValue]; 393 result = this._ids[aValue];
394 394
395 if (typeof(result) == 'undefined') { 395 if (typeof(result) == 'undefined') {
396 _Clipperz_PM_Components_base_id_ ++; 396 _Clipperz_PM_Components_base_id_ ++;
397 397
398 result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_; 398 result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_;
399 this._ids[aValue] = result; 399 this._ids[aValue] = result;
400 } 400 }
401 } else { 401 } else {
402 // result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this); 402 // result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this);
403 throw "call to BaseComponent.getId with an undefined value"; 403 throw "call to BaseComponent.getId with an undefined value";
404 } 404 }
405 405
406 return result; 406 return result;
407 }, 407 },
408 408
409 'getAnchor': function (aValue) {
410 return '#' + this.getId(aValue);
411 },
412
409 //------------------------------------------------------------------------- 413 //-------------------------------------------------------------------------
410 414
411 'getElement': function(aValue) { 415 'getElement': function(aValue) {
412 return Clipperz.DOM.get(this.getId(aValue)); 416 return Clipperz.DOM.get(this.getId(aValue));
413 }, 417 },
414 418
415 //------------------------------------------------------------------------- 419 //-------------------------------------------------------------------------
416 420
417 'hideElement': function(anElementName) { 421 'hideElement': function(anElementName) {
418 MochiKit.Style.hideElement(this.getElement(anElementName)); 422 MochiKit.Style.hideElement(this.getElement(anElementName));
419 }, 423 },
420 424
421 'showElement': function(anElementName) { 425 'showElement': function(anElementName) {
422 MochiKit.Style.showElement(this.getElement(anElementName)); 426 MochiKit.Style.showElement(this.getElement(anElementName));
423 }, 427 },
424 428
425 //------------------------------------------------------------------------- 429 //-------------------------------------------------------------------------
426 430
427 'activate': function () { 431 'activate': function () {
428 this._isActive = true; 432 this._isActive = true;
429 }, 433 },
430 434
431 'deactivate': function () { 435 'deactivate': function () {
432 this._isActive = false; 436 this._isActive = false;
433 }, 437 },
434 438
435 'isActive': function () { 439 'isActive': function () {
436 return this._isActive; 440 return this._isActive;
437 }, 441 },
438 442
439 //------------------------------------------------------------------------- 443 //-------------------------------------------------------------------------
440 444
441 'hideSlot': function(aSlotName) { 445 'hideSlot': function(aSlotName) {
442 if (this.componentForSlotNamed(aSlotName)) { 446 if (this.componentForSlotNamed(aSlotName)) {
443 this.componentForSlotNamed(aSlotName).deactivate(); 447 this.componentForSlotNamed(aSlotName).deactivate();
444 } 448 }
445 MochiKit.Style.hideElement(this.elementForSlotNamed(aSlotName)); 449 MochiKit.Style.hideElement(this.elementForSlotNamed(aSlotName));
446 }, 450 },
447 451
448 'showSlot': function(aSlotName) { 452 'showSlot': function(aSlotName) {
449 if (this.componentForSlotNamed(aSlotName)) { 453 if (this.componentForSlotNamed(aSlotName)) {
450 this.componentForSlotNamed(aSlotName).activate(); 454 this.componentForSlotNamed(aSlotName).activate();
451 } 455 }
452 MochiKit.Style.showElement(this.elementForSlotNamed(aSlotName)); 456 MochiKit.Style.showElement(this.elementForSlotNamed(aSlotName));
453 }, 457 },
454 458
455 //------------------------------------------------------------------------- 459 //-------------------------------------------------------------------------
456 460
457 'shouldShowTranslationHints': function () { 461 'shouldShowTranslationHints': function () {
458 return false; 462 return false;
459 }, 463 },
460 464
461 'shouldShowElementWhileRendering': function() { 465 'shouldShowElementWhileRendering': function() {
462 return true; 466 return true;
463 }, 467 },
464 468
465 //'shouldRemoveElementWhenClearningUp': function () { 469 //'shouldRemoveElementWhenClearningUp': function () {
466 // return true; 470 // return true;
467 //}, 471 //},
468 472
469 //------------------------------------------------------------------------- 473 //-------------------------------------------------------------------------
470 474
471 'isModal': function() { 475 'isModal': function() {
472 return this._isModal; 476 return this._isModal;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
index 716d851..1010c9d 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
@@ -1,105 +1,113 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 27
28Clipperz.PM.UI.Common.Components.Button = function(args) { 28Clipperz.PM.UI.Common.Components.Button = function(args) {
29 args = args || {}; 29 args = args || {};
30 30
31 Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments);
32 32
33 this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._isDefault = args.isDefault|| false; 35 this._isDefault = args.isDefault|| false;
36 36
37 this.render(); 37 this.render();
38 38
39 return this; 39 return this;
40} 40}
41 41
42//============================================================================= 42//=============================================================================
43 43
44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 45
46 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
47 47
48 'toString': function () { 48 'toString': function () {
49 return "Clipperz.PM.UI.Common.Components.Button component"; 49 return "Clipperz.PM.UI.Common.Components.Button component";
50 }, 50 },
51 51
52 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
53 53
54 'text': function () { 54 'text': function () {
55 return this._text; 55 return this._text;
56 }, 56 },
57 57
58 'isDefault': function () { 58 'isDefault': function () {
59 return this._isDefault; 59 return this._isDefault;
60 }, 60 },
61 61
62 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
63 63
64 'renderSelf': function () { 64 'renderSelf': function () {
65 this.append(this.element(), {tag:'div', id:this.getId('wrapper'), cls:'button_wrapper', children:[ 65/*
66 this.append(this.element(), {tag:'div', id:this.getId('button'), cls:'button_wrapper', children:[
66 {tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[ 67 {tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[
67 {tag:'div', id:this.getId('body'), cls:'button_body', children:[ 68 {tag:'div', id:this.getId('body'), cls:'button_body', children:[
68 {tag:'span', html:this.text()} 69 {tag:'span', html:this.text()}
69 ]}, 70 ]},
70 {tag:'div', id:this.getId('footer'), cls:'button_footer'} 71 {tag:'div', id:this.getId('footer'), cls:'button_footer'}
71 ]} 72 ]}
72 ]}); 73 ]});
74*/
75/*
76 this.append(this.element(), {tag:'div', id:this.getId('button'), cls:'button', children:[
77 {tag:'span', html:this.text()}
78 ]});
79*/
80 this.append(this.element(), {tag:'a', id:this.getId('button'), cls:'button', html:this.text()});
73 81
74 if (this.isDefault()) { 82 if (this.isDefault()) {
75 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'default'); 83 MochiKit.DOM.addElementClass(this.getId('button'), 'default');
76 } 84 }
77 85
78 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseenter',this, 'handleOnMouseEnter'); 86 // MochiKit.Signal.connect(this.getId('button'), 'onmouseenter',this, 'handleOnMouseEnter');
79 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseleave',this, 'handleOnMouseLeave'); 87 // MochiKit.Signal.connect(this.getId('button'), 'onmouseleave',this, 'handleOnMouseLeave');
80 MochiKit.Signal.connect(this.getId('wrapper'), 'onmousedown',this, 'handleOnMouseDown'); 88 // MochiKit.Signal.connect(this.getId('button'), 'onmousedown',this, 'handleOnMouseDown');
81 MochiKit.Signal.connect(this.getId('wrapper'), 'onclick', this, 'handleOnClick'); 89 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'handleOnClick');
82 }, 90 },
83 91
84 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
85 93/*
86 'handleOnMouseEnter': function (anEvent) { 94 'handleOnMouseEnter': function (anEvent) {
87 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'hover'); 95 MochiKit.DOM.addElementClass(this.getId('button'), 'hover');
88 }, 96 },
89 97
90 'handleOnMouseLeave': function (anEvent) { 98 'handleOnMouseLeave': function (anEvent) {
91 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'hover'); 99 MochiKit.DOM.removeElementClass(this.getId('button'), 'hover');
92 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'clicked'); 100 MochiKit.DOM.removeElementClass(this.getId('button'), 'clicked');
93 }, 101 },
94 102
95 'handleOnMouseDown': function (anEvent) { 103 'handleOnMouseDown': function (anEvent) {
96 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'clicked'); 104 MochiKit.DOM.addElementClass(this.getId('button'), 'clicked');
97 }, 105 },
98 106 */
99 'handleOnClick': function (anEvent) { 107 'handleOnClick': function (anEvent) {
100 MochiKit.Signal.signal(this, 'onclick', anEvent); 108 MochiKit.Signal.signal(this, 'onclick', anEvent);
101 }, 109 },
102 110
103 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
104 __syntaxFix__: "syntax fix" 112 __syntaxFix__: "syntax fix"
105}); 113});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
index 1992154..1d816a9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
@@ -37,173 +37,191 @@ Clipperz.PM.UI.Common.Components.SimpleMessagePanel = function(args) {
37 37
38 this._buttonComponents = []; 38 this._buttonComponents = [];
39 this._deferred = null; 39 this._deferred = null;
40 40
41 this.renderModalMask(); 41 this.renderModalMask();
42 42
43 return this; 43 return this;
44} 44}
45 45
46//============================================================================= 46//=============================================================================
47 47
48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clipperz.PM.UI.Common.Components.BaseComponent, { 48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, 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.SimpleMessagePanel component"; 53 return "Clipperz.PM.UI.Common.Components.SimpleMessagePanel component";
54 }, 54 },
55 55
56 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
57 57
58 'deferred': function() { 58 'deferred': function() {
59 if (this._deferred == null) { 59 if (this._deferred == null) {
60 this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false}); 60 this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false});
61 } 61 }
62 62
63 return this._deferred; 63 return this._deferred;
64 }, 64 },
65 65
66 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
67 67
68 'title': function () { 68 'title': function () {
69 return this._title; 69 return this._title;
70 }, 70 },
71 71
72 'setTitle': function (aValue) { 72 'setTitle': function (aValue) {
73 this._title = aValue; 73 this._title = aValue;
74 74
75 if (this.getElement('title') != null) { 75 if (this.getElement('title') != null) {
76 this.getElement('title').innerHTML = aValue; 76 this.getElement('title').innerHTML = aValue;
77 } 77 }
78 }, 78 },
79 79
80 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
81 81
82 'text': function () { 82 'text': function () {
83 return this._text; 83 return this._text;
84 }, 84 },
85 85
86 'setText': function (aValue) { 86 'setText': function (aValue) {
87 this._text = aValue; 87 this._text = aValue;
88 88
89 if (this.getElement('text') != null) { 89 if (this.getElement('text') != null) {
90 this.getElement('text').innerHTML = aValue; 90 this.getElement('text').innerHTML = aValue;
91 } 91 }
92 }, 92 },
93 93
94 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
95 95
96 'type': function () { 96 'type': function () {
97 return this._type; 97 return this._type;
98 }, 98 },
99 99
100 'setType': function (aValue) { 100 'setType': function (aValue) {
101 if (this.getElement('icon') != null) { 101 // if (this.getElement('icon') != null) {
102 MochiKit.DOM.removeElementClass(this.getId('icon'), this._type); 102 // MochiKit.DOM.removeElementClass(this.getId('icon'), this._type);
103 MochiKit.DOM.addElementClass(this.getId('icon'), aValue); 103 // MochiKit.DOM.addElementClass(this.getId('icon'), aValue);
104 } 104 // }
105 105
106 this._type = aValue; 106 this._type = aValue;
107 }, 107 },
108 108
109 'icon': function () {
110 var type = this.type();
111 var result;
112
113 if (type == 'ALERT') {
114 result = '!';
115 } else if (type == 'INFO') {
116 result = 'i';
117 } else if (type == 'ERROR') {
118 result = '!';
119 }
120
121 return result;
122 },
123
109 //------------------------------------------------------------------------- 124 //-------------------------------------------------------------------------
110 125
111 'buttons': function () { 126 'buttons': function () {
112 return this._buttons; 127 return this._buttons;
113 }, 128 },
114 129
115 'setButtons': function (someValues) { 130 'setButtons': function (someValues) {
116 MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear')); 131 MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear'));
117 132
118 this._buttons = someValues; 133 this._buttons = someValues;
119 134
120 if (this.getElement('buttonArea') != null) { 135 if (this.getElement('buttonArea') != null) {
121 this.renderButtons(); 136 this.renderButtons();
122 } 137 }
123 }, 138 },
124 139
125 //......................................................................... 140 //.........................................................................
126 141
127 'buttonComponents': function () { 142 'buttonComponents': function () {
128 return this._buttonComponents; 143 return this._buttonComponents;
129 }, 144 },
130 145
131 //------------------------------------------------------------------------- 146 //-------------------------------------------------------------------------
132 147
133 'renderSelf': function() { 148 'renderSelf': function() {
134 this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [ 149 this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [
135 {tag:'div', cls:'header', children:[]}, 150 // {tag:'div', cls:'header', children:[]},
136 {tag:'div', cls:'body', children:[ 151 {tag:'div', cls:'body', children:[
137 {tag:'div', id:this.getId('icon'),cls:'img ' + this.type(), children:[{tag:'div'}]}, 152 // {tag:'div', id:this.getId('icon'),cls:'img ' + this.type(), children:[{tag:'div'}]},
153 {tag:'div', /*id:this.getId('icon'),*/cls:'img ' + this.type(), children:[{tag:'canvas', id:this.getId('icon')}]},
138 {tag:'h3', id:this.getId('title'),html:this.title()}, 154 {tag:'h3', id:this.getId('title'),html:this.title()},
139 {tag:'p', id:this.getId('text'),html:this.text()}, 155 {tag:'p', id:this.getId('text'),html:this.text()},
140 {tag:'div', id:this.getId('container')}, 156 {tag:'div', id:this.getId('container')},
141 {tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]} 157 {tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]}
142 ]}, 158 ]}
143 {tag:'div', cls:'footer', children:[]} 159 // {tag:'div', cls:'footer', children:[]}
144 ]}); 160 ]});
145 161
162 Clipperz.PM.UI.Canvas.marks[this.icon()](this.getElement('icon'), "#ffffff");
163
146 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler'); 164 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler');
147 165
148 this.renderButtons(); 166 this.renderButtons();
149 }, 167 },
150 168
151 //------------------------------------------------------------------------- 169 //-------------------------------------------------------------------------
152 170
153 'renderButtons': function () { 171 'renderButtons': function () {
154 this.getElement('buttonArea').innerHTML = ''; 172 this.getElement('buttonArea').innerHTML = '';
155 173
156 MochiKit.Base.map(MochiKit.Base.bind(function (aButton) { 174 MochiKit.Base.map(MochiKit.Base.bind(function (aButton) {
157 var buttonElement; 175 var buttonElement;
158 var buttonComponent; 176 var buttonComponent;
159 177
160 // element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[ 178 // element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[
161 // {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']} 179 // {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']}
162 // ]}); 180 // ]});
163 181
164 buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'}); 182 buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'});
165 buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']}); 183 buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']});
166 this.buttonComponents().push(buttonComponent); 184 this.buttonComponents().push(buttonComponent);
167 185
168 MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton)); 186 MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton));
169 }, this), MochiKit.Iter.reversed(this.buttons())); 187 }, this), MochiKit.Iter.reversed(this.buttons()));
170 }, 188 },
171 189
172 //------------------------------------------------------------------------- 190 //-------------------------------------------------------------------------
173 191
174 'displayElement': function() { 192 'displayElement': function() {
175 return this.getElement('panel'); 193 return this.getElement('panel');
176 }, 194 },
177 195
178 //------------------------------------------------------------------------- 196 //-------------------------------------------------------------------------
179 197
180 'closeOk': function () { 198 'closeOk': function () {
181 this.deferred().callback(); 199 this.deferred().callback();
182 this._deferred = null; 200 this._deferred = null;
183 }, 201 },
184 202
185 'closeCancel': function () { 203 'closeCancel': function () {
186 this.deferred().cancel(); 204 this.deferred().cancel();
187 this._deferred = null; 205 this._deferred = null;
188 }, 206 },
189 207
190 'closeError': function () { 208 'closeError': function () {
191 this.deferred().errback(); 209 this.deferred().errback();
192 this._deferred = null; 210 this._deferred = null;
193 }, 211 },
194 212
195 //------------------------------------------------------------------------- 213 //-------------------------------------------------------------------------
196 214
197 'buttonEventHandler': function(aButton, anEvent) { 215 'buttonEventHandler': function(aButton, anEvent) {
198 anEvent.preventDefault(); 216 anEvent.preventDefault();
199 217
200 // MochiKit.Signal.signal(this, 'cancelEvent'); 218 // MochiKit.Signal.signal(this, 'cancelEvent');
201 switch (aButton['result']) { 219 switch (aButton['result']) {
202 case 'OK': 220 case 'OK':
203//console.log("==> OK"); 221//console.log("==> OK");
204 this.closeOk(); 222 this.closeOk();
205 break; 223 break;
206 case 'CANCEL': 224 case 'CANCEL':
207//console.log("==> CANCEL"); 225//console.log("==> CANCEL");
208 this.closeCancel(); 226 this.closeCancel();
209 break; 227 break;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js
new file mode 100644
index 0000000..32dfa63
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js
@@ -0,0 +1,299 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components');
27
28Clipperz.PM.UI.Mobile.Components.CardDetail = function(args) {
29 args = args || {};
30
31 Clipperz.PM.UI.Mobile.Components.CardDetail.superclass.constructor.apply(this, arguments);
32
33 //this._cardReference = null;
34
35 return this;
36}
37
38//=============================================================================
39
40Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.CardDetail, Clipperz.PM.UI.Common.Components.BaseComponent, {
41
42 //-------------------------------------------------------------------------
43
44 'toString': function () {
45 return "Clipperz.PM.UI.Mobile.Components.CardDetail component";
46 },
47
48 //-------------------------------------------------------------------------
49/*
50 'cardReference': function () {
51 return this._cardReference;
52 },
53
54 'setCardReference': function (aValue) {
55 this._cardReference = aValue;
56 },
57*/
58 //-------------------------------------------------------------------------
59
60 'renderSelf': function () {
61console.log("CardDetail.renderSelf");
62 this.append(this.element(), {tag:'div', cls:'cardDetail', children:[
63 {tag:'div', cls:'toolbar', children:[
64 {tag:'a', href:'#', cls:'back', html:"List"},
65 {tag:'h1', id:this.getId('cardTitle'), html:"…"}
66 ]},
67 {tag:'div', cls:'scroll', id:this.getId('cardDetails'), children:[
68 ]}
69 ]});
70 },
71/*
72 'renderSelf': function() {
73 this.append(this.element(), [
74 {tag:'div', cls:'cardDetail', id:this.getId('cardDetail'), children:[
75 {tag:'div', id:this.getId('progressBar')} //,
76 ]}
77 ]);
78
79 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
80 MochiKit.Signal.signal(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', 0);
81 },
82*/
83
84 'setTitle': function (aValue) {
85 this.getElement('cardTitle').innerHTML = aValue;
86 },
87
88 'fieldListElement': function () {
89 varresult;
90
91 result = this.getElement('fieldList');
92 if (result == null) {
93 result = this.append(this.getElement('cardDetails'), {tag:'ul', cls:'rounded', id:this.getId('fieldList')});
94 }
95
96 return result;
97 },
98
99 'renderFieldValues': function (someFieldValues) {
100 varfieldClass;
101
102 if ((someFieldValues['actionType'] != 'NONE') || (someFieldValues['label'] != '') && (someFieldValues['value'] != '')) {
103 if (someFieldValues['isHidden'] == true) {
104 fieldClass = 'password';
105 } else {
106 fieldClass = '';
107 }
108
109 this.append(this.fieldListElement(), {tag:'li', cls:'cardField', children:[
110 {tag:'a', href:'#', cls:fieldClass, html:someFieldValues['value'], children:[
111 {tag:'small', cls:'label', html:someFieldValues['label']}
112 ]}
113 ]})
114 }
115 },
116
117 'addField': function (aField) {
118 var deferredResult;
119 varfieldValues;
120
121 fieldValues = {};
122 deferredResult = new Clipperz.Async.Deferred("CardDetail.addField", {trace:false});
123 deferredResult.addMethod(aField, 'label');
124 deferredResult.addCallback(function (aValue) { fieldValues['label'] = aValue; });
125 deferredResult.addMethod(aField, 'value');
126 deferredResult.addCallback(function (aValue) { fieldValues['value'] = aValue; });
127 deferredResult.addMethod(aField, 'actionType');
128 deferredResult.addCallback(function (aValue) { fieldValues['actionType'] = aValue; });
129 deferredResult.addMethod(aField, 'isHidden');
130 deferredResult.addCallback(function (aValue) { fieldValues['isHidden'] = aValue; });
131 deferredResult.addMethod(this, 'renderFieldValues', fieldValues);
132 deferredResult.callback();
133
134 return deferredResult;
135 },
136
137 //-------------------------------------------------------------------------
138
139 'directLoginElement': function () {
140 varresult;
141
142 result = this.getElement('directLoginList');
143 if (result == null) {
144 this.append(this.getElement('cardDetails'), {tag:'h2', html:"Direct login"});
145 result = this.append(this.getElement('cardDetails'), {tag:'ul', cls:'rounded', id:this.getId('directLoginList')});
146 }
147
148 return result;
149 },
150
151 'addDirectLogin': function (aDirectLogin) {
152 this.append(this.directLoginElement(), {tag:'li', cls:'directLogin forward', children:[
153 {tag:'a', href:'#', html:"direct login", children:[
154 {tag:'small', cls:'favicon', children:[{tag:'img', cls:'favicon', src:'http://www.clipperz.com/favicon.ico'}]}
155 ]}
156 ]})
157
158console.log("ADD DIRECT LOGIN", aDirectLogin);
159 },
160
161 //=========================================================================
162
163 'showCard': function (aCard) {
164 var deferredResult;
165
166 // this.render();
167
168console.log("CardDetail.showCard", aCard);
169 deferredResult = new Clipperz.Async.Deferred("CardDetail.showCard", {trace:false});
170 deferredResult.addMethod(aCard, 'label');
171 deferredResult.addMethod(this, 'setTitle');
172
173 deferredResult.addMethod(aCard, 'fields');
174 deferredResult.addCallback(MochiKit.Base.values);
175 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'addField'));
176
177 deferredResult.addMethod(aCard, 'directLogins');
178 deferredResult.addCallback(MochiKit.Base.values);
179 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'addDirectLogin'));
180
181
182 deferredResult.callback();
183
184 return deferredResult;
185 // return Clipperz.Async.callbacks("CardDialogController.updateComponentState", [
186 // MochiKit.Base.method(this.record(), 'hasPendingChanges'),
187 // MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving'),
188 //
189 // MochiKit.Base.method(this.record(), 'label'),
190 // MochiKit.Base.method(this.cardDialogComponent(), 'setTitle'),
191 // MochiKit.Base.method(this.record(), 'notes'),
192 // MochiKit.Base.method(this.cardDialogComponent(), 'setNotes'),
193 //
194 // MochiKit.Base.method(this.record(), 'fields'),
195 // MochiKit.Base.values,
196 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithField')),
197//
198 // MochiKit.Base.method(this.record(), 'directLogins'),
199 // MochiKit.Base.values,
200 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin')),
201//
202 // MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
203 // MochiKit.Base.noop
204 // ], {trace:false});
205
206 },
207
208 //=========================================================================
209
210 'showCardDetails': function (someData) {
211 this.element().innerHTML = '';
212 this.append(this.element(), [
213 {tag:'fieldset', id:this.getId('fields'), children:MochiKit.Base.map(function (aFieldData) {
214 return {tag:'div', cls:'row', children:[
215 {tag:'label', html:aFieldData['label']},
216 // {tag:'span', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), html:aFieldData['value']}
217 {tag:'div', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), children:[
218 {tag:'div', children:[{tag:'p', html:aFieldData['value']}]}
219 ]}
220 // {tag:'input', type:'text', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), value:aFieldData['value'], disabled:true}
221
222 ]}
223 }, someData['fields'])}
224 ]);
225
226 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.element(), ['span.password']), MochiKit.Base.bind(function (aPasswordElement) {
227 MochiKit.Signal.connect(aPasswordElement, 'onclick', function (anEvent) { alert(MochiKit.DOM.scrapeText(anEvent.src())); })
228 }, this));
229
230 if (someData['directLogins'].length > 0) {
231 this.append(this.element(), [
232 {tag:'h2', html:"Direct logins"},
233 {tag:'fieldset', id:this.getId('directLogins'), children:MochiKit.Base.map(function (aDirectLoginData) {
234 return {tag:'div', cls:'row', id:('directLogin_' + aDirectLoginData['_reference']), children:[
235 {tag:'img', cls:'favicon', src:aDirectLoginData['favicon']},
236 // {tag:'input', cls:'directLogin', disabled:'disabled', type:'text', name:aDirectLoginData['label'], value:aDirectLoginData['label']}
237 {tag:'span', cls:'directLogin', html:aDirectLoginData['label']}
238 ]}
239 }, someData['directLogins'])}
240 ]);
241
242 MochiKit.Base.map(MochiKit.Base.bind(function (aRowNode) {
243 MochiKit.Signal.connect(aRowNode, 'onclick', this, 'directLoginClickHandler');
244 }, this),
245 MochiKit.Selector.findChildElements(this.getElement('directLogins'), ['div.row'])
246 )
247 };
248
249 if (someData['notes'] != '') {
250 this.append(this.element(), [
251 {tag:'h2', html:"Notes"},
252 {tag:'fieldset', id:this.getId('fieldset'), children:[
253 {tag:'div', cls:'row notes', children:[
254 {tag:'span', html:someData['notes']}
255 ]}
256 ]}
257 ]);
258 };
259
260 return true;
261 },
262
263 //-------------------------------------------------------------------------
264/*
265 'toggleClickHandler': function (anEvent) {
266 varnextState;
267 varfieldValue;
268
269//console.log("TOGGLE");
270 anEvent.preventDefault;
271 fieldValue = MochiKit.Selector.findChildElements(anEvent.src().parentNode.parentNode, ['span.password'])[0];
272
273 nextState = (MochiKit.DOM.getNodeAttribute(anEvent.src(), 'toggled') != 'true');
274 if (nextState) {
275 MochiKit.DOM.removeElementClass(fieldValue, 'clear');
276 } else {
277 MochiKit.DOM.addElementClass(fieldValue, 'clear');
278 }
279
280 MochiKit.DOM.setNodeAttribute(anEvent.src(), 'toggled', nextState);
281 },
282* /
283 //=========================================================================
284/*
285 'directLoginClickHandler': function (anEvent) {
286 anEvent.preventDefault();
287
288 if (/(directLogin_)/.test(anEvent.src().id)) {
289 var directLoginReference;
290
291 directLoginReference = anEvent.src().id.match(/(directLogin_)(.*)/)[2];
292 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', {cardReference:this.cardReference(), directLoginReference:directLoginReference});
293 }
294 },
295*/
296 //=========================================================================
297
298 __syntaxFix__: "syntax fix"
299});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js
index c3f2701..a4aa212 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js
@@ -1,201 +1,254 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components');
27 27
28Clipperz.PM.UI.iPhone.Components.CardList = function(args) { 28Clipperz.PM.UI.Mobile.Components.CardList = function(args) {
29 args = args || {}; 29 args = args || {};
30 30
31 Clipperz.PM.UI.iPhone.Components.CardList.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Mobile.Components.CardList.superclass.constructor.apply(this, arguments);
32 32
33 this._cardDetail = null; 33 this._cardDetail = null;
34 34
35 return this; 35 return this;
36} 36}
37 37
38//============================================================================= 38//=============================================================================
39 39
40Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardList, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.CardList, Clipperz.PM.UI.Common.Components.BaseComponent, {
41 41
42 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
43 43
44 'toString': function () { 44 'toString': function () {
45 return "Clipperz.PM.UI.iPhone.Components.CardList component"; 45 return "Clipperz.PM.UI.Mobile.Components.CardList component";
46 }, 46 },
47 47
48 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
49 49
50 'renderSelf': function(/*aContainer, aPosition*/) { 50 'renderSelf': function () {
51 this.append(this.element(), [ 51 this.append(this.element(), {tag:'div', cls:'cardList', children:[
52 {tag:'div', cls:'toolbar', id:'toolbar', children:[ 52 {tag:'div', cls:'toolbar', children:[
53 {tag:'h1', id:'pageTitle', html:"cards"}, 53 {tag:'h1', html:"clipperz"},
54 {tag:'a', id:'backButton', cls:'button', href:'#', html:"cards"} 54 // {tag:'input', name:'search', type:'search', autocomplete:'off', placeholder:"search", id:this.getId('search')},
55 {tag:'a', href:'#', id:'settings', cls:'button', html:"*"}
55 ]}, 56 ]},
56 {tag:'div', cls:'cardList', id:this.getId('cardList'), children:[ 57 {tag:'div', cls:'scroll', id:this.getId('listBox'), children:[
57 {tag:'form', title:'search', cls:'panel cardListSearchForm', id:this.getId('cardListSearchForm'), children:[ 58 {tag:'ul', cls:'rounded', id:this.getId('list'), children:[
58 {tag:'input', type:'search', name:'search', value:"", placeholder:"search", id:this.getId('searchField')} 59 {tag:'li', html:'loading'}
59 ]}, 60 ]}
60 {tag:'ul', cls:'panel cardListPanel', id:this.getId('cardListPanel'), children:[]} 61 ]}
61 ]}, 62 ]});
62 {tag:'div', cls:'panel cardDetailPanel', id:this.getId('cardDetail')} 63
63 ]); 64 MochiKit.Signal.connect(this.getElement('list'), 'onclick', this, 'cardSelectionHandler');
64 65 MochiKit.Signal.connect(this.getElement('list'), 'ontouchstart',this, 'cardSelectionHandler');
65 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onsubmit', this,'searchHandler'); 66 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onsubmit', this,'searchHandler');
66 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeydown', this,'searchHandler'); 67 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeydown', this,'searchHandler');
67 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeyup', this,'searchHandler'); 68 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeyup', this,'searchHandler');
68 69
69 MochiKit.Signal.connect(this.getElement('cardListPanel'), 'onclick', this,'cardListClickHandler'); 70 // MochiKit.Signal.connect(this.getElement('cardListPanel'), 'onclick', this,'cardListClickHandler');
70 MochiKit.Signal.connect('backButton', 'onclick', this,'backButtonClickHandler'); 71 // MochiKit.Signal.connect('backButton', 'onclick', this,'backButtonClickHandler');
71 72
72 MochiKit.Style.hideElement('backButton'); 73 // MochiKit.Style.hideElement('backButton');
73 MochiKit.Style.hideElement(this.getElement('cardDetail')); 74 // MochiKit.Style.hideElement(this.getElement('cardDetail'));
74 }, 75 },
75 76
76 //------------------------------------------------------------------------- 77 'showCards': function (someCards) {
78 varcardListElement;
79 if (this.isFullyRendered() == false) {
80 this.render();
81 };
82
83 cardListElement = this.getElement('list')
84
85 cardInfo = {
86 '_rowObject': MochiKit.Async.succeed,
87 '_reference': MochiKit.Base.methodcaller('reference'),
88 '_searchableContent':MochiKit.Base.methodcaller('searchableContent'),
89 'label': MochiKit.Base.methodcaller('label'),
90 'favicon': MochiKit.Base.methodcaller('favicon')
91 };
92
93//console.log("someCards", someCards);
94 deferredResult = new Clipperz.Async.Deferred("CardList.showCards", {trace:false});
95 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("CardList.value - collectResults", cardInfo, {trace:false}));
96 deferredResult.addCallback(Clipperz.Async.collectAll);
97 deferredResult.addCallback(MochiKit.Base.methodcaller('sort', Clipperz.Base.caseInsensitiveKeyComparator('label')));
98 deferredResult.addCallbackPass(MochiKit.DOM.replaceChildNodes, cardListElement);
99 // deferredResult.addCallbackPass(MochiKit.DOM.removeElementClass, cardListElement, 'loading');
100 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'appendCardToList', cardListElement));
101 deferredResult.callback(someCards);
102 },
103
104 'appendCardToList': function (aCardListElement, aCardInfo) {
105//console.log("appendCardToList", aCardInfo);
106 this.append(aCardListElement, {tag:'li', cls:'cardListItem arrow', cardreference:aCardInfo['_reference'], children:[
107 {tag:'a', href:'#', html:aCardInfo['label'], children:[
108 {tag:'small', cls:'favicon', children:[{tag:'img', cls:'favicon', src:aCardInfo['favicon']}]}
109 ]}
110 ]});
111 },
112
113 'cardSelectionHandler': function (anEvent) {
114 var listElement;
115 varcardReference;
116
117 anEvent.preventDefault();
118
119 listElement = anEvent.target();
120 if (MochiKit.DOM.getNodeAttribute(listElement, 'cardreference') == null) {
121 listElement = MochiKit.DOM.getFirstParentByTagAndClassName(anEvent.target(), tagName='li', className='cardListItem');
122 }
123 cardReference = MochiKit.DOM.getNodeAttribute(listElement, 'cardreference');
124console.log("###", listElement, cardReference);
125 //TODO: Notify card with reference MochiKit.DOM.getNodeAttribute(listElement, 'cardreference') has been selected
126 MochiKit.Signal.signal(this, 'selectedCard', cardReference);
127 },
77 128
129 //-------------------------------------------------------------------------
130/*
78 'searchHandler': function (anEvent) { 131 'searchHandler': function (anEvent) {
79 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { //RETURN 132 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { //RETURN
80 anEvent.preventDefault(); 133 anEvent.preventDefault();
81 } else { 134 } else {
82 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) { 135 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) {
83 anEvent.target().value = ""; 136 anEvent.target().value = "";
84 } 137 }
85 138
86 if (anEvent.type() == 'keyup') { 139 if (anEvent.type() == 'keyup') {
87 MochiKit.Signal.signal(this, 'searchEvent', anEvent.target().value); 140 MochiKit.Signal.signal(this, 'searchEvent', anEvent.target().value);
88 } 141 }
89 } 142 }
90 }, 143 },
91 144
92 //------------------------------------------------------------------------- 145 //-------------------------------------------------------------------------
93 146
94 'update': function (someObjects) { 147 'update': function (someObjects) {
95 varcardListPanel; 148 varcardListPanel;
96 var i,c; 149 var i,c;
97 150
98 cardListPanel = this.getElement('cardListPanel'); 151 cardListPanel = this.getElement('cardListPanel');
99 cardListPanel.innerHTML = ''; 152 cardListPanel.innerHTML = '';
100 153
101 c = someObjects.length; 154 c = someObjects.length;
102 155
103 for (i=0; i<c; i++) { 156 for (i=0; i<c; i++) {
104 this.append(cardListPanel, {tag:'li', cls:'cardListItem', id:('cardListItem_' + someObjects[i]['_reference']), children:[ 157 this.append(cardListPanel, {tag:'li', cls:'cardListItem', id:('cardListItem_' + someObjects[i]['_reference']), children:[
105 {tag:'img', src:(someObjects[i]['favicon'] ? someObjects[i]['favicon'] : 'data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=')}, 158 {tag:'img', src:(someObjects[i]['favicon'] ? someObjects[i]['favicon'] : 'data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=')},
106 {tag:'a', id:('cardListReference_' + someObjects[i]['_reference']), href:'#', html:someObjects[i]['label']} 159 {tag:'a', id:('cardListReference_' + someObjects[i]['_reference']), href:'#', html:someObjects[i]['label']}
107 ]}) 160 ]})
108 161
109 MochiKit.Signal.connect('cardListItem_' + someObjects[i]['_reference'], 'onclick', this, 'cardListClickHandler'); 162 MochiKit.Signal.connect('cardListItem_' + someObjects[i]['_reference'], 'onclick', this, 'cardListClickHandler');
110 } 163 }
111 164
112 }, 165 },
113 166
114 'cardListClickHandler': function (anEvent) { 167 'cardListClickHandler': function (anEvent) {
115 anEvent.preventDefault(); 168 anEvent.preventDefault();
116 169
117 if (/(cardListReference_|cardListItem_)/.test(anEvent.target().id)) { 170 if (/(cardListReference_|cardListItem_)/.test(anEvent.target().id)) {
118 var cardListReference; 171 var cardListReference;
119 172
120 cardListReference = anEvent.target().id.match(/(cardListReference_|cardListItem_)(.*)/)[2]; 173 cardListReference = anEvent.target().id.match(/(cardListReference_|cardListItem_)(.*)/)[2];
121//console.log("Showing detail for card named", cardListReference); 174//console.log("Showing detail for card named", cardListReference);
122 MochiKit.Signal.signal(this, 'selectedCard', cardListReference); 175 MochiKit.Signal.signal(this, 'selectedCard', cardListReference);
123 } 176 }
124 }, 177 },
125 178
126 //========================================================================= 179 //=========================================================================
127 180
128 'cardDetail': function (someData) { 181 'cardDetail': function (someData) {
129 if (this._cardDetail == null) { 182 if (this._cardDetail == null) {
130 this._cardDetail = new Clipperz.PM.UI.iPhone.Components.CardDetail({element:this.getElement('cardDetail')}); 183 this._cardDetail = new Clipperz.PM.UI.Mobile.Components.CardDetail({element:this.getElement('cardDetail')});
131 } 184 }
132 185
133 return this._cardDetail; 186 return this._cardDetail;
134 }, 187 },
135 188
136 //------------------------------------------------------------------------- 189 //-------------------------------------------------------------------------
137 190
138 'removeCardDetail': function () { 191 'removeCardDetail': function () {
139 if (this._cardDetail != null) { 192 if (this._cardDetail != null) {
140 this._cardDetail.remove(); 193 this._cardDetail.remove();
141 this._cardDetail = null; 194 this._cardDetail = null;
142 } 195 }
143 }, 196 },
144 197
145 //========================================================================= 198 //=========================================================================
146 199
147 'showCard': function (someData) { 200 'showCard': function (someData) {
148 vardeferredResult; 201 vardeferredResult;
149 varoffset; 202 varoffset;
150 203
151 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480); 204 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
152 this.cardDetail().render(); 205 this.cardDetail().render();
153 this.cardDetail().setCardReference(someData['_reference']); 206 this.cardDetail().setCardReference(someData['_reference']);
154 MochiKit.Style.setElementPosition(this.cardDetail().element(), {x:offset}); 207 MochiKit.Style.setElementPosition(this.cardDetail().element(), {x:offset});
155 new MochiKit.Visual.Sequence([ 208 new MochiKit.Visual.Sequence([
156 // new MochiKit.Visual.Move(this.cardDetail().element(), {x:offset, y:45, mode:'absolute', duration:0, sync:true}), 209 // new MochiKit.Visual.Move(this.cardDetail().element(), {x:offset, y:45, mode:'absolute', duration:0, sync:true}),
157 new MochiKit.Visual.Parallel([ 210 new MochiKit.Visual.Parallel([
158 new MochiKit.Visual.Move(this.getElement('cardList'), {x:-offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 211 new MochiKit.Visual.Move(this.getElement('cardList'), {x:-offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
159 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:0, y:45, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}), 212 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:0, y:45, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}),
160 // new MochiKit.Visual.ScrollTo('toolbar', {sync:true}), 213 // new MochiKit.Visual.ScrollTo('toolbar', {sync:true}),
161 MochiKit.Visual.appear ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true}) 214 MochiKit.Visual.appear ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
162 ], {duration:1, sync:true}), 215 ], {duration:1, sync:true}),
163 MochiKit.Visual.fade(this.getElement('cardList'), {duration:0, sync:true}) 216 MochiKit.Visual.fade(this.getElement('cardList'), {duration:0, sync:true})
164 ], {}) 217 ], {})
165 218
166 MochiKit.DOM.getElement('pageTitle').innerHTML = someData['title']; 219 MochiKit.DOM.getElement('pageTitle').innerHTML = someData['title'];
167 220
168 return true; 221 return true;
169 }, 222 },
170 223
171 //------------------------------------------------------------------------- 224 //-------------------------------------------------------------------------
172 225
173 'showCardDetails': function (someData) { 226 'showCardDetails': function (someData) {
174 return this.cardDetail().showCardDetails(someData); 227 return this.cardDetail().showCardDetails(someData);
175 }, 228 },
176 229
177 //========================================================================= 230 //=========================================================================
178 231
179 'backButtonClickHandler': function (anEvent) { 232 'backButtonClickHandler': function (anEvent) {
180 varoffset; 233 varoffset;
181 234
182 anEvent.preventDefault(); 235 anEvent.preventDefault();
183 236
184 MochiKit.DOM.getElement('pageTitle').innerHTML = "cards"; 237 MochiKit.DOM.getElement('pageTitle').innerHTML = "cards";
185 238
186 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480); 239 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
187 MochiKit.Style.setElementPosition(this.getElement('cardList'), {x:-offset}); 240 MochiKit.Style.setElementPosition(this.getElement('cardList'), {x:-offset});
188 MochiKit.DOM.showElement(this.getElement('cardList')); 241 MochiKit.DOM.showElement(this.getElement('cardList'));
189 242
190 new MochiKit.Visual.Parallel([ 243 new MochiKit.Visual.Parallel([
191 new MochiKit.Visual.Move(this.getElement('cardList'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 244 new MochiKit.Visual.Move(this.getElement('cardList'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
192 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 245 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
193 MochiKit.Visual.fade (this.getElement('cardDetail'), { transition:MochiKit.Visual.Transitions.linear, sync:true}), 246 MochiKit.Visual.fade (this.getElement('cardDetail'), { transition:MochiKit.Visual.Transitions.linear, sync:true}),
194 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true}) 247 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
195 ], {duration:1, afterFinish:MochiKit.Base.method(this, 'removeCardDetail')}) 248 ], {duration:1, afterFinish:MochiKit.Base.method(this, 'removeCardDetail')})
196 249
197 }, 250 },
198 251*/
199 //========================================================================= 252 //=========================================================================
200 __syntaxFix__: "syntax fix" 253 __syntaxFix__: "syntax fix"
201}); 254});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js
new file mode 100644
index 0000000..eafcdbc
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js
@@ -0,0 +1,356 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components');
27
28Clipperz.PM.UI.Mobile.Components.LoginForm = function(args) {
29 args = args || {};
30
31 this._pin = '';
32
33 this._message = null;
34 this._steps = 0;
35 this._actualSteps = 0;
36
37 this._callback = null;
38 this._errorCallback = null;
39
40 this._mode = 'CREDENTIALS';
41
42 Clipperz.PM.UI.Mobile.Components.LoginForm.superclass.constructor.apply(this, arguments);
43
44 return this;
45}
46
47//=============================================================================
48
49Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
50
51 //-------------------------------------------------------------------------
52
53 'toString': function () {
54 return "Clipperz.PM.UI.Mobile.Components.LoginForm component";
55 },
56
57 //-------------------------------------------------------------------------
58
59 'callback': function () {
60 return this._callback;
61 },
62
63 'errorCallback': function () {
64 return this._errorCallback;
65 },
66
67 //-------------------------------------------------------------------------
68
69 'mode': function () {
70 return this._mode;
71 },
72
73 'setMode': function (aValue) {
74 this._mode = aValue;
75 },
76
77 //..........................................................................
78
79 'pin': function () {
80 return this._pin;
81 },
82
83 'setPin': function (aValue) {
84 this._pin = aValue;
85 },
86
87 //..........................................................................
88
89 'username': function () {
90 return this._username;
91 },
92
93 'setUsername': function (aValue) {
94 this._username = aValue;
95 },
96
97 //..........................................................................
98
99 'passphrase': function () {
100 return this._passphrase;
101 },
102
103 'setPassphrase': function (aValue) {
104 this._passphrase = aValue;
105 },
106
107 //-------------------------------------------------------------------------
108
109 'message': function () {
110 return this._message;
111 },
112
113 '_setMessage': function (aValue) {
114 this._message = aValue;
115
116 if (aValue == null) {
117 MochiKit.Style.hideElement(this.getElement('credentialsMessage'));
118 } else {
119 this.getElement('message').innerHTML = aValue;
120 MochiKit.Style.showElement(this.getElement('credentialsMessage'));
121 }
122 },
123
124 'setMessage': function (aValue) {
125 this._setMessage(aValue);
126 MochiKit.DOM.removeElementClass(this.getElement('credentialsMessage'), 'error');
127 },
128
129 'setErrorMessage': function (aValue) {
130 this._setMessage(aValue);
131 MochiKit.DOM.addElementClass(this.getElement('credentialsMessage'), 'error');
132 },
133
134 //-------------------------------------------------------------------------
135
136 'setCallbacks': function (args) {
137 this._callback = args['callback'];
138 this._errorCallback = args['errorCallback'];
139 },
140
141 'showErrors': function (args) {
142//console.log("LoginForm.showErrors", args);
143 if (args['previousFailedAttempt'] == 'LOGIN') {
144 this.setErrorMessage("Wrong credentials");
145 } else if (args['previousFailedAttempt'] == 'PIN') {
146 if (args['failedAttempts'] == -1) {
147 this.setErrorMessage("Wrong PIN - Resetted");
148 } else {
149 this.setErrorMessage("Wrong PIN");
150 }
151 } else {
152 this.setMessage(null);
153 }
154 },
155
156 'updateWithArgs': function (args) {
157 this.renderIfNeeded();
158 this.setCallbacks(args);
159 this.showErrors(args);
160 this.updateRendering();
161 },
162
163 'showPinLogin': function (args) {
164 this.setPin('');
165 this.setMode('PIN');
166 this.updateWithArgs(args);
167
168 // $(this.getAnchor('PIN')).focus();
169 this.getElement('PIN').focus();
170 },
171
172 'showCredentialsLogin': function (args) {
173 this.setMode('CREDENTIALS');
174 this.updateWithArgs(args);
175
176 if (this.getElement('usernameField').value.length == 0) {
177 // $(this.getAnchor('usernameField')).focus();
178 this.getElement('usernameField').focus();
179 } else {
180 // $(this.getAnchor('passphraseField')).focus();
181 this.getElement('passphraseField').focus();
182 this.getElement('passphraseField').select();
183 }
184 },
185
186 //-------------------------------------------------------------------------
187
188 'renderIfNeeded': function () {
189 if (this.isFullyRendered() == false) {
190 this.render();
191 };
192 this.updateRendering();
193 },
194
195 'updateRendering': function () {
196 MochiKit.Style.showElement(this.getElement('credentialsBody'));
197 MochiKit.Style.hideElement(this.getElement('validating'));
198
199 // this.hideAllPanes();
200 MochiKit.Base.map(function (aNode) { MochiKit.Style.hideElement(aNode); }, MochiKit.Selector.findDocElements('div.credentialsBody > div'));
201 if (this.mode() == 'CREDENTIALS') {
202 selectedPanel = this.getElement('credentials')
203 } else if (this.mode() == 'PIN') {
204 selectedPanel = this.getElement('pin')
205 // this.updatePinDisplay();
206 } else {
207 throw 'Unhandled login form mode';
208 }
209 MochiKit.Style.showElement(selectedPanel);
210
211 MochiKit.Style.hideElement(this.getElement('validating'));
212 },
213
214 'renderSelf': function() {
215 var selectedPanel;
216 this.append(this.element(), {tag:'div', id:'login', children:[
217 {tag:'div', cls:'toolbar', children:[
218 {tag:'h1', html:"clipperz"}
219 ]},
220 {tag:'div', cls:'scroll', children:[
221 //==================================================================
222 {tag:'div', cls:'credentialsMessage', id:this.getId('credentialsMessage'), children:[
223 {tag:'h1', cls:'message', id:this.getId('message'), html:"Message"}
224 ]},
225 //==================================================================
226 {tag:'div', cls:'credentialsBody', id:this.getId('credentialsBody'), children:[
227 //--------------------------------------------------------------
228 {tag:'div', cls:'pin', id:this.getId('pin'), children:[
229 {tag:'form', cls:'scroll', id:this.getId('pinForm'), children:[
230 {tag:'ul', cls:'edit rounded', children:[
231 {tag:'li', children:[{tag:'input', type:'number', name:'PIN', placeholder:"PIN", id:this.getId('PIN') }]},
232 ]},
233 {tag:'a', href:'#', cls:'greenButton', id:this.getId('pinSubmitButton'), html:"Login"}
234 ]}
235 ]},
236 //--------------------------------------------------------------
237 {tag:'div', cls:'credentials', id:this.getId('credentials'), children:[
238 {tag:'form', cls:'scroll', id:this.getId('credentialsForm'), children:[
239 {tag:'ul', cls:'edit rounded', children:[
240 {tag:'li', children:[{tag:'input', type:'email', name:'name', /*value:'joe',*/ placeholder:"username", id:this.getId('usernameField') }]},
241 {tag:'li', children:[{tag:'input', type:'password', name:'passphrase', /*value:'clipperz',*/placeholder:"passphrase", id:this.getId('passphraseField') }]}
242 ]},
243 {tag:'a', href:'#', cls:'greenButton', id:this.getId('credentialsSubmitButton'), html:"Login"}
244 // {tag:'input', type:'submit', cls:'greenButton', id:this.getId('credentialsSubmitButton'), value:"Login"}
245
246 ]}
247 ]},
248 //--------------------------------------------------------------
249 ]},
250 //==================================================================
251 {tag:'div', cls:'validating', id:this.getId('validating'), children:[
252 {tag:'div', cls:'loading', children:[
253 {tag:'div', cls:'spinner', children:[
254 {tag:'div', cls:'bar01'},
255 {tag:'div', cls:'bar02'},
256 {tag:'div', cls:'bar03'},
257 {tag:'div', cls:'bar04'},
258 {tag:'div', cls:'bar05'},
259 {tag:'div', cls:'bar06'},
260 {tag:'div', cls:'bar07'},
261 {tag:'div', cls:'bar08'},
262 {tag:'div', cls:'bar09'},
263 {tag:'div', cls:'bar10'},
264 {tag:'div', cls:'bar11'},
265 {tag:'div', cls:'bar12'}
266 ]}
267 ]},
268 {tag:'div', id:this.getId('loadingMessage')},
269 {tag:'a', href:'#', cls:'grayButton', id:this.getId('loginCancelButton'), html:"Cancel"}
270 ]}
271 //==================================================================
272 ]}
273 ]});
274
275 MochiKit.Signal.connect(this.getElement('credentialsForm'), 'onsubmit', this, 'submitCredentialsHandler');
276 MochiKit.Signal.connect(this.getElement('credentialsSubmitButton'), 'onclick', this, 'submitCredentialsHandler');
277
278 MochiKit.Signal.connect(this.getElement('pinForm'), 'onsubmit', this, 'submitPinHandler');
279 MochiKit.Signal.connect(this.getElement('pinSubmitButton'), 'onclick', this, 'submitPinHandler');
280
281 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle');
282 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle');
283 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle');
284 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle');
285 },
286
287 //-------------------------------------------------------------------------
288
289 'submitPinHandler': function (anEvent) {
290 varpin;
291
292 this.setMessage(null);
293 pin = this.getElement('PIN').value;
294 // $(this.getAnchor('PIN')).blur();
295 this.getElement('PIN').blur();
296
297 credentials = Clipperz.PM.PIN.credentialsWithPIN(pin);
298 this.loginWithCredentials(credentials);
299 },
300
301 'submitCredentialsHandler': function (anEvent) {
302//console.log("submitCredentialsHandler");
303 varcredentials;
304
305 this.setMessage(null);
306
307 credentials = {};
308 credentials['username'] = this.getElement('usernameField').value;
309 credentials['passphrase'] = this.getElement('passphraseField').value;
310 // $(this.getAnchor('passphraseField')).blur();
311 this.getElement('passphraseField').blur();
312
313 this.loginWithCredentials(credentials);
314 },
315
316 //-------------------------------------------------------------------------
317
318 'loginWithCredentials': function (someCredentials) {
319 varargs;
320
321 args = {};
322 args['credentials'] = someCredentials;
323 args['errorCallback'] = this.errorCallback();
324
325 MochiKit.Style.hideElement(this.getElement('credentialsBody'));
326 MochiKit.Style.showElement(this.getElement('validating'));
327
328 MochiKit.Async.callLater(0.1, this.callback(), args);
329 },
330
331 //-------------------------------------------------------------------------
332
333 'initProgressHandle': function (anEvent) {
334//console.log("** initProgressHandle", anEvent);
335 this._steps = anEvent['steps'];
336 this._actualSteps = 0;
337 },
338
339 'updateProgressHandle': function (anEvent) {
340//console.log("** updateProgressHandle", anEvent);
341 this._steps += anEvent['extraSteps'];
342 },
343
344 'advanceProgressHandle': function (anEvent) {
345//console.log("** advanceProgressHandle", anEvent);
346 this._actualSteps ++;
347//console.log("STEPS: " + this._actualSteps + "/" + this._steps);
348 },
349
350 'progressDoneHandle': function (anEvent) {
351//console.log("** progressDoneHandle", anEvent);
352 },
353
354 //-------------------------------------------------------------------------
355 __syntaxFix__: "syntax fix"
356});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js
new file mode 100644
index 0000000..12a61f7
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js
@@ -0,0 +1,393 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Controllers');
27
28Clipperz.PM.UI.Mobile.Controllers.MainController = function() {
29 this._jQTouch = null;
30 this._user = null;
31 this._proxy = null;
32 this._loginForm = null;
33 this._cardList = null;
34 this._cardDetail= null;
35
36 return this;
37}
38
39MochiKit.Base.update(Clipperz.PM.UI.Mobile.Controllers.MainController.prototype, {
40
41 'toString': function () {
42 return "Clipperz.PM.UI.Mobile.Controllers.MainController";
43 },
44
45 //-------------------------------------------------------------------------
46
47 'user': function () {
48 return this._user;
49 },
50
51 'setUser': function (aValue) {
52 this._user = aValue;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'jQTouch': function () {
58 return this._jQTouch;
59 },
60
61 'setJQTouch': function (aValue) {
62 this._jQTouch = aValue;
63 },
64
65 //=========================================================================
66
67 'run': function () {
68 console.log("MainController.run");
69
70 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin'));
71 Clipperz.DOM.Helper.overwrite(MochiKit.DOM.currentDocument().body, {tag:'div', id:'jqt', children:[
72 {tag:'div', id:'loginForm'},
73 {tag:'div', id:'cardList'},
74 {tag:'div', id:'cardDetail'},
75 {tag:'div', id:'preferences'}
76 ]});
77
78 this.showLoginForm();
79
80 this.initjQTouch();
81
82
83 // this.showAddToHomeScreenBaloon();
84 // this.selectInitialProxy();
85 },
86
87 'initjQTouch': function () {
88 var jqt;
89
90 jqt = new $.jQTouch({
91 icon: 'data:image/png;charset=utf-8;base64,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',
92 // icon4: 'jqtouch4.png',
93 // startupScreen: null, //Pass a string path to a 320px x 460px startup screen for full screen apps.
94 statusBar: 'black-translucent', //Styles the status bar when running as a fullscreen app. Other options are `default`, `black`, and `black-translucent`.
95 // addGlossToIcon: true, //Set to 'false' to prevent automatic glossy button effect on icon.
96 preloadImages: false, //Pass an array of image paths to load them before page loads. Ex: `['images/link_over.png', 'images/link_select.png']`
97 fixedViewport: true, //Removes the user's ability to scale the page. Ensures the site behaves more like an application.
98 // fullScreen: true, //The website will become a fullscreen application when saved to a user's home screen. Set to `false` to disable.
99 // fullScreenClass: 'fullscreen' //Adds a class to the `<body>` when running in full-screen mode, to allow for easy detection and styling. Set to `false` to disable.
100 // themeSelectionSelector: '#jqt #themes ul', //???
101
102 // useAnimations: true, //Set to `false` to disable all animations.
103 // useFastTouch: true, //Removes ~350ms onClick delay when tapping a link (use in conjunction with the .tap() event) **Experimental**
104 // useTouchScroll: true, //Adds support for iOS5 scrolling. Set to false to disable. **Experimental**
105
106 cacheGetRequests: false, //Automatically caches GET requests, so subsequent taps reference the pre-loaded views. (default: true)
107
108 // backSelector: '.back, .cancel, .goback', //A CSS selector for back links/buttons. When clicked, the page history goes back one, automatically reversing whichever entrance animation was used.
109
110 // cubeSelector: '.cube', //Link selector for a cube animation.
111 // dissolveSelector: '.dissolve', //Link selector for a dissolve animation.
112 // fadeSelector: '.fade', //Link selector for a fade animation.
113 // flipSelector: '.flip', //Link selector for a 3d flip animation.
114 formSelector: null, //Sets which forms are automatically submitted via Ajax. (default: 'form')
115 // popSelector: '.pop', //Link selector for a pop animation. (default: '.pop')
116 // slideSelector: 'body > * > ul li a', //Link selector for the default slide-left transition. By default applies to all links within an unordered list. Accepts any jQuery-capable selector `'li &gt; a, a:not(.dontslide)'`, etc. (default: 'body > * > ul li a')
117 // slideupSelector: '.slideup', //Link selector for a slide up animation. (default: '.slideup')
118 // submitSelector: '.submit', //Selector which, when clicked, will submit its parent form (and close keyboard if open). (default: '.submit')
119 // swapSelector: '.swap', //Link selector for 3d swap animation. (default: '.swap')
120 // touchSelector: 'a, .touch', //Selector for items which are automatically given expanded touch events. This makes ordinary links more responsive and provides trigger events like `swipe` (default: 'a, .touch')
121
122 debug: false
123 });
124
125 this.setJQTouch(jqt);
126 },
127
128 //=========================================================================
129
130 'showAddToHomeScreenBaloon': function () {
131console.log(">>> showAddToHomeScreenBaloon");
132 },
133
134 //-------------------------------------------------------------------------
135
136 'selectInitialProxy': function () {
137//console.log(">>> selectInitialProxy");
138 if (this.isOnline()) {
139//console.log("--- selectInitialProxy: using default proxy");
140 this._proxy = Clipperz.PM.Proxy.defaultProxy;
141 } else {
142 if (this.hasLocalData()) {
143//console.log("--- selectInitialProxy: using local cache proxy");
144 this._proxy = new Clipperz.PM.Proxy.OfflineCache({'shouldPayTolls':false});
145 } else {
146 this.showOfflineError();
147 }
148 }
149 },
150
151 //-------------------------------------------------------------------------
152
153 'showLoginForm': function (args) {
154 args = args || {};
155
156 args['callback'] = MochiKit.Base.method(this, 'doLogin');
157
158 if (Clipperz.PM.PIN.isSet()) {
159 args['errorCallback'] = MochiKit.Base.method(this, 'handleFailedPinLogin');
160 this.loginForm().showPinLogin(args);
161 } else {
162 args['errorCallback'] = MochiKit.Base.method(this, 'handleFailedCredentialsLogin');
163 this.loginForm().showCredentialsLogin(args);
164 }
165 },
166
167 //.........................................................................
168
169 'handleFailedCredentialsLogin': function () {
170console.log("LOGIN FAILED");
171 this.showLoginForm({'previousFailedAttempt':'LOGIN'});
172 },
173
174 //.........................................................................
175
176 'handleFailedPinLogin': function () {
177 varfailedAttempts;
178 varstatus;
179
180 failedAttempts = Clipperz.PM.PIN.recordFailedAttempt();
181 this.showLoginForm({'previousFailedAttempt':'PIN', 'failedAttempts': failedAttempts});
182 },
183
184 //-------------------------------------------------------------------------
185
186 'doLogin': function (someArgs) {
187 var deferredResult;
188 var credentials;
189 var errorCallback;
190 var user;
191 var getPassphraseDelegate;
192
193//console.log(">>> MainController.doLogin", someArgs);
194 credentials = someArgs['credentials'];
195 errorCallback = someArgs['errorCallback'] || MochiKit.Base.noop;
196
197 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, credentials.passphrase);
198 user = new Clipperz.PM.DataModel.User({'username':credentials.username, 'getPassphraseFunction':getPassphraseDelegate});
199
200 deferredResult = new Clipperz.Async.Deferred('MainController.doLogin', {trace:false});
201 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
202 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
203 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
204 deferredResult.addMethod(user, 'login');
205 deferredResult.addCallbacks(
206 MochiKit.Base.method(this, 'processSuccessfulLogin', user),
207 errorCallback
208 );
209 deferredResult.callback();
210
211 return deferredResult;
212 },
213
214 //..........................................................................
215
216 'processSuccessfulLogin': function (aUser) {
217 var deferredResult;
218
219 deferredResult = new Clipperz.Async.Deferred('MainController.processSuccessfulLogin', {trace:false});
220 deferredResult.addMethod(Clipperz.PM.PIN, 'resetFailedAttemptCount');
221 // deferredResult.addMethod(this, 'removeLoginForm');
222 deferredResult.addMethod(this, 'setUser', aUser);
223 deferredResult.addMethod(this, 'setupApplication');
224 deferredResult.addMethod(this, 'runApplication');
225 deferredResult.callback();
226
227 return deferredResult;
228 },
229
230 //-------------------------------------------------------------------------
231
232 'setupApplication': function () {
233 vardeferredResult;
234
235console.log(">>> setupApplication");
236 deferredResult = new Clipperz.Async.Deferred("MainController.setupApplication", {trace:false});
237 deferredResult.addMethod(this, 'welcomeFirstTimeUser');
238 deferredResult.addMethod(this, 'showPaymentReminder');
239 deferredResult.addMethod(this, 'copyDataLocally');
240 deferredResult.callback(arguments);
241
242 return deferredResult;
243 },
244
245
246 //..........................................................................
247
248 'isFirstTimeUser': function () {
249 return false;
250 },
251
252 'welcomeFirstTimeUser': function () {
253 vardeferredResult;
254
255 deferredResult = new Clipperz.Async.Deferred('MainController.welcomeFirstTimeUser', {trace:false});
256
257 if (this.isFirstTimeUser()) {
258 deferredResult.addCallback(function () { console.log("--> welcome"); });
259 }
260 deferredResult.callback();
261
262 return deferredResult;
263 },
264
265 //..........................................................................
266
267 'shouldShowPaymentReminder': function () {
268 return true;
269 },
270
271 'showPaymentReminder': function () {
272 vardeferredResult;
273
274 deferredResult = new Clipperz.Async.Deferred('MainController.showPaymentReminder', {trace:false});
275
276 if (this.shouldShowPaymentReminder()) {
277 deferredResult.addCallback(function () { console.log("--> payment reminder"); });
278 }
279 deferredResult.callback();
280
281 return deferredResult;
282 },
283
284 //..........................................................................
285
286 'canCopyDataLocally': function () {
287 return false;
288 },
289
290 'copyDataLocally': function () {
291 vardeferredResult;
292
293 deferredResult = new Clipperz.Async.Deferred('MainController.copyDataLocally', {trace:false});
294
295 if (this.canCopyDataLocally()) {
296 deferredResult.addCallback(function () { console.log("--> copy data locally"); });
297 }
298 deferredResult.callback();
299
300 return deferredResult;
301
302 },
303
304 //-------------------------------------------------------------------------
305
306 'runApplication': function () {
307 var deferredResult;
308
309//console.log(">>> runApplication");
310 deferredResult = new Clipperz.Async.Deferred('MainController.runApplication', {trace:true});
311 deferredResult.addMethod(this.user(), 'getRecords');
312 deferredResult.addMethod(this, 'showCards');
313 deferredResult.callback();
314
315 return deferredResult;
316 },
317
318 //=========================================================================
319
320 'showOfflineError': function (anException) {
321 alert("Error: " + anException);
322 throw anException;
323 },
324
325 //=========================================================================
326
327 'isOnline': function() {
328 return navigator.onLine;
329 },
330
331 'hasLocalData': function() {
332 return false;
333 },
334
335 //=========================================================================
336
337 'loginForm': function() {
338 if (this._loginForm == null) {
339 this._loginForm = new Clipperz.PM.UI.Mobile.Components.LoginForm({element:MochiKit.DOM.getElement('loginForm')});
340 }
341
342 return this._loginForm;
343 },
344
345 'removeLoginForm': function () {
346 if (this._loginForm != null) {
347 this._loginForm.remove();
348 this._loginForm = null;
349 }
350 },
351
352 //-------------------------------------------------------------------------
353
354 'cardList': function () {
355 if (this._cardList == null) {
356 this._cardList = new Clipperz.PM.UI.Mobile.Components.CardList({element:MochiKit.DOM.getElement('cardList')});
357 MochiKit.Signal.connect(this._cardList, 'selectedCard', this, 'selectCardHandler');
358 }
359
360 return this._cardList;
361 },
362
363 'showCards': function (someCards) {
364 this.cardList().showCards(someCards);
365 this.jQTouch().goTo('#cardList', 'slideleft');
366 },
367
368 //-------------------------------------------------------------------------
369
370 'cardDetail': function () {
371 if (this._cardDetail == null) {
372 this._cardDetail = new Clipperz.PM.UI.Mobile.Components.CardDetail({element:MochiKit.DOM.getElement('cardDetail')});
373 }
374
375 return this._cardDetail;
376 },
377
378 'selectCardHandler': function (aCardReference) {
379 var deferredResult;
380
381 deferredResult = new Clipperz.Async.Deferred("MainController.selectCardHandler", {trace:true});
382 deferredResult.addMethod(this.cardDetail(), 'render');
383 deferredResult.addMethod(this.jQTouch(), 'goTo', '#cardDetail', 'slideleft');
384 deferredResult.addMethod(this.user(), 'getRecord', aCardReference);
385 deferredResult.addMethod(this.cardDetail(), 'showCard');
386 deferredResult.callback();
387
388 return deferredResult;
389 },
390
391 //=========================================================================
392 __syntaxFix__: "syntax fix"
393});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
index ee6d7a3..d6b0574 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
@@ -1,145 +1,150 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 27
28Clipperz.PM.UI.Web.Components.AccountPanel = function(args) { 28Clipperz.PM.UI.Web.Components.AccountPanel = function(args) {
29 args = args || {}; 29 args = args || {};
30 30
31 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments);
32 32
33 //this._initiallySelectedTab = args.selected || 'ACCOUNT'; 33 //this._initiallySelectedTab = args.selected || 'ACCOUNT';
34 this._initiallySelectedTab = args.selected || 'PASSPHRASE'; 34 this._initiallySelectedTab = args.selected || 'PASSPHRASE';
35 this._tabPanelControllerConfiguration = { 35 this._tabPanelControllerConfiguration = {
36 // 'ACCOUNT': { 36 // 'ACCOUNT': {
37 // tab:'accountTab', 37 // tab:'accountTab',
38 // panel:'accountPanel' 38 // panel:'accountPanel'
39 // }, 39 // },
40 'PASSPHRASE': { 40 'PASSPHRASE': {
41 tab:'passphraseTab', 41 tab:'passphraseTab',
42 panel:'passphrasePanel' 42 panel:'passphrasePanel'
43 }, 43 },
44 'OTP': {
45 tab:'OTPTab',
46 panel:'OTPPanel'
47 },
44 'PREFERENCES': { 48 'PREFERENCES': {
45 tab:'preferencesTab', 49 tab:'preferencesTab',
46 panel:'preferencesPanel' 50 panel:'preferencesPanel'
47 }, 51 },
48 'LOGIN_HISTORY': { 52 'LOGIN_HISTORY': {
49 tab:'loginHistoryTab', 53 tab:'loginHistoryTab',
50 panel:'loginHistoryPanel' 54 panel:'loginHistoryPanel'
51 } 55 }
52 }; 56 };
53 57
54 return this; 58 return this;
55} 59}
56 60
57//============================================================================= 61//=============================================================================
58 62
59Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 63Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
60 64
61 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
62 66
63 'toString': function () { 67 'toString': function () {
64 return "Clipperz.PM.UI.Web.Components.AccountPanel component"; 68 return "Clipperz.PM.UI.Web.Components.AccountPanel component";
65 }, 69 },
66 70
67 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
68 72
69 'renderSelf': function(/*aContainer, aPosition*/) { 73 'renderSelf': function(/*aContainer, aPosition*/) {
70//Clipperz.log("AccountPanel.renderSelf element", this.element()); 74//Clipperz.log("AccountPanel.renderSelf element", this.element());
71 this.append(this.element(), [ 75 this.append(this.element(), [
72 {tag:'div', cls:'header', children:[ 76 {tag:'div', cls:'header', children:[
73 {tag:'div', cls:'subPanelTabs', children:[ 77 {tag:'div', cls:'subPanelTabs', children:[
74 {tag:'ul', children:[ 78 {tag:'ul', children:[
75 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'}, 79 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'},
76 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'}, 80 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'},
81 {tag:'li', id:this.getId('OTPTab'), children:[{tag:'a', href:'#', html:'One Time Passwords'}]},
77 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]}, 82 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]},
78 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]} 83 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]}
79 ]} 84 ]}
80 ]} 85 ]}
81 ]}, 86 ]},
82 {tag:'div', cls:'body', children:[ 87 {tag:'div', cls:'body', children:[
83 {tag:'div', cls:'accountPanel', children:[ 88 {tag:'div', cls:'accountPanel', children:[
84 {tag:'div', cls:'subPanelContent', children:[ 89 {tag:'div', cls:'subPanelContent', children:[
85 {tag:'ul', children:[ 90 {tag:'ul', children:[
86 // {tag:'li', id:this.getId('accountPanel'),children:[ 91 // {tag:'li', id:this.getId('accountPanel'),children:[
87 // {tag:'h3', html:"-- Account --"} 92 // {tag:'h3', html:"-- Account --"}
88 // ]}, 93 // ]},
89 {tag:'li', id:this.getId('passphrasePanel'),children:[ 94 {tag:'li', id:this.getId('passphrasePanel'),children:[
90 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"}, 95 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"},
91 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[ 96 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[
92 {tag:'div', cls:'currentCredentials', children:[ 97 {tag:'div', cls:'currentCredentials', children:[
93 {tag:'div', cls:'field username', children:[ 98 {tag:'div', cls:'field username', children:[
94 {tag:'label', html:"username", 'for':this.getId('currentUsername')}, 99 {tag:'label', html:"username", 'for':this.getId('currentUsername')},
95 {tag:'input', id:this.getId('currentUsername')} 100 {tag:'input', id:this.getId('currentUsername')}
96 ]}, 101 ]},
97 {tag:'div', cls:'field passphrase', children:[ 102 {tag:'div', cls:'field passphrase', children:[
98 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')}, 103 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')},
99 {tag:'input', id:this.getId('currentPassphrase')} 104 {tag:'input', id:this.getId('currentPassphrase')}
100 ]} 105 ]}
101 ]}, 106 ]},
102 {tag:'div', cls:'newPassphrase', children:[ 107 {tag:'div', cls:'newPassphrase', children:[
103 {tag:'div', cls:'field', children:[ 108 {tag:'div', cls:'field', children:[
104 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')}, 109 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')},
105 {tag:'input', id:this.getId('newPassphrase')} 110 {tag:'input', id:this.getId('newPassphrase')}
106 ]}, 111 ]},
107 {tag:'div', cls:'field', children:[ 112 {tag:'div', cls:'field', children:[
108 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')}, 113 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')},
109 {tag:'input', id:this.getId('reNewPassphrase')} 114 {tag:'input', id:this.getId('reNewPassphrase')}
110 ]} 115 ]}
111 ]}, 116 ]},
112 {tag:'div', cls:'confirm', children:[ 117 {tag:'div', cls:'confirm', children:[
113 {tag:'input', type:'checkbox', id:this.getId('confirm')}, 118 {tag:'input', type:'checkbox', id:this.getId('confirm')},
114 {tag:'label', html:"I understand that Clipperz will not be able to recover a lost passphrase", 'for':this.getId('confirm')} 119 {tag:'label', html:"I understand that Clipperz will not be able to recover a lost passphrase", 'for':this.getId('confirm')}
115 ]} 120 ]}
116 ]}, 121 ]},
117 {tag:'div', cls:'clear'}, 122 {tag:'div', cls:'clear'},
118 {tag:'div', cls:'confirmButton', id:this.getId('confirmationButton'), children:[ 123 {tag:'div', cls:'confirmButton', id:this.getId('confirmationButton'), children:[
119 {tag:'span', html:"change passphrase"} 124 {tag:'span', html:"change passphrase"}
120 ]}, 125 ]}
121 126 ]},
122 {tag:'h3', cls:'manageOTP', html:"Manage One-Time Passphrases"}, 127 {tag:'li', id:this.getId('OTPPanel'), children:[
123 {} 128 // {tag:'h3', html:"Manage One-Time Passphrases"}
124 ]}, 129 ]},
125 {tag:'li', id:this.getId('preferencesPanel'), children:[ 130 {tag:'li', id:this.getId('preferencesPanel'), children:[
126 {tag:'h3', html:"-- Preferences --"} 131 // {tag:'h3', html:"-- Preferences --"}
127 ]}, 132 ]},
128 {tag:'li', id:this.getId('loginHistoryPanel'), children:[ 133 {tag:'li', id:this.getId('loginHistoryPanel'), children:[
129 {tag:'h3', html:"-- Login History --"} 134 // {tag:'h3', html:"-- Login History --"}
130 ]} 135 ]}
131 ]} 136 ]}
132 ]} 137 ]}
133 ]} 138 ]}
134 ]}, 139 ]},
135 {tag:'div', cls:'footer'} 140 {tag:'div', cls:'footer'}
136 ]); 141 ]);
137 142
138 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 143 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
139 }, 144 },
140 145
141 //------------------------------------------------------------------------- 146 //-------------------------------------------------------------------------
142 147
143 148
144 __syntaxFix__: "syntax fix" 149 __syntaxFix__: "syntax fix"
145}); 150});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
index d2f1045..462d864 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
@@ -21,88 +21,96 @@ refer to http://www.clipperz.com.
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.DataPanel = function(args) { 28Clipperz.PM.UI.Web.Components.DataPanel = function(args) {
29 args = args || {}; 29 args = args || {};
30 30
31 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments);
32 32
33 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY'; 33 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY';
34 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
35 'OFFLINE_COPY': { 35 'OFFLINE_COPY': {
36 tab:'offlineCopyTab', 36 tab:'offlineCopyTab',
37 panel:'offlineCopyPanel' 37 panel:'offlineCopyPanel'
38 }, 38 },
39 'SHARING': { 39 'SHARING': {
40 tab:'sharingTab', 40 tab:'sharingTab',
41 panel:'sharingPanel' 41 panel:'sharingPanel'
42 }, 42 },
43 'IMPORT': { 43 'IMPORT': {
44 tab:'importTab', 44 tab:'importTab',
45 panel:'importPanel' 45 panel:'importPanel'
46 }, 46 },
47 'EXPORT': { 47 'EXPORT': {
48 tab:'exportTab', 48 tab:'exportTab',
49 panel:'exportPanel' 49 panel:'exportPanel'
50 } 50 }
51 }; 51 };
52 52
53 return this; 53 return this;
54} 54}
55 55
56//============================================================================= 56//=============================================================================
57 57
58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
59 59
60 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
61 61
62 'toString': function () { 62 'toString': function () {
63 return "Clipperz.PM.UI.Web.Components.DataPanel component"; 63 return "Clipperz.PM.UI.Web.Components.DataPanel component";
64 }, 64 },
65 65
66 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
67 67
68 'renderSelf': function(/*aContainer, aPosition*/) { 68 'renderSelf': function(/*aContainer, aPosition*/) {
69 this.append(this.element(), [ 69 this.append(this.element(), [
70 {tag:'div', cls:'header', children:[ 70 {tag:'div', cls:'header', children:[
71 {tag:'div', cls:'subPanelTabs', children:[ 71 {tag:'div', cls:'subPanelTabs', children:[
72 {tag:'ul', children:[ 72 {tag:'ul', children:[
73 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'}, 73 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'},
74 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]}, 74 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]},
75 {tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]}, 75 {tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]},
76 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]} 76 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]}
77 ]} 77 ]}
78 ]} 78 ]}
79 ]}, 79 ]},
80 {tag:'div', cls:'body', children:[ 80 {tag:'div', cls:'body', children:[
81 {tag:'div', cls:'accountPanel', children:[ 81 {tag:'div', cls:'accountPanel', children:[
82 {tag:'div', cls:'subPanelContent', children:[ 82 {tag:'div', cls:'subPanelContent', children:[
83 {tag:'ul', children:[ 83 {tag:'ul', children:[
84 {tag:'li', id:this.getId('offlineCopyPanel'),children:[ 84 {tag:'li', id:this.getId('offlineCopyPanel'),children:[
85 {tag:'h3', html:"Offline copy"} 85 // {tag:'h3', html:"Offline copy"},
86 {tag:'p', html:"With just one click you can dump all your encrypted data from Clipperz servers to your hard disk and create a read-only offline version of Clipperz to be used when you are not connected to the Internet."},
87 {tag:'a', id:this.getId('offlineCopyDownloadLink'), href:'#', html:"Download", cls:'downloadOfflineCopy'}
86 ]}, 88 ]},
87 {tag:'li', id:this.getId('sharingPanel'),children:[ 89 {tag:'li', id:this.getId('sharingPanel'),children:[
88 {tag:'h3', html:"Sharing"} 90 // {tag:'h3', html:"Sharing"}
89 ]}, 91 ]},
90 {tag:'li', id:this.getId('importPanel'), children:[ 92 {tag:'li', id:this.getId('importPanel'), children:[
91 {tag:'h3', html:"Import"} 93 // {tag:'h3', html:"Import"}
92 ]}, 94 ]},
93 {tag:'li', id:this.getId('exportPanel'), children:[ 95 {tag:'li', id:this.getId('exportPanel'), children:[
94 {tag:'h3', html:"Export"} 96 // {tag:'h3', html:"Export"}
95 ]} 97 ]}
96 ]} 98 ]}
97 ]} 99 ]}
98 ]} 100 ]}
99 ]}, 101 ]},
100 {tag:'div', cls:'footer'} 102 {tag:'div', cls:'footer'}
101 ]); 103 ]);
102 104
103 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 105 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
106 MochiKit.Signal.connect(this.getId('offlineCopyDownloadLink'), 'onclick', this, 'downloadOfflineCopy');
104 }, 107 },
105 108
109 'downloadOfflineCopy': function (anEvent) {
110 anEvent.preventDefault();
111 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy', anEvent.src());
112 },
113
106 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
107 __syntaxFix__: "syntax fix" 115 __syntaxFix__: "syntax fix"
108}); 116});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
index 5d082b5..26506e7 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
@@ -21,132 +21,136 @@ refer to http://www.clipperz.com.
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.LoginProgress = function(args) { 28Clipperz.PM.UI.Web.Components.LoginProgress = function(args) {
29 args = args || {}; 29 args = args || {};
30 30
31 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments);
32 32
33 this._deferred = null; 33 this._deferred = null;
34 34
35 return this; 35 return this;
36} 36}
37 37
38//============================================================================= 38//=============================================================================
39 39
40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, {
41 41
42 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
43 43
44 'toString': function () { 44 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.LoginProgress component"; 45 return "Clipperz.PM.UI.Web.Components.LoginProgress component";
46 }, 46 },
47 47
48 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
49 49
50 'deferred': function() { 50 'deferred': function() {
51 return this._deferred; 51 return this._deferred;
52 }, 52 },
53 53
54 'setDeferred': function(aValue) { 54 'setDeferred': function(aValue) {
55 this._deferred = aValue; 55 this._deferred = aValue;
56 }, 56 },
57 57
58 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
59 59
60 'renderSelf': function() { 60 'renderSelf': function() {
61 // var loginProgressElement; 61 // var loginProgressElement;
62 // 62 //
63 // loginProgressElement = MochiKit.DOM.getElement('loginProgress'); 63 // loginProgressElement = MochiKit.DOM.getElement('loginProgress');
64 // 64 //
65 // if (loginProgressElement == null) { 65 // if (loginProgressElement == null) {
66 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true); 66 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true);
67 // } 67 // }
68 68
69//console.log(">> LoginProgress.renderSelf", this.element()); 69//console.log(">> LoginProgress.renderSelf", this.element());
70 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [ 70 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [
71 // this.append(loginProgressElement, [ 71 // this.append(loginProgressElement, [
72 {tag:'div', cls:'header', children:[ 72 {tag:'div', cls:'header', children:[
73 {tag:'h3', id:this.getId('title'), html:"login progress"} 73 {tag:'h3', id:this.getId('title'), html:"login progress"}
74 ]}, 74 ]},
75 {tag:'div', cls:'body', children:[ 75 {tag:'div', cls:'body', children:[
76 {tag:'div', id:this.getId('progressBar')}, 76 {tag:'div', id:this.getId('progressBar')},
77 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[ 77 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[
78 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]}, 78 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]},
79 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]}, 79 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]},
80 {tag:'p', html:"Login failed"} 80 {tag:'p', html:"Login failed"}
81 ]} 81 ]}
82 ]}, 82 ]},
83 {tag:'div', cls:'footer', children:[ 83 {tag:'div', cls:'footer', children:[
84 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[ 84 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[
85 {tag:'div', cls:'button', id:this.getId('button'), children:[ 85 // {tag:'div', cls:'button', id:this.getId('button'), children:[
86 {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"} 86 // {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"}
87 ]} 87 // ]}
88 {tag:'a', cls:'button', id:this.getId('button'), html:"cancel"}
88 ]} 89 ]}
89 ]} 90 ]}
90 ]}); 91 ]});
91 // ]); 92 // ]);
92 93
93 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff"); 94 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff");
94 95
95 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 96 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
96 MochiKit.Style.hideElement(this.getElement('errorBox')); 97 MochiKit.Style.hideElement(this.getElement('errorBox'));
97 98
98 MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler'); 99 // MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler');
100 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'cancelEventHandler');
99 }, 101 },
100 102
101 //------------------------------------------------------------------------- 103 //-------------------------------------------------------------------------
102 104
103 'displayElement': function() { 105 'displayElement': function() {
104 return MochiKit.DOM.getElement('loginProgress'); 106 return MochiKit.DOM.getElement('loginProgress');
105 }, 107 },
106 108
107 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
108 110
109 'cancelEventHandler': function(anEvent) { 111 'cancelEventHandler': function(anEvent) {
110 anEvent.preventDefault(); 112 anEvent.preventDefault();
111 113
112 MochiKit.Signal.signal(this, 'cancelEvent'); 114 MochiKit.Signal.signal(this, 'cancelEvent');
113 }, 115 },
114 116
115 //------------------------------------------------------------------------- 117 //-------------------------------------------------------------------------
116 118
117 'disableCancel': function() { 119 'disableCancel': function() {
118 MochiKit.Style.hideElement(this.getElement('buttonArea')); 120 MochiKit.Style.hideElement(this.getElement('buttonArea'));
119 }, 121 },
120 122
121 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
122 124
123 'showErrorMessage': function() { 125 'showErrorMessage': function() {
124 this.getElement('buttonLink').innerHTML = "close"; 126 // this.getElement('buttonLink').innerHTML = "close";
127 this.getElement('button').innerHTML = "close";
128 MochiKit.DOM.addElementClass(this.getElement('button'), 'default');
125 129
126 MochiKit.Style.hideElement(this.getElement('progressBar')); 130 MochiKit.Style.hideElement(this.getElement('progressBar'));
127 131
128 this.getElement('title').innerHTML = "Error"; 132 this.getElement('title').innerHTML = "Error";
129 MochiKit.Style.showElement(this.getElement('errorBox')); 133 MochiKit.Style.showElement(this.getElement('errorBox'));
130 MochiKit.Style.showElement(this.getElement('buttonArea')); 134 MochiKit.Style.showElement(this.getElement('buttonArea'));
131 }, 135 },
132 136
133 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
134 138
135 'deferredHideModalAndRemove': function(someParameters, aResult) { 139 'deferredHideModalAndRemove': function(someParameters, aResult) {
136 vardeferredResult; 140 vardeferredResult;
137 141
138 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false}); 142 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false});
139 deferredResult.addMethod(this, 'deferredHideModal'); 143 deferredResult.addMethod(this, 'deferredHideModal');
140 deferredResult.addMethod(this, 'remove'); 144 deferredResult.addMethod(this, 'remove');
141 deferredResult.addCallback(function () { 145 deferredResult.addCallback(function () {
142 return aResult; 146 return aResult;
143 }); 147 });
144 deferredResult.callback(someParameters); 148 deferredResult.callback(someParameters);
145 149
146 return deferredResult; 150 return deferredResult;
147 }, 151 },
148 152
149 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
150 154
151 __syntaxFix__: "syntax fix" 155 __syntaxFix__: "syntax fix"
152}); 156});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
index 3ee6189..0fa369f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
@@ -21,90 +21,90 @@ refer to http://www.clipperz.com.
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.ToolsPanel = function(args) { 28Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) {
29 args = args || {}; 29 args = args || {};
30 30
31 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments);
32 32
33 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR'; 33 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR';
34 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
35 'PASSWORD_GENERATOR': { 35 'PASSWORD_GENERATOR': {
36 tab:'passwordGeneratorTab', 36 tab:'passwordGeneratorTab',
37 panel:'passwordGeneratorPanel' 37 panel:'passwordGeneratorPanel'
38 }, 38 },
39 'BOOKMARKLET': { 39 'BOOKMARKLET': {
40 tab:'bookmarkletTab', 40 tab:'bookmarkletTab',
41 panel:'bookmarkletPanel' 41 panel:'bookmarkletPanel'
42 }, 42 },
43 'COMPACT_EDITION': { 43 'COMPACT_EDITION': {
44 tab:'compactEditionTab', 44 tab:'compactEditionTab',
45 panel:'compactEditionPanel' 45 panel:'compactEditionPanel'
46 }, 46 },
47 'HTTP_AUTH': { 47 'HTTP_AUTH': {
48 tab:'httpAuthTab', 48 tab:'httpAuthTab',
49 panel:'httpAuthPanel' 49 panel:'httpAuthPanel'
50 } 50 }
51 }; 51 };
52 52
53 return this; 53 return this;
54} 54}
55 55
56//============================================================================= 56//=============================================================================
57 57
58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
59 59
60 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
61 61
62 'toString': function () { 62 'toString': function () {
63 return "Clipperz.PM.UI.Web.Components.ToolsPanel component"; 63 return "Clipperz.PM.UI.Web.Components.ToolsPanel component";
64 }, 64 },
65 65
66 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
67 67
68 'renderSelf': function(/*aContainer, aPosition*/) { 68 'renderSelf': function(/*aContainer, aPosition*/) {
69 this.append(this.element(), [ 69 this.append(this.element(), [
70 {tag:'div', cls:'header', children:[ 70 {tag:'div', cls:'header', children:[
71 {tag:'div', cls:'subPanelTabs', children:[ 71 {tag:'div', cls:'subPanelTabs', children:[
72 {tag:'ul', children:[ 72 {tag:'ul', children:[
73 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'}, 73 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'},
74 {tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]}, 74 {tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]},
75 {tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]}, 75 {tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]},
76 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]} 76 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]}
77 ]} 77 ]}
78 ]} 78 ]}
79 ]}, 79 ]},
80 {tag:'div', cls:'body', children:[ 80 {tag:'div', cls:'body', children:[
81 {tag:'div', cls:'accountPanel', children:[ 81 {tag:'div', cls:'accountPanel', children:[
82 {tag:'div', cls:'subPanelContent', children:[ 82 {tag:'div', cls:'subPanelContent', children:[
83 {tag:'ul', children:[ 83 {tag:'ul', children:[
84 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[ 84 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[
85 {tag:'h3', html:"Password generator"} 85 // {tag:'h3', html:"Password generator"}
86 ]}, 86 ]},
87 {tag:'li', id:this.getId('bookmarkletPanel'),children:[ 87 {tag:'li', id:this.getId('bookmarkletPanel'),children:[
88 {tag:'h3', html:"Bookmarklet"} 88 // {tag:'h3', html:"Bookmarklet"}
89 ]}, 89 ]},
90 {tag:'li', id:this.getId('compactEditionPanel'), children:[ 90 {tag:'li', id:this.getId('compactEditionPanel'), children:[
91 {tag:'h3', html:"Compact edition"} 91 // {tag:'h3', html:"Compact edition"}
92 ]}, 92 ]},
93 {tag:'li', id:this.getId('httpAuthPanel'), children:[ 93 {tag:'li', id:this.getId('httpAuthPanel'), children:[
94 {tag:'h3', html:"HTTP Auth"} 94 // {tag:'h3', html:"HTTP Auth"}
95 ]} 95 ]}
96 ]} 96 ]}
97 ]} 97 ]}
98 ]} 98 ]}
99 ]}, 99 ]},
100 {tag:'div', cls:'footer'} 100 {tag:'div', cls:'footer'}
101 ]); 101 ]);
102 102
103 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 103 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
104 }, 104 },
105 105
106 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
107 107
108 108
109 __syntaxFix__: "syntax fix" 109 __syntaxFix__: "syntax fix"
110}); 110});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
index 9a0e744..1ab2e69 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
@@ -170,157 +170,182 @@ MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
170 170
171 return this._cardsController; 171 return this._cardsController;
172 }, 172 },
173 173
174 //----------------------------------------------------------------------------- 174 //-----------------------------------------------------------------------------
175/* 175/*
176 'directLoginsController': function() { 176 'directLoginsController': function() {
177//Clipperz.log(">>> AppController.directLoginsController"); 177//Clipperz.log(">>> AppController.directLoginsController");
178 if (this._directLoginsController == null) { 178 if (this._directLoginsController == null) {
179 this._directLoginsController = new Clipperz.PM.UI.Web.Controllers.DirectLoginsController({'filterController':this._filterController}); 179 this._directLoginsController = new Clipperz.PM.UI.Web.Controllers.DirectLoginsController({'filterController':this._filterController});
180 } 180 }
181//Clipperz.log("<<< AppController.directLoginsController"); 181//Clipperz.log("<<< AppController.directLoginsController");
182 182
183 return this._directLoginsController; 183 return this._directLoginsController;
184 }, 184 },
185*/ 185*/
186 //----------------------------------------------------------------------------- 186 //-----------------------------------------------------------------------------
187 187
188 'populateUserInfo': function() { 188 'populateUserInfo': function() {
189 var deferredResult; 189 var deferredResult;
190 190
191 deferredResult = new Clipperz.Async.Deferred("AppController.populateUserInfo", {trace:false}); 191 deferredResult = new Clipperz.Async.Deferred("AppController.populateUserInfo", {trace:false});
192 deferredResult.collectResults({ 192 deferredResult.collectResults({
193 'username':MochiKit.Base.methodcaller('displayName'), 193 'username':MochiKit.Base.methodcaller('displayName'),
194 'cardsNumber':[ 194 'cardsNumber':[
195 MochiKit.Base.methodcaller('getRecords'), 195 MochiKit.Base.methodcaller('getRecords'),
196 function (someResults) { return someResults.length; } 196 function (someResults) { return someResults.length; }
197 ], 197 ],
198 'directLoginsNumber': [ 198 'directLoginsNumber': [
199 MochiKit.Base.methodcaller('getDirectLogins'), 199 MochiKit.Base.methodcaller('getDirectLogins'),
200 function (someResults) { return someResults.length; } 200 function (someResults) { return someResults.length; }
201 ] 201 ]
202 }) 202 })
203 deferredResult.addMethod(this.userInfoBox(), 'updateUserDetails'); 203 deferredResult.addMethod(this.userInfoBox(), 'updateUserDetails');
204 deferredResult.callback(this.user()); 204 deferredResult.callback(this.user());
205 205
206 return deferredResult; 206 return deferredResult;
207 }, 207 },
208 208
209 //----------------------------------------------------------------------------- 209 //-----------------------------------------------------------------------------
210 210
211 'run': function(args) { 211 'run': function(args) {
212 var deferredResult; 212 var deferredResult;
213 varslot; 213 varslot;
214 varpage; 214 varpage;
215 var user; 215 var user;
216 216
217 slot = args.slot; 217 slot = args.slot;
218 user = args.user; 218 user = args.user;
219 219
220 this.setUser(user); 220 this.setUser(user);
221 221
222 slot.setContent(this.appPage()); 222 slot.setContent(this.appPage());
223 223
224 this.appPage().slotNamed('userInfoBox').setContent(this.userInfoBox()); 224 this.appPage().slotNamed('userInfoBox').setContent(this.userInfoBox());
225 this.appPage().slotNamed('tabSidePanel').setContent(this.tabSidePanel()); 225 this.appPage().slotNamed('tabSidePanel').setContent(this.tabSidePanel());
226 226
227 this.appPage().slotNamed('accountPanel').setContent(this.accountPanel()); 227 this.appPage().slotNamed('accountPanel').setContent(this.accountPanel());
228 this.appPage().slotNamed('dataPanel').setContent(this.dataPanel()); 228 this.appPage().slotNamed('dataPanel').setContent(this.dataPanel());
229 this.appPage().slotNamed('toolsPanel').setContent(this.toolsPanel()); 229 this.appPage().slotNamed('toolsPanel').setContent(this.toolsPanel());
230 230
231 this.hideAllAppPageTabSlots(); 231 this.hideAllAppPageTabSlots();
232 this.appPage().showSlot(this.slotNameForTab('cards')); 232 this.appPage().showSlot(this.slotNameForTab('cards'));
233 233
234 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected',this, 'handleTabSelected'); 234 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected', this, 'handleTabSelected');
235 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard'); 235 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard');
236 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard'); 236 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard');
237
238 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy',this, 'handleDownloadOfflineCopy');
237 239
238 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false}); 240 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false});
239 241
240 deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user}); 242 deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user});
241 // deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user}); 243 // deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user});
242 deferredResult.addMethod(this, 'populateUserInfo'); 244 deferredResult.addMethod(this, 'populateUserInfo');
243 245
244 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0}); 246 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0});
245 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN'); 247 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN');
246 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards'); 248 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards');
247 deferredResult.callback(); 249 deferredResult.callback();
248 }, 250 },
249 251
250 //----------------------------------------------------------------------------- 252 //-----------------------------------------------------------------------------
251 253
252 'handleTabSelected': function (selectedTabName) { 254 'handleTabSelected': function (selectedTabName) {
253 var aTabName; 255 var aTabName;
254 var aSlotName; 256 var aSlotName;
255 257
256//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName); 258//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName);
257 this.hideAllAppPageTabSlots(); 259 this.hideAllAppPageTabSlots();
258 this.appPage().showSlot(this.slotNameForTab(selectedTabName)); 260 this.appPage().showSlot(this.slotNameForTab(selectedTabName));
259 261
260 switch (selectedTabName) { 262 switch (selectedTabName) {
261 case 'cards': 263 case 'cards':
262 this.cardsController().focus(); 264 this.cardsController().focus();
263 break; 265 break;
264 // case 'directLogins': 266 // case 'directLogins':
265 // this.directLoginsController().focus(); 267 // this.directLoginsController().focus();
266 // break; 268 // break;
267 case 'data': 269 case 'data':
268 break; 270 break;
269 case 'account': 271 case 'account':
270 break; 272 break;
271 case 'tools': 273 case 'tools':
272 break; 274 break;
273 } 275 }
274//Clipperz.log("<-- AppController.handleTabSelected", aTabName); 276//Clipperz.log("<-- AppController.handleTabSelected", aTabName);
275 }, 277 },
276 278
277 //============================================================================= 279 //=============================================================================
278 280
279 'handleAddCard': function (aSourceElement) { 281 'handleAddCard': function (aSourceElement) {
280//Clipperz.log("=== AppController.addCard", aSourceElement); 282//Clipperz.log("=== AppController.addCard", aSourceElement);
281 this.cardsController().addCard(aSourceElement); 283 this.cardsController().addCard(aSourceElement);
282 }, 284 },
283 285
284 //============================================================================= 286 //=============================================================================
285 287
286 'userDataSuccessfullySavedHandler': function (anEvent) { 288 'userDataSuccessfullySavedHandler': function (anEvent) {
287 this.populateUserInfo(); 289 this.populateUserInfo();
288 }, 290 },
289 291
290 //============================================================================= 292 //=============================================================================
291 293
292 'handleLogout': function(anEvent) { 294 'handleLogout': function(anEvent) {
293 var deferredResult; 295 var deferredResult;
294 296
295 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false}); 297 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false});
296 deferredResult.addMethod(this.user(), 'logout'); 298 deferredResult.addMethod(this.user(), 'logout');
297 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout'); 299 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout');
298 deferredResult.callback(); 300 deferredResult.callback();
299 301
300 return deferredResult; 302 return deferredResult;
301 }, 303 },
302 304
303 //----------------------------------------------------------------------------- 305 //-----------------------------------------------------------------------------
304 306
305 'handleLock': function (anEvent) { 307 'handleLock': function (anEvent) {
306 return Clipperz.Async.callbacks("AppController.handleLock", [ 308 return Clipperz.Async.callbacks("AppController.handleLock", [
307 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'), 309 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'),
308 MochiKit.Base.method(this.user(), 'lock') 310 MochiKit.Base.method(this.user(), 'lock')
309 ], {trace:false}); 311 ], {trace:false});
310 }, 312 },
311 313
312 //............................................................................. 314 //.............................................................................
313 315
314 'handleUnlock': function (anEvent) { 316 'handleUnlock': function (anEvent) {
315 return Clipperz.Async.callbacks("AppController.handleUnock", [ 317 return Clipperz.Async.callbacks("AppController.handleUnock", [
316 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'), 318 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'),
317 MochiKit.Base.method(this.user(), 'login'), 319 MochiKit.Base.method(this.user(), 'login'),
318 MochiKit.Base.method(this.cardsController(), 'focus'), 320 MochiKit.Base.method(this.cardsController(), 'focus'),
319 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'), 321 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'),
320 MochiKit.Base.method(this.userInfoBox(), 'unlock') 322 MochiKit.Base.method(this.userInfoBox(), 'unlock')
321 ], {trace:false}); 323 ], {trace:false});
322 }, 324 },
323 325
326 'handleDownloadOfflineCopy': function (anEvent) {
327console.log("AppController.handleDownloadOfflineCopy");
328 var downloadHref;
329
330 downloadHref = window.location.href.replace(/\/[^\/]*$/,'') + Clipperz_dumpUrl;
331
332 if (Clipperz_IEisBroken == true) {
333 window.open(downloadHref, "");
334 } else {
335 vardeferredResult;
336 var newWindow;
337
338 newWindow = window.open("", "");
339
340 deferredResult = new Clipperz.Async.Deferred("AppController.handleDownloadOfflineCopy", {trace:true});
341 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'echo', {'echo':"echo"});
342 deferredResult.addCallback(function(aWindow) {
343 aWindow.location.href = downloadHref;
344 }, newWindow);
345 deferredResult.callback();
346 }
347 },
348
324 //============================================================================= 349 //=============================================================================
325 __syntaxFix__: "syntax fix" 350 __syntaxFix__: "syntax fix"
326}); 351});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js
deleted file mode 100644
index 5380aa1..0000000
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js
+++ b/dev/null
@@ -1,163 +0,0 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
27
28Clipperz.PM.UI.iPhone.Components.CardDetail = function(args) {
29 args = args || {};
30
31 Clipperz.PM.UI.iPhone.Components.CardDetail.superclass.constructor.apply(this, arguments);
32
33 this._cardReference = null;
34
35 return this;
36}
37
38//=============================================================================
39
40Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardDetail, Clipperz.PM.UI.Common.Components.BaseComponent, {
41
42 //-------------------------------------------------------------------------
43
44 'toString': function () {
45 return "Clipperz.PM.UI.iPhone.Components.CardDetail component";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'cardReference': function () {
51 return this._cardReference;
52 },
53
54 'setCardReference': function (aValue) {
55 this._cardReference = aValue;
56 },
57
58 //-------------------------------------------------------------------------
59
60 'renderSelf': function(/*aContainer, aPosition*/) {
61 this.append(this.element(), [
62 {tag:'div', cls:'cardDetail', id:this.getId('cardDetail'), children:[
63 {tag:'div', id:this.getId('progressBar')} //,
64 // {tag:'h1', cls:'loading', html:"loading"}
65 ]}
66 ]);
67
68 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
69 MochiKit.Signal.signal(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', 0);
70 },
71
72 //=========================================================================
73
74 'showCardDetails': function (someData) {
75 this.element().innerHTML = '';
76 this.append(this.element(), [
77 {tag:'fieldset', id:this.getId('fields'), children:MochiKit.Base.map(function (aFieldData) {
78 return {tag:'div', cls:'row', children:[
79 {tag:'label', html:aFieldData['label']},
80 // {tag:'span', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), html:aFieldData['value']}
81 {tag:'div', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), children:[
82 {tag:'div', children:[{tag:'p', html:aFieldData['value']}]}
83 ]}
84 // {tag:'input', type:'text', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), value:aFieldData['value'], disabled:true}
85
86 ]}
87 }, someData['fields'])}
88 ]);
89
90 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.element(), ['span.password']), MochiKit.Base.bind(function (aPasswordElement) {
91 MochiKit.Signal.connect(aPasswordElement, 'onclick', function (anEvent) { alert(MochiKit.DOM.scrapeText(anEvent.src())); })
92 }, this));
93
94 if (someData['directLogins'].length > 0) {
95 this.append(this.element(), [
96 {tag:'h2', html:"Direct logins"},
97 {tag:'fieldset', id:this.getId('directLogins'), children:MochiKit.Base.map(function (aDirectLoginData) {
98 return {tag:'div', cls:'row', id:('directLogin_' + aDirectLoginData['_reference']), children:[
99 {tag:'img', cls:'favicon', src:aDirectLoginData['favicon']},
100 // {tag:'input', cls:'directLogin', disabled:'disabled', type:'text', name:aDirectLoginData['label'], value:aDirectLoginData['label']}
101 {tag:'span', cls:'directLogin', html:aDirectLoginData['label']}
102 ]}
103 }, someData['directLogins'])}
104 ]);
105
106 MochiKit.Base.map(MochiKit.Base.bind(function (aRowNode) {
107 MochiKit.Signal.connect(aRowNode, 'onclick', this, 'directLoginClickHandler');
108 }, this),
109 MochiKit.Selector.findChildElements(this.getElement('directLogins'), ['div.row'])
110 )
111 };
112
113 if (someData['notes'] != '') {
114 this.append(this.element(), [
115 {tag:'h2', html:"Notes"},
116 {tag:'fieldset', id:this.getId('fieldset'), children:[
117 {tag:'div', cls:'row notes', children:[
118 {tag:'span', html:someData['notes']}
119 ]}
120 ]}
121 ]);
122 };
123
124 return true;
125 },
126
127 //-------------------------------------------------------------------------
128/*
129 'toggleClickHandler': function (anEvent) {
130 varnextState;
131 varfieldValue;
132
133//console.log("TOGGLE");
134 anEvent.preventDefault;
135 fieldValue = MochiKit.Selector.findChildElements(anEvent.src().parentNode.parentNode, ['span.password'])[0];
136
137 nextState = (MochiKit.DOM.getNodeAttribute(anEvent.src(), 'toggled') != 'true');
138 if (nextState) {
139 MochiKit.DOM.removeElementClass(fieldValue, 'clear');
140 } else {
141 MochiKit.DOM.addElementClass(fieldValue, 'clear');
142 }
143
144 MochiKit.DOM.setNodeAttribute(anEvent.src(), 'toggled', nextState);
145 },
146*/
147 //=========================================================================
148
149 'directLoginClickHandler': function (anEvent) {
150 anEvent.preventDefault();
151
152 if (/(directLogin_)/.test(anEvent.src().id)) {
153 var directLoginReference;
154
155 directLoginReference = anEvent.src().id.match(/(directLogin_)(.*)/)[2];
156 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', {cardReference:this.cardReference(), directLoginReference:directLoginReference});
157 }
158 },
159
160 //=========================================================================
161
162 __syntaxFix__: "syntax fix"
163});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js
deleted file mode 100644
index 5341878..0000000
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js
+++ b/dev/null
@@ -1,178 +0,0 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
27
28Clipperz.PM.UI.iPhone.Components.LoginForm = function(args) {
29 args = args || {};
30
31 Clipperz.PM.UI.iPhone.Components.LoginForm.superclass.constructor.apply(this, arguments);
32
33 return this;
34}
35
36//=============================================================================
37
38Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
39
40 //-------------------------------------------------------------------------
41
42 'toString': function () {
43 return "Clipperz.PM.UI.iPhone.Components.LoginForm component";
44 },
45
46 //-------------------------------------------------------------------------
47
48 'focusOnUsername': function () {
49 this.getElement('username').focus();
50 },
51
52 //-------------------------------------------------------------------------
53
54 'username': function () {
55 return this.getElement('username').value;
56 },
57
58 'passphrase': function () {
59 return this.getElement('passphrase').value;
60 },
61
62 //-------------------------------------------------------------------------
63
64 'renderSelf': function(/*aContainer, aPosition*/) {
65 this.append(this.element(), [
66 {tag:'div', cls:'toolbar iPhoneClipperzToolbar', children:[
67 {tag:'h1', id:'pageTitle', html:'Clipperz'},
68 {tag:'a', id:'backButton', cls:'button', href:'#', html:"back"}
69 ]},
70 {tag:'form', title:'Theaters', cls:'panel toolbarlessPanel loginForm', id:this.getId('loginFormPanel'), children:[
71 {tag:'fieldset', id:this.getId('fieldset'), children:[
72 {tag:'div', cls:'row', children:[
73 {tag:'label', html:"username"},
74 {tag:'input', type:'text', name:'username', value:"", autocorrect:'off', autocapitalize:'off', id:this.getId('username')}
75 ]},
76 {tag:'div', cls:'row', children:[
77 {tag:'label', html:"passphrase"},
78 {tag:'input', type:'password', name:'passphrase', value:"", id:this.getId('passphrase')}
79 ]}
80 ]},
81 {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Login", id:this.getId('submit')}
82 ]},
83 {tag:'div', cls:'panel toolbarlessPanel loginProgressPanel', id:this.getId('loginProgressPanel'), children:[
84 {tag:'div', id:this.getId('progressBar')} //,
85 // {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Cancel", id:this.getId('cancel')}
86 ]},
87 {tag:'div', cls:'panel loginErrorPanel', id:this.getId('loginErrorPanel'), children:[
88 {tag:'div', cls:'errorMessage', id:this.getId('errorMessageBox'), children:[
89 {tag:'h2', id:this.getId('errorMessage'), html:"Login failed"}
90 ]}
91 ]}
92 ]);
93
94 MochiKit.Signal.connect(this.getElement('submit'), 'onclick',this, 'submitHandler');
95 MochiKit.Signal.connect(this.getElement('loginFormPanel'), 'onsubmit',this, 'submitHandler');
96
97 // MochiKit.Signal.connect(this.getElement('cancel'), 'onclick',this, 'cancelHandler');
98 MochiKit.Signal.connect('backButton', 'onclick',this, 'backHandler');
99
100 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
101
102 // MochiKit.Style.hideElement(this.getElement('errorMessage'));
103
104 this.showLoginForm();
105 // MochiKit.Async.callLater(0.2, MochiKit.Base.method(this, 'focusOnUsername'));
106 },
107
108 //-------------------------------------------------------------------------
109
110 'showLoginForm': function () {
111 MochiKit.Style.showElement(this.getElement('loginFormPanel'));
112 MochiKit.Style.hideElement(this.getElement('loginProgressPanel'));
113 MochiKit.Style.hideElement(this.getElement('loginErrorPanel'));
114 MochiKit.Style.hideElement('backButton');
115 },
116
117 'slideInLoginForm': function () {
118 varoffset;
119
120 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
121
122 MochiKit.Style.showElement(this.getElement('loginFormPanel'));
123 MochiKit.Style.setElementPosition(this.getElement('loginFormPanel'), {x:-offset, y:0});
124
125 new MochiKit.Visual.Sequence([
126 new MochiKit.Visual.Parallel([
127 new MochiKit.Visual.Move(this.getElement('loginErrorPanel'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
128 new MochiKit.Visual.Move(this.getElement('loginFormPanel'), {x:0, y:0, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}),
129 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
130 ], {duration:0.5, sync:true}),
131 MochiKit.Visual.fade(this.getElement('loginErrorPanel'), {duration:0, sync:true})
132 ], {})
133 },
134
135 'showLoginProgress': function () {
136 MochiKit.Style.hideElement(this.getElement('loginFormPanel'));
137 MochiKit.Style.showElement(this.getElement('loginProgressPanel'));
138 },
139
140 'showLoginError': function (anError) {
141 this.getElement('errorMessage').innerHTML = "Login error";
142
143 MochiKit.Style.showElement('backButton');
144 MochiKit.Style.hideElement(this.getElement('loginProgressPanel'));
145 MochiKit.Style.showElement(this.getElement('loginErrorPanel'));
146 MochiKit.Style.setElementPosition(this.getElement('loginErrorPanel'), {x:0, y:45});
147 },
148
149 //-------------------------------------------------------------------------
150/*
151 'disableCancelButton': function () {
152 MochiKit.DOM.hideElement(this.getElement('cancel'));
153 },
154*/
155 //-------------------------------------------------------------------------
156
157 'submitHandler': function (anEvent) {
158 anEvent.preventDefault();
159
160 MochiKit.Signal.signal(this, 'doLogin', {'username':this.username(), 'passphrase':this.passphrase()});
161 },
162
163 'cancelHandler': function (anEvent) {
164 anEvent.preventDefault();
165
166//console.log("CANCEL");
167 },
168
169 'backHandler': function (anEvent) {
170 anEvent.preventDefault();
171
172 this.slideInLoginForm();
173 },
174
175 //-------------------------------------------------------------------------
176
177 __syntaxFix__: "syntax fix"
178});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js
deleted file mode 100644
index 3fcaae1..0000000
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js
+++ b/dev/null
@@ -1,369 +0,0 @@
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
26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Controllers');
27
28 //Some parts of this controller have been derived from the iUI library.
29
30Clipperz.PM.UI.iPhone.Controllers.MainController = function() {
31 this._loginForm = null;
32 this._cardList = null;
33 this._cachedValues =null;
34 this._user = null;
35
36 if (typeof window.onorientationchange == 'object') {
37 MochiKit.Signal.connect(window, 'onorientationchange', this, 'orientationChangeHandler');
38 MochiKit.Async.callLater(0, MochiKit.Base.method(this, 'orientationChangeHandler'));
39 } else {
40 this.setOrientation('portrait');
41 // this.setOrientation('landscape');
42 }
43
44 this.addMetaTag('viewport', 'width=devicewidth; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;');
45 this.addMetaTag('apple-mobile-web-app-capable', 'yes');
46 this.addMetaTag('apple-mobile-web-app-status-bar-style', 'black');
47
48 this.addLinkTag('apple-touch-icon', 'data:image/png;charset=utf-8;base64,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');
49 //this.addLinkTag('apple-touch-startup-image', 'default.png');
50
51 // if (!window.navigator.standalone)// not running as an installed app
52
53 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', this, 'selectedDirectLoginHandler');
54
55 MochiKit.DOM.addElementClass(document.body, 'iPhone');
56 return this;
57}
58
59MochiKit.Base.update(Clipperz.PM.UI.iPhone.Controllers.MainController.prototype, {
60
61 'toString': function () {
62 return "Clipperz.PM.UI.iPhone.Controllers.MainController";
63 },
64
65 //=========================================================================
66
67 'user': function () {
68 return this._user;
69 },
70
71 'setUser': function (aValue) {
72 this._user = aValue;
73 },
74
75 //=========================================================================
76
77 'loginForm': function() {
78 if (this._loginForm == null) {
79 MochiKit.DOM.removeElement('mainDiv');
80 this._loginForm = new Clipperz.PM.UI.iPhone.Components.LoginForm({element:MochiKit.DOM.currentDocument().body});
81 MochiKit.Signal.connect(this._loginForm, 'doLogin', this, 'doLoginHandler')
82 }
83
84 return this._loginForm;
85 },
86
87 'removeLoginForm': function () {
88 if (this._loginForm != null) {
89 this._loginForm.remove();
90 this._loginForm = null;
91 }
92 },
93
94 //-----------------------------------------------------------------------------
95
96 'cardList': function () {
97 if (this._cardList == null) {
98 this._cardList = new Clipperz.PM.UI.iPhone.Components.CardList({element:MochiKit.DOM.currentDocument().body});
99 MochiKit.Signal.connect(this._cardList, 'searchEvent',this, 'searchEventHandler')
100 MochiKit.Signal.connect(this._cardList, 'selectedCard',this, 'selecetedCardHandler')
101 }
102
103 return this._cardList;
104 },
105
106 //=========================================================================
107
108 'currentWidth': function () {
109 return this._currentWidth;
110 },
111
112 'setCurrentWidth': function (aValue) {
113 this._currentWidth = aValue;
114 },
115
116 //=========================================================================
117
118 'orientationChangeHandler': function () {
119 switch(window.orientation) {
120 case 0:
121 this.setOrientation('portrait');
122 break;
123 case 90:
124 case -90:
125 this.setOrientation('landscape');
126 break;
127 }
128 },
129
130 //-------------------------------------------------------------------------
131
132 'setOrientation': function (anOrientation) {
133 document.body.setAttribute('orientation', anOrientation);
134 setTimeout(scrollTo, 100, 0, 1);
135 },
136
137 //-------------------------------------------------------------------------
138
139 'slidePages': function (fromPage, toPage, backwards) {
140 var axis;
141 var slideDone;
142
143 slideDone = function () {
144 // console.log("slideDone");
145 if (!hasClass(toPage, "dialog")) {
146 fromPage.removeAttribute("selected");
147 }
148 checkTimer = setInterval(checkOrientAndLocation, 300);
149 setTimeout(updatePage, 0, toPage, fromPage);
150 fromPage.removeEventListener('webkitTransitionEnd', slideDone, false);
151 }
152
153 axis = (backwards ? fromPage : toPage).getAttribute("axis");
154
155 clearInterval(checkTimer);
156
157 if (canDoSlideAnim() && axis != 'y') {
158 slide2(fromPage, toPage, backwards, slideDone);
159 } else {
160 slide1(fromPage, toPage, backwards, axis, slideDone);
161 }
162 },
163
164 //-------------------------------------------------------------------------
165
166 'getCachedValues': function () {
167 var deferredResult;
168
169 if (this._cachedObjects != null) {
170 deferredResult = MochiKit.Async.succeed(this._cachedObjects);
171 } else {
172 deferredResult = new Clipperz.Async.Deferred("MainController.getCachedValues", {trace:false});
173 deferredResult.addMethod(this.user(), 'getRecords');
174 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.getCachedValues - collectResults", {
175 '_rowObject': MochiKit.Async.succeed,
176 '_reference': MochiKit.Base.methodcaller('reference'),
177 'label': MochiKit.Base.methodcaller('label'),
178 'favicon': MochiKit.Base.methodcaller('favicon'),
179 '_searchableContent':MochiKit.Base.methodcaller('searchableContent')
180 }, {trace:false}));
181 deferredResult.addCallback(Clipperz.Async.collectAll);
182 deferredResult.addCallback(MochiKit.Base.bind(function (someRows) {
183 this._cachedObjects = someRows;
184 return this._cachedObjects;
185 }, this));
186 deferredResult.callback();
187 }
188
189 return deferredResult;
190 },
191 //=========================================================================
192
193 'run': function(shouldShowRegistrationForm) {
194 this.loginForm().render();
195 MochiKit.Async.callLater(1, MochiKit.Base.method(this.loginForm(), 'focusOnUsername'));
196 },
197
198 //=========================================================================
199
200 'doLoginHandler': function (someArgs) {
201 var deferredResult;
202 varparameters;
203 varshouldUseOTP;
204 // var loginProgress;
205 varuser;
206 var getPassphraseDelegate;
207
208 parameters = someArgs;
209 shouldUseOTP = (typeof(parameters.passphrase) == 'undefined');
210
211 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
212 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':getPassphraseDelegate});
213
214 deferredResult = new Clipperz.Async.Deferred("MainController.doLogin", {trace:false});
215 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
216 deferredResult.addMethod(this.loginForm(), 'showLoginProgress');
217 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
218 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
219 deferredResult.addMethod(user, 'login');
220 deferredResult.addMethod(this, 'setUser', user);
221 deferredResult.addMethod(user, 'getRecords');
222 deferredResult.addMethod(this, 'removeLoginForm');
223 deferredResult.addMethod(this.cardList(), 'render');
224 deferredResult.addMethod(this, 'displaySelectedRecords', '');
225 deferredResult.addErrback(MochiKit.Base.method(this.loginForm(), 'showLoginError'));
226 deferredResult.callback();
227
228 return deferredResult;
229 },
230
231 //=========================================================================
232
233 'searchEventHandler': function (aValue) {
234//console.log("searching for ... " + aValue);
235 return this.displaySelectedRecords(aValue);
236 },
237
238 //=========================================================================
239
240 '_displaySelectedRows': function (aFilter, someRows) {
241 var result;
242
243 result = someRows;
244
245 if (aFilter != null) {
246 var filter;
247 varfilterRegExp;
248
249 filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&");
250 filterRegExp = new RegExp(filter, "i");
251 result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, result);
252 }
253
254
255 result.sort(MochiKit.Base.partial(function (aKey, aComparator, aObject, bObject) {
256 return aComparator(aObject[aKey], bObject[aKey]);
257 }, 'label', Clipperz.Base.caseInsensitiveCompare));
258
259 this.cardList().update(result);
260 },
261
262 //-------------------------------------------------------------------------
263
264 'displaySelectedRecords': function (aFilter) {
265 return Clipperz.Async.callbacks("MainController.displaySelectedrows", [
266 MochiKit.Base.method(this, 'getCachedValues'),
267 MochiKit.Base.method(this, '_displaySelectedRows', aFilter)
268 ], {trace:false});
269 },
270
271 //=========================================================================
272
273 'selecetedCardHandler': function (aRecordReference) {
274 vardeferredResult;
275 varrecordData;
276
277 recordData = {};
278//console.log("Showing detail for card with reference", aRecordReference);
279 deferredResult = new Clipperz.Async.Deferred("MainController.selectedCardHandler", {trace:false});
280 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
281 deferredResult.collectResults({
282 '_reference':MochiKit.Base.methodcaller('reference'),
283 'title': MochiKit.Base.methodcaller('label'),
284 'favicon': MochiKit.Base.methodcaller('favicon')
285 });
286 deferredResult.addCallback(function (someData) {
287 MochiKit.Base.update(recordData, someData);
288 })
289 deferredResult.addMethod(this.cardList(), 'showCard', recordData);
290
291 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
292 deferredResult.addMethodcaller('notes');
293 deferredResult.addCallback(function (someNotes) {
294 recordData['notes'] = someNotes;
295 })
296
297 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
298 deferredResult.addMethodcaller('getCurrentRecordVersion');
299 deferredResult.addMethodcaller('fields');
300 deferredResult.addCallback(MochiKit.Base.values);
301 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - fields", {
302 'label':MochiKit.Base.methodcaller('label'),
303 'value':MochiKit.Base.methodcaller('value'),
304 'isHidden':MochiKit.Base.methodcaller('isHidden')
305 }, {trace:false}));
306 deferredResult.addCallback(Clipperz.Async.collectAll);
307 deferredResult.addCallback(function (someData) {
308 recordData['fields'] = someData;
309 });
310
311 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
312 deferredResult.addMethodcaller('directLogins');
313 deferredResult.addCallback(MochiKit.Base.values);
314 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - directLogins", {
315 'label': MochiKit.Base.methodcaller('label'),
316 'favicon': MochiKit.Base.methodcaller('favicon'),
317 '_reference':MochiKit.Base.methodcaller('reference')
318 }, {trace:false}));
319 deferredResult.addCallback(Clipperz.Async.collectAll);
320 deferredResult.addCallback(function (someData) {
321 recordData['directLogins'] = someData;
322 });
323
324 deferredResult.addMethod(this.cardList(), 'showCardDetails', recordData);
325 deferredResult.callback();
326
327 return deferredResult;
328 },
329
330 //=========================================================================
331
332 'selectedDirectLoginHandler': function (someData) {
333 vardeferredResult;
334
335//console.log("<<< signal - directLogin");
336 deferredResult = new Clipperz.Async.Deferred("MainController.selectedDirectLoginHandler", {trace:false});
337 deferredResult.addMethod(this.user(), 'getRecord', someData['cardReference']);
338 deferredResult.addMethodcaller('directLogins');
339 deferredResult.addCallback(MochiKit.Base.itemgetter(someData['directLoginReference']));
340 // deferredResult.addMethodcaller('runDirectLogin');
341 deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin);
342 deferredResult.callback();
343
344 return deferredResult;
345 },
346
347 //=========================================================================
348
349 'addMetaTag': function (aName, aContent) {
350 varmetaTag;
351
352 metaTag = document.createElement('meta');
353 metaTag.name = aName;
354 metaTag.content = aContent;
355 document.getElementsByTagName('head')[0].appendChild(metaTag);
356 },
357
358 'addLinkTag': function (aRel, anHref) {
359 var linkTag;
360
361 linkTag = document.createElement('link');
362 linkTag.rel = aRel;
363 linkTag.href = anHref;
364 document.getElementsByTagName('head')[0].appendChild(linkTag);
365 },
366
367 //=========================================================================
368 __syntaxFix__: "syntax fix"
369}); \ No newline at end of file
diff --git a/frontend/gamma/js/main_iPhone.js b/frontend/gamma/js/main.mobile.js
index 0644f68..60a32fa 100644
--- a/frontend/gamma/js/main_iPhone.js
+++ b/frontend/gamma/js/main.mobile.js
@@ -1,57 +1,64 @@
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
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 result = new MochiKit.Async.CancelledError(anError); 39 result = new MochiKit.Async.CancelledError(anError);
40 } 40 }
41 41
42 return result; 42 return result;
43} 43}
44 44
45 45
46Clipperz.PM.RunTime = {}; 46Clipperz.PM.RunTime = {};
47 47
48 48
49function run() { 49function run() {
50 MochiKit.DOM.removeElement('javaScriptAlert');
51 Clipperz.PM.Strings.Languages.initSetup(); 50 Clipperz.PM.Strings.Languages.initSetup();
52 51
53 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController(); 52 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Mobile.Controllers.MainController();
54 Clipperz.PM.RunTime.mainController.run(false); 53 Clipperz.PM.RunTime.mainController.run();
55} 54}
56 55
56// if (navigator.standalone == false) {
57 // window.localStorage.setItem('PIN', '1234');
58 // alert("Saved PIN");
59// } else {
60 // alert (window.localStorage.getItem('PIN'));
61// }
62
63
57MochiKit.DOM.addLoadEvent(run); 64MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/properties/creditsAndCopyrights.txt b/frontend/gamma/properties/creditsAndCopyrights.txt
index 598440d..59f0f0a 100644
--- a/frontend/gamma/properties/creditsAndCopyrights.txt
+++ b/frontend/gamma/properties/creditsAndCopyrights.txt
@@ -1,335 +1,343 @@
1@clipperz.license@ 1@clipperz.license@
2 2
3=============================================================================== 3===============================================================================
4 4
5 This application is build using also the following libraries 5 This application is build using also the following libraries
6 6
7# MochiKit (http://www.mochikit.com) 7# MochiKit (http://www.mochikit.com)
8 - repository: @mochikit.repository@ (revision: @mochikit.version@) 8 - repository: @mochikit.repository@ (revision: @mochikit.version@)
9 9
10 * Software licence: http://svn.mochikit.com/mochikit/trunk/licence.txt 10 * Software licence: https://github.com/mochi/mochikit/blob/master/LICENSE.txt
11 11
12 |MochiKit is dual-licensed software. It is available under the terms of the 12 |MochiKit is dual-licensed software. It is available under the terms of the
13 |MIT License, or the Academic Free License version 2.1. The full text of 13 |MIT License, or the Academic Free License version 2.1. The full text of
14 |each license is included below. 14 |each license is included below.
15 | 15 |
16 |The MochiKit.Style.getElementPosition function is adapted from
17 |YAHOO.util.Dom.getXY v0.9.0. which is copyrighted by Yahoo! Inc. and
18 |licensed under the BSD license also reproduced in full below.
19 |
16 |MIT License 20 |MIT License
17 |=========== 21 |===========
18 | 22 |
19 |Copyright (c) 2005 Bob Ippolito. All rights reserved. 23 |Copyright (c) 2005 Bob Ippolito. All rights reserved.
20 | 24 |
21 |Permission is hereby granted, free of charge, to any person obtaining a copy of this 25 |Permission is hereby granted, free of charge, to any person obtaining a copy
22 |software and associated documentation files (the "Software"), to deal in the Software 26 |of this software and associated documentation files (the "Software"), to deal
23 |without restriction, including without limitation the rights to use, copy, modify, 27 |in the Software without restriction, including without limitation the rights
24 |merge, publish, distribute, sublicense, and/or sell copies of the Software, and to 28 |to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
25 |permit persons to whom the Software is furnished to do so, subject to the following 29 |copies of the Software, and to permit persons to whom the Software is furnished
26 |conditions: 30 |to do so, subject to the following conditions:
27 | 31 |
28 |The above copyright notice and this permission notice shall be included in all copies 32 |The above copyright notice and this permission notice shall be included in all
29 |or substantial portions of the Software. 33 |copies or substantial portions of the Software.
30 | 34 |
31 |THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 35 |THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32 |INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 36 |IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
33 |PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 37 |FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
34 |FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 38 |COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
35 |OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 39 |IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
36 |DEALINGS IN THE SOFTWARE. 40 |CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 | 41 |
38 | 42 |
39 |Academic Free License v. 2.1 43 |Academic Free License v. 2.1
40 |============================ 44 |============================
41 | 45 |
42 |Copyright (c) 2005 Bob Ippolito. All rights reserved. 46 |Copyright (c) 2005 Bob Ippolito. All rights reserved.
43 | 47 |
44 |This Academic Free License (the "License") applies to any original work of authorship (the 48 |This Academic Free License (the "License") applies to any original work of
45 |"Original Work") whose owner (the "Licensor") has placed the following notice immediately 49 |authorship (the "Original Work") whose owner (the "Licensor") has placed the
46 |following the copyright notice for the Original Work: 50 |following notice immediately following the copyright notice for the Original Work:
47 | 51 |
48 |Licensed under the Academic Free License version 2.1 52 |Licensed under the Academic Free License version 2.1
49 | 53 |
50 |1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, 54 | 1)Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free,
51 |non-exclusive, perpetual, sublicenseable license to do the following: 55 | non-exclusive, perpetual, sublicenseable license to do the following:
52 | 56 |
53 |a) to reproduce the Original Work in copies; 57 |a) to reproduce the Original Work in copies;
54 |b) to prepare derivative works ("Derivative Works") based upon the Original Work; 58 |b) to prepare derivative works ("Derivative Works") based upon the Original Work;
55 |c) to distribute copies of the Original Work and Derivative Works to the public; 59 |c) to distribute copies of the Original Work and Derivative Works to the public;
56 |d) to perform the Original Work publicly; and 60 |d) to perform the Original Work publicly; and
57 |e) to display the Original Work publicly. 61 |e) to display the Original Work publicly.
58 | 62 |
59 |2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, 63 | 2)Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free,
60 |non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled 64 | non-exclusive, perpetual, sublicenseable license, under patent claims owned or
61 |by the Licensor that are embodied in the Original Work as furnished by the Licensor, to 65 | controlled by the Licensor that are embodied in the Original Work as furnished by
62 |make, use, sell and offer for sale the Original Work and Derivative Works. 66 | the Licensor, to make, use, sell and offer for sale the Original Work and Derivative
63 | 67 | Works.
64 |3) Grant of Source Code License. The term "Source Code" means the preferred form of the 68 |
65 |Original Work for making modifications to it and all available documentation describing 69 | 3)Grant of Source Code License. The term "Source Code" means the preferred form of
66 |how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy 70 | the Original Work for making modifications to it and all available documentation
67 |of the Source Code of the Original Work along with each copy of the Original Work that 71 | describing how to modify the Original Work. Licensor hereby agrees to provide a
68 |Licensor distributes. Licensor reserves the right to satisfy this obligation by placing 72 | machine-readable copy of the Source Code of the Original Work along with each copy
69 |a machine-readable copy of the Source Code in an information repository reasonably 73 | of the Original Work that Licensor distributes. Licensor reserves the right to satisfy
70 |calculated to permit inexpensive and convenient access by You for as long as Licensor 74 | this obligation by placing a machine-readable copy of the Source Code in an information
71 |continues to distribute the Original Work, and by publishing the address of that information 75 | repository reasonably calculated to permit inexpensive and convenient access by You for
72 |repository in a notice immediately following the copyright notice that applies to the Original 76 | as long as Licensor continues to distribute the Original Work, and by publishing the
73 |Work. 77 | address of that information repository in a notice immediately following the copyright
74 | 78 | notice that applies to the Original Work.
75 |4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any 79 |
76 |contributors to the Original Work, nor any of their trademarks or service marks, may be used 80 | 4)Exclusions From License Grant. Neither the names of Licensor, nor the names of any
77 |to endorse or promote products derived from this Original Work without express prior written 81 | contributors to the Original Work, nor any of their trademarks or service marks, may
78 |permission of the Licensor. Nothing in this License shall be deemed to grant any rights to 82 | be used to endorse or promote products derived from this Original Work without express
79 |trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor 83 | prior written permission of the Licensor. Nothing in this License shall be deemed to
80 |except as expressly stated herein. No patent license is granted to make, use, sell or offer 84 | grant any rights to trademarks, copyrights, patents, trade secrets or any other
81 |to sell embodiments of any patent claims other than the licensed claims defined in Section 2. 85 | intellectual property of Licensor except as expressly stated herein. No patent license
82 |No right is granted to the trademarks of Licensor even if such marks are included in the Original 86 | is granted to make, use, sell or offer to sell embodiments of any patent claims other
83 |Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under 87 | than the licensed claims defined in Section 2. No right is granted to the trademarks
84 |different terms from this License any Original Work that Licensor otherwise would have a right 88 | of Licensor even if such marks are included in the Original Work. Nothing in this
85 |to license. 89 | License shall be interpreted to prohibit Licensor from licensing under different terms
86 | 90 | from this License any Original Work that Licensor otherwise would have a right to license.
87 |5) This section intentionally omitted. 91 |
88 | 92 | 5)This section intentionally omitted.
89 |6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You 93 |
90 |create, all copyright, patent or trademark notices from the Source Code of the Original Work, 94 | 6)Attribution Rights. You must retain, in the Source Code of any Derivative Works that You
91 |as well as any notices of licensing and any descriptive text identified therein as an "Attribution 95 | create, all copyright, patent or trademark notices from the Source Code of the Original
92 |Notice." You must cause the Source Code for any Derivative Works that You create to carry a 96 | Work, as well as any notices of licensing and any descriptive text identified therein as
93 |prominent Attribution Notice reasonably calculated to inform recipients that You have modified the 97 | an "Attribution Notice." You must cause the Source Code for any Derivative Works that You
94 |Original Work. 98 | create to carry a prominent Attribution Notice reasonably calculated to inform recipients
95 | 99 | that You have modified the Original Work.
96 |7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and 100 |
97 |to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or 101 | 7)Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright
98 |are sublicensed to You under the terms of this License with the permission of the contributor(s) 102 | in and to the Original Work and the patent rights granted herein by Licensor are owned
99 |of those copyrights and patent rights. Except as expressly stated in the immediately proceeding 103 | by the Licensor or are sublicensed to You under the terms of this License with the
100 |sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, 104 | permission of the contributor(s) of those copyrights and patent rights. Except as expressly
101 |either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, 105 | stated in the immediately proceeding sentence, the Original Work is provided under this
102 |MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL 106 | License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including,
103 |WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license 107 | without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A
104 |to Original Work is granted hereunder except under this disclaimer. 108 | PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU.
105 | 109 | This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to
106 |8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including 110 | Original Work is granted hereunder except under this disclaimer.
107 |negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, 111 |
108 |special, incidental, or consequential damages of any character arising as a result of this License or the 112 | 8)Limitation of Liability. Under no circumstances and under no legal theory, whether in tort
109 |use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, 113 | (including negligence), contract, or otherwise, shall the Licensor be liable to any person
110 |computer failure or malfunction, or any and all other commercial damages or losses. This limitation of 114 | for any direct, indirect, special, incidental, or consequential damages of any character
111 |liability shall not apply to liability for death or personal injury resulting from Licensor's negligence 115 | arising as a result of this License or the use of the Original Work including, without
112 |to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or 116 | limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction,
113 |limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. 117 | or any and all other commercial damages or losses. This limitation of liability shall not
114 | 118 | apply to liability for death or personal injury resulting from Licensor's negligence to
115 |9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must 119 | the extent applicable law prohibits such limitation. Some jurisdictions do not allow the
116 |make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of 120 | exclusion or limitation of incidental or consequential damages, so this exclusion and
117 |this License. Nothing else but this License (or another written agreement between Licensor and You) grants 121 | limitation may not apply to You.
118 |You permission to create Derivative Works based upon the Original Work or to exercise any of the rights 122 |
119 |granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another 123 | 9)Acceptance and Termination. If You distribute copies of the Original Work or a Derivative
120 |written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent 124 | Work, You must make a reasonable effort under the circumstances to obtain the express
121 |laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted 125 | assent of recipients to the terms of this License. Nothing else but this License (or
122 |to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. 126 | another written agreement between Licensor and You) grants You permission to create
123 | 127 | Derivative Works based upon the Original Work or to exercise any of the rights granted in
124 |10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise 128 | Section 1 herein, and any attempt to do so except under the terms of this License (or
125 |any of the rights granted to You by this License as of the date You commence an action, including a cross-claim 129 | another written agreement between Licensor and You) is expressly prohibited by U.S. copyright
126 |or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This 130 | law, the equivalent laws of other countries, and by international treaty. Therefore, by
127 |termination provision shall not apply for an action alleging patent infringement by combinations of the Original 131 | exercising any of the rights granted to You in Section 1 herein, You indicate Your
128 |Work with other software or hardware. 132 | acceptance of this License and all of its terms and conditions.
129 | 133 |
130 |11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in 134 | 10)Termination for Patent Action. This License shall terminate automatically and You may no
131 |the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, 135 | longer exercise any of the rights granted to You by this License as of the date You
132 |and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United 136 | commence an action, including a cross-claim or counterclaim, against Licensor or any
133 |Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the 137 | licensee alleging that the Original Work infringes a patent. This termination provision
134 |Original Work outside the scope of this License or after its termination shall be subject to the requirements 138 | shall not apply for an action alleging patent infringement by combinations of the Original
135 |and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, 139 | Work with other software or hardware.
136 |and international treaty. This section shall survive the termination of this License. 140 |
137 | 141 | 11)Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be
138 |12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages 142 | brought only in the courts of a jurisdiction wherein the Licensor resides or in which
139 |relating thereto, the prevailing party shall be entitled to recover its costs and expenses, 143 | Licensor conducts its primary business, and under the laws of that jurisdiction excluding
140 |including, without limitation, reasonable attorneys' fees and costs incurred in connection 144 | its conflict-of-law provisions. The application of the United Nations Convention on Contracts
141 |with such action, including any appeal of such action. This section shall survive the 145 | for the International Sale of Goods is expressly excluded. Any use of the Original Work
142 |termination of this License. 146 | outside the scope of this License or after its termination shall be subject to the
143 | 147 | requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent
144 |13) Miscellaneous. This License represents the complete agreement concerning the subject 148 | laws of other countries, and international treaty. This section shall survive the termination
145 |matter hereof. If any provision of this License is held to be unenforceable, such provision 149 | of this License.
146 |shall be reformed only to the extent necessary to make it enforceable. 150 |
147 | 151 | 12)Attorneys Fees. In any action to enforce the terms of this License or seeking damages
148 |14) Definition of "You" in This License. "You" throughout this License, whether in upper 152 | relating thereto, the prevailing party shall be entitled to recover its costs and expenses,
149 |or lower case, means an individual or a legal entity exercising rights under, and complying 153 | including, without limitation, reasonable attorneys' fees and costs incurred in connection
150 |with all of the terms of, this License. For legal entities, "You" includes any entity that 154 | with such action, including any appeal of such action. This section shall survive the
151 |controls, is controlled by, or is under common control with you. For purposes of this 155 | termination of this License.
152 |definition, "control" means (i) the power, direct or indirect, to cause the direction or 156 |
153 |management of such entity, whether by contract or otherwise, or (ii) ownership of fifty 157 | 13)Miscellaneous. This License represents the complete agreement concerning the subject matter
154 |percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 158 | hereof. If any provision of this License is held to be unenforceable, such provision shall
155 | 159 | be reformed only to the extent necessary to make it enforceable.
156 |15) Right to Use. You may use the Original Work in all ways not otherwise restricted or 160 |
157 |conditioned by this License or by law, and Licensor promises not to interfere with or be 161 | 14)Definition of "You" in This License. "You" throughout this License, whether in upper or lower
158 |responsible for such uses by You. 162 | case, means an individual or a legal entity exercising rights under, and complying with all
159 | 163 | of the terms of, this License. For legal entities, "You" includes any entity that controls,
160 |This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission 164 | is controlled by, or is under common control with you. For purposes of this definition,
161 |is hereby granted to copy and distribute this license without modification. This license 165 | "control" means (i) the power, direct or indirect, to cause the direction or management of
162 |may not be modified without the express written permission of its copyright owner. 166 | such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or
167 | more of the outstanding shares, or (iii) beneficial ownership of such entity.
168 |
169 | 15)Right to Use. You may use the Original Work in all ways not otherwise restricted or
170 | conditioned by this License or by law, and Licensor promises not to interfere with or be
171 | responsible for such uses by You.
172 |
173 |This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is
174 |hereby granted to copy and distribute this license without modification. This license may not
175 |be modified without the express written permission of its copyright owner.
176 |
177 |
178 |BSD License
179 |===========
180 |
181 |Copyright (c) 2006, Yahoo! Inc.
182 |All rights reserved.
183 |
184 |Redistribution and use of this software in source and binary forms, with or without modification,
185 |are permitted provided that the following conditions are met:
186 |
187 | *Redistributions of source code must retain the above copyright notice, this list of
188 | conditions and the following disclaimer.
189 | *Redistributions in binary form must reproduce the above copyright notice, this list of
190 | conditions and the following disclaimer in the documentation and/or other materials provided
191 | with the distribution.
192 | *Neither the name of Yahoo! Inc. nor the names of its contributors may be used to endorse or
193 | promote products derived from this software without specific prior written permission of
194 | Yahoo! Inc.
195 |
196 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
197 |WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
198 |PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
199 |ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
200 |LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
201 |INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
202 |TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
203 |ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
163 204
164 205
165# Yahoo! UI Library (http://developer.yahoo.com/yui/) 206# Yahoo! UI Library (http://developer.yahoo.com/yui/)
166 - package version: 0.12 207 - package version: 0.12
167 208
168 Copyright © 2005-2006 Yahoo! Inc. All rights reserved 209 Copyright © 2005-2006 Yahoo! Inc. All rights reserved
169 * Copyright notes: http://docs.yahoo.com/info/copyright/copyright.html 210 * Copyright notes: http://docs.yahoo.com/info/copyright/copyright.html
170 * Software licence: http://developer.yahoo.com/yui/license.txt 211 * Software licence: http://developer.yahoo.com/yui/license.txt
171 212
172 |Software License Agreement (BSD License) 213 |Software License Agreement (BSD License)
173 | 214 |
174 |Copyright (c) 2006, Yahoo! Inc. 215 |Copyright (c) 2006, Yahoo! Inc.
175 |All rights reserved. 216 |All rights reserved.
176 | 217 |
177 |Redistribution and use of this software in source and binary forms, with or without modification, are 218 |Redistribution and use of this software in source and binary forms, with or without modification, are
178 |permitted provided that the following conditions are met: 219 |permitted provided that the following conditions are met:
179 | 220 |
180 |* Redistributions of source code must retain the above 221 |* Redistributions of source code must retain the above
181 | copyright notice, this list of conditions and the 222 | copyright notice, this list of conditions and the
182 | following disclaimer. 223 | following disclaimer.
183 | 224 |
184 |* Redistributions in binary form must reproduce the above 225 |* Redistributions in binary form must reproduce the above
185 | copyright notice, this list of conditions and the 226 | copyright notice, this list of conditions and the
186 | following disclaimer in the documentation and/or other 227 | following disclaimer in the documentation and/or other
187 | materials provided with the distribution. 228 | materials provided with the distribution.
188 | 229 |
189 |* Neither the name of Yahoo! Inc. nor the names of its 230 |* Neither the name of Yahoo! Inc. nor the names of its
190 | contributors may be used to endorse or promote products 231 | contributors may be used to endorse or promote products
191 | derived from this software without specific prior 232 | derived from this software without specific prior
192 | written permission of Yahoo! Inc. 233 | written permission of Yahoo! Inc.
193 | 234 |
194 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED 235 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
195 |WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 236 |WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
196 |PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 237 |PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
197 |ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 238 |ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
198 |LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 239 |LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
199 |INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 240 |INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
200 |TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 241 |TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
201 |ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 242 |ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
202 243
203 244
204 245
205# YUI-ext (http://www.yui-ext.com) 246# YUI-ext (http://www.yui-ext.com)
206 - repository: http://yui-ext.googlecode.com/svn/trunk/ (revision: 120) 247 - repository: http://yui-ext.googlecode.com/svn/trunk/ (revision: 120)
207 248
208 * Software licence: http://yui-ext.googlecode.com/svn/trunk/src/licence.txt 249 * Software licence: http://yui-ext.googlecode.com/svn/trunk/src/licence.txt
209 250
210 |yui-ext 251 |yui-ext
211 |Copyright (c) 2006, Jack Slocum 252 |Copyright (c) 2006, Jack Slocum
212 |All rights reserved. 253 |All rights reserved.
213 | 254 |
214 |Redistribution and use in source and binary forms, with or without modification, 255 |Redistribution and use in source and binary forms, with or without modification,
215 |are permitted provided that the following conditions are met: 256 |are permitted provided that the following conditions are met:
216 | 257 |
217 | * Redistributions of source code must retain the above copyright notice, 258 | * Redistributions of source code must retain the above copyright notice,
218 | this list of conditions and the following disclaimer. 259 | this list of conditions and the following disclaimer.
219 | * Redistributions in binary form must reproduce the above copyright notice, 260 | * Redistributions in binary form must reproduce the above copyright notice,
220 | this list of conditions and the following disclaimer in the documentation 261 | this list of conditions and the following disclaimer in the documentation
221 | and/or other materials provided with the distribution. 262 | and/or other materials provided with the distribution.
222 | * Neither the name yui-ext nor the names of its contributors 263 | * Neither the name yui-ext nor the names of its contributors
223 | may be used to endorse or promote products derived from this software 264 | may be used to endorse or promote products derived from this software
224 | without specific prior written permission. 265 | without specific prior written permission.
225 | 266 |
226 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 267 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
227 |ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 268 |ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
228 |WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 269 |WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
229 |IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 270 |IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
230 |INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 271 |INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
231 |BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 272 |BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232 |DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 273 |DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
233 |OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 274 |OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
234 |NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 275 |NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
235 |EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276 |EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
236 277
237 278
238 279
239# iUI: iPhone User Interface Framework (http://code.google.com/p/iui/)
240 - package version: 282
241
242 Copyright (c) 2007-2009, iUI Project Members
243
244 |All rights reserved.
245 |
246 |Redistribution and use in source and binary forms, with or without modification,
247 |are permitted provided that the following conditions are met:
248 |
249 | * Redistributions of source code must retain the above copyright notice, this
250 | list of conditions and the following disclaimer.
251 | * Redistributions in binary form must reproduce the above copyright notice,
252 | this list of conditions and the following disclaimer in the documentation
253 | and/or other materials provided with the distribution.
254 | * Neither the name of the iUI Project nor the names of its contributors may
255 | be used to endorse or promote products derived from this software without
256 | specific prior written permission.
257 |
258 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
259 |"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
260 |LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
261 |A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
262 |CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
263 |EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
264 |PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
265 |PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
266 |LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
267 |NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
268 |SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
269
270
271
272# Big Integer Library v. 5.0 280# Big Integer Library v. 5.0
273 - code downloaded on March 5, 2007 from http://www.leemon.com/crypto/BigInt.js 281 - code downloaded on March 5, 2007 from http://www.leemon.com/crypto/BigInt.js
274 282
275 |Big Integer Library v. 5.0 283 |Big Integer Library v. 5.0
276 |Created 2000, last modified 2006 284 |Created 2000, last modified 2006
277 |Leemon Baird 285 |Leemon Baird
278 |www.leemon.com 286 |www.leemon.com
279 | 287 |
280 |This file is public domain. You can use it for any purpose without restriction. 288 |This file is public domain. You can use it for any purpose without restriction.
281 |I do not guarantee that it is correct, so use it at your own risk. If you use 289 |I do not guarantee that it is correct, so use it at your own risk. If you use
282 |it for something interesting, I'd appreciate hearing about it. If you find 290 |it for something interesting, I'd appreciate hearing about it. If you find
283 |any bugs or make any improvements, I'd appreciate hearing about those too. 291 |any bugs or make any improvements, I'd appreciate hearing about those too.
284 |It would also be nice if my name and address were left in the comments. 292 |It would also be nice if my name and address were left in the comments.
285 |But none of that is required. 293 |But none of that is required.
286 294
287 295
288 296
289# JSON library 297# JSON library
290 - code downloaded on October 13, 2008 from http://www.JSON.org/json2.js 298 - code downloaded on October 13, 2008 from http://www.JSON.org/json2.js
291 299
292 |http://www.JSON.org/json2.js 300 |http://www.JSON.org/json2.js
293 |2008-09-01 301 |2008-09-01
294 | 302 |
295 |Public Domain. 303 |Public Domain.
296 | 304 |
297 |NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. 305 |NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
298 | 306 |
299 |See http://www.JSON.org/js.html 307 |See http://www.JSON.org/js.html
300 308
301 309
302 310
303# Other code snippets used in the first demo of the program, and still present just to be able to 311# Other code snippets used in the first demo of the program, and still present just to be able to
304 read record previously written using these same functions: 312 read record previously written using these same functions:
305 313
306 - Code downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip 314 - Code downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip
307 File used: jsSha2/sha256.js 315 File used: jsSha2/sha256.js
308 316
309 |A JavaScript implementation of the Secure Hash Algorithm, SHA-256 317 |A JavaScript implementation of the Secure Hash Algorithm, SHA-256
310 |Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/ 318 |Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
311 |Distributed under the BSD License 319 |Distributed under the BSD License
312 |Some bits taken from Paul Johnston's SHA-1 implementation 320 |Some bits taken from Paul Johnston's SHA-1 implementation
313 321
314 322
315 - Code downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip 323 - Code downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip
316 Files used: entropy.js, aesprng.js, md5.js, aes.js, utf-8.js 324 Files used: entropy.js, aesprng.js, md5.js, aes.js, utf-8.js
317 325
318 326
319 - Code downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js 327 - Code downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js
320 328
321 |A JavaScript implementation of the RSA Data Security, Inc. MD5 Message 329 |A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
322 |Digest Algorithm, as defined in RFC 1321. 330 |Digest Algorithm, as defined in RFC 1321.
323 |Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. 331 |Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
324 |Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet 332 |Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
325 |Distributed under the BSD License 333 |Distributed under the BSD License
326 |See http://pajhome.org.uk/crypt/md5 for more info. 334 |See http://pajhome.org.uk/crypt/md5 for more info.
327 335
328 336
329 337
330 #General notes 338 #General notes
331 The code in this page has been processed with a JavaScript compressor and is thus 339 The code in this page has been processed with a JavaScript compressor and is thus
332 difficult to read. 340 difficult to read.
333 To get the exact version of the code used to build this application you 341 To get the exact version of the code used to build this application you
334 can take a look here: 342 can take a look here:
335 - http://www.clipperz.com/security_privacy/security_code_review 343 - http://www.clipperz.com/security_privacy/security_code_review
diff --git a/frontend/gamma/properties/gamma.properties.json b/frontend/gamma/properties/gamma.properties.json
index c847812..eec4194 100644
--- a/frontend/gamma/properties/gamma.properties.json
+++ b/frontend/gamma/properties/gamma.properties.json
@@ -1,68 +1,68 @@
1{ 1{
2 "copyright.values": { 2 "copyright.values": {
3 "mochikit.repository": "https://github.com/mochi/mochikit.git", 3 "mochikit.repository":"https://github.com/mochi/mochikit.git",
4 "mochikit.version": "fe8d17bb9ac0a4e5ad4a8d5c2c94a6fac1c92d75" 4 "mochikit.version": "fe8d17bb9ac0a4e5ad4a8d5c2c94a6fac1c92d75"
5 }, 5 },
6 6
7 "html.template": "index_template.html", 7 "html.template": "index_template.html",
8 8
9 "js": [ 9 "js": [
10 "MochiKit/Base.js", 10 "MochiKit/Base.js",
11 "MochiKit/Iter.js", 11 "MochiKit/Iter.js",
12 "MochiKit/Logging.js", 12 "MochiKit/Logging.js",
13 "-- MochiKit/DateTime.js", 13 "-- MochiKit/DateTime.js",
14 "MochiKit/Format.js", 14 "MochiKit/Format.js",
15 "MochiKit/Async.js", 15 "MochiKit/Async.js",
16 "MochiKit/DOM.js", 16 "MochiKit/DOM.js",
17 "MochiKit/Style.js", 17 "MochiKit/Style.js",
18 "MochiKit/LoggingPane.js", 18 "MochiKit/LoggingPane.js",
19 "MochiKit/Color.js", 19 "MochiKit/Color.js",
20 "MochiKit/Signal.js", 20 "MochiKit/Signal.js",
21 "MochiKit/Position.js", 21 "MochiKit/Position.js",
22 "MochiKit/Selector.js", 22 "MochiKit/Selector.js",
23 "MochiKit/Visual.js", 23 "MochiKit/Visual.js",
24 24
25 "JSON/json2.js", 25 "JSON/json2.js",
26 26
27 "Clipperz/YUI/Utils.js", 27 "Clipperz/YUI/Utils.js",
28 "Clipperz/YUI/DomHelper.js", 28 "Clipperz/YUI/DomHelper.js",
29 29
30 "Clipperz/ByteArray.js", 30 "Clipperz/ByteArray.js",
31 "Clipperz/Base.js", 31 "Clipperz/Base.js",
32 "Clipperz/Async.js", 32 "Clipperz/Async.js",
33 "Clipperz/CSVProcessor.js", 33 "Clipperz/CSVProcessor.js",
34 "Clipperz/KeePassExportProcessor.js", 34 "Clipperz/KeePassExportProcessor.js",
35 "Clipperz/Date.js", 35 "Clipperz/Date.js",
36 "Clipperz/DOM.js", 36 "Clipperz/DOM.js",
37 "Clipperz/Logging.js", 37 "Clipperz/Logging.js",
38 "Clipperz/Signal.js", 38 "Clipperz/Signal.js",
39 "Clipperz/Style.js", 39 "Clipperz/Style.js",
40 "Clipperz/Visual.js", 40 "Clipperz/Visual.js",
41 "Clipperz/Set.js", 41 "Clipperz/Set.js",
42 "-- Clipperz/Profile.js", 42 "-- Clipperz/Profile.js",
43 "Clipperz/KeyValueObjectStore.js", 43 "Clipperz/KeyValueObjectStore.js",
44 44
45 "Clipperz/Crypto/SHA.js", 45 "Clipperz/Crypto/SHA.js",
46 "Clipperz/Crypto/AES.js", 46 "Clipperz/Crypto/AES.js",
47 "Clipperz/Crypto/PRNG.js", 47 "Clipperz/Crypto/PRNG.js",
48 "Clipperz/Crypto/BigInt.js", 48 "Clipperz/Crypto/BigInt.js",
49 "Clipperz/Crypto/Base.js", 49 "Clipperz/Crypto/Base.js",
50 "Clipperz/Crypto/SRP.js", 50 "Clipperz/Crypto/SRP.js",
51 "Clipperz/Crypto/RSA.js", 51 "Clipperz/Crypto/RSA.js",
52 52
53 "Clipperz/PM/Strings/Strings_defaults.js", 53 "Clipperz/PM/Strings/Strings_defaults.js",
54 "Clipperz/PM/Strings/Strings_en-US.js", 54 "Clipperz/PM/Strings/Strings_en-US.js",
55 "-- # Clipperz/PM/Strings/Strings_en-GB.js", 55 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
56 "-- # Clipperz/PM/Strings/Strings_en-CA.js", 56 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
57 "-- Clipperz/PM/Strings/Strings_it-IT.js", 57 "-- Clipperz/PM/Strings/Strings_it-IT.js",
58 "-- Clipperz/PM/Strings/Strings_pt-BR.js", 58 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
59 "-- # Clipperz/PM/Strings/Strings_pt-PT.js", 59 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
60 "-- Clipperz/PM/Strings/Strings_ja-JP.js", 60 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
61 "-- Clipperz/PM/Strings/Strings_zh-CN.js", 61 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
62 "-- Clipperz/PM/Strings/Strings_es-ES.js", 62 "-- Clipperz/PM/Strings/Strings_es-ES.js",
63 "-- Clipperz/PM/Strings/Strings_fr-FR.js", 63 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
64 "-- # Clipperz/PM/Strings/Strings_de-DE.js", 64 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
65 "-- # Clipperz/PM/Strings/Strings_el-GR.js", 65 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
66 "-- # Clipperz/PM/Strings/Strings_ru-RU.js", 66 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
67 "-- # Clipperz/PM/Strings/Strings_he-IL.js", 67 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
68 "Clipperz/PM/Strings.js", 68 "Clipperz/PM/Strings.js",
diff --git a/frontend/gamma/properties/mobile.properties.json b/frontend/gamma/properties/mobile.properties.json
index e26b95f..bdb2d07 100644
--- a/frontend/gamma/properties/mobile.properties.json
+++ b/frontend/gamma/properties/mobile.properties.json
@@ -1,119 +1,142 @@
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": "mobile_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/KeyValueObjectStore.js", 42 "Clipperz/KeyValueObjectStore.js",
40 43
41 "Clipperz/Crypto/SHA.js", 44 "Clipperz/Crypto/SHA.js",
42 "Clipperz/Crypto/AES.js", 45 "Clipperz/Crypto/AES.js",
43 "Clipperz/Crypto/PRNG.js", 46 "Clipperz/Crypto/PRNG.js",
44 "Clipperz/Crypto/BigInt.js", 47 "Clipperz/Crypto/BigInt.js",
45 "Clipperz/Crypto/Base.js", 48 "Clipperz/Crypto/Base.js",
46 "Clipperz/Crypto/SRP.js", 49 "Clipperz/Crypto/SRP.js",
47 "Clipperz/Crypto/RSA.js", 50 "Clipperz/Crypto/RSA.js",
48 51
49 "Clipperz/PM/Strings/Strings_defaults.js", 52 "Clipperz/PM/Strings/Strings_defaults.js",
50 "Clipperz/PM/Strings/Strings_en-US.js", 53 "Clipperz/PM/Strings/Strings_en-US.js",
51 "-- # Clipperz/PM/Strings/Strings_en-GB.js", 54 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
52 "-- # Clipperz/PM/Strings/Strings_en-CA.js", 55 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
53 "-- Clipperz/PM/Strings/Strings_it-IT.js", 56 "-- Clipperz/PM/Strings/Strings_it-IT.js",
54 "-- Clipperz/PM/Strings/Strings_pt-BR.js", 57 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
55 "-- # Clipperz/PM/Strings/Strings_pt-PT.js", 58 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
56 "-- Clipperz/PM/Strings/Strings_ja-JP.js", 59 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
57 "-- Clipperz/PM/Strings/Strings_zh-CN.js", 60 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
58 "-- Clipperz/PM/Strings/Strings_es-ES.js", 61 "-- Clipperz/PM/Strings/Strings_es-ES.js",
59 "-- Clipperz/PM/Strings/Strings_fr-FR.js", 62 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
60 "-- # Clipperz/PM/Strings/Strings_de-DE.js", 63 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
61 "-- # Clipperz/PM/Strings/Strings_el-GR.js", 64 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
62 "-- # Clipperz/PM/Strings/Strings_ru-RU.js", 65 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
63 "-- # Clipperz/PM/Strings/Strings_he-IL.js", 66 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
64 "Clipperz/PM/Strings.js", 67 "Clipperz/PM/Strings.js",
65 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js", 68 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js",
66 69
67 "Clipperz/PM/Date.js", 70 "Clipperz/PM/Date.js",
68 71
69 "Clipperz/PM/Toll.js", 72 "Clipperz/PM/Toll.js",
70 "Clipperz/PM/Proxy.js", 73 "Clipperz/PM/Proxy.js",
71 "Clipperz/PM/Proxy/Proxy.JSON.js", 74 "Clipperz/PM/Proxy/Proxy.JSON.js",
75 "-- Clipperz/PM/Proxy/Proxy.OfflineCache.js",
72 "Clipperz/PM/Proxy/Proxy.Offline.js", 76 "Clipperz/PM/Proxy/Proxy.Offline.js",
77 "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js",
78
73 "Clipperz/PM/Connection.js", 79 "Clipperz/PM/Connection.js",
74 "Clipperz/PM/Crypto.js", 80 "Clipperz/PM/Crypto.js",
75 "-- Clipperz/PM/BookmarkletProcessor.js", 81 "Clipperz/PM/PIN.js",
76 82
77 "Clipperz/PM/DataModel/EncryptedRemoteObject.js", 83 "Clipperz/PM/DataModel/EncryptedRemoteObject.js",
78 "Clipperz/PM/DataModel/User.js", 84 "Clipperz/PM/DataModel/User.js",
79 "Clipperz/PM/DataModel/User.Header.Legacy.js", 85 "Clipperz/PM/DataModel/User.Header.Legacy.js",
80 "Clipperz/PM/DataModel/User.Header.RecordIndex.js", 86 "Clipperz/PM/DataModel/User.Header.RecordIndex.js",
81 "Clipperz/PM/DataModel/User.Header.Preferences.js", 87 "Clipperz/PM/DataModel/User.Header.Preferences.js",
82 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js", 88 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js",
83 "Clipperz/PM/DataModel/Record.js", 89 "Clipperz/PM/DataModel/Record.js",
84 "Clipperz/PM/DataModel/Record.Version.js", 90 "Clipperz/PM/DataModel/Record.Version.js",
85 "Clipperz/PM/DataModel/Record.Version.Field.js", 91 "Clipperz/PM/DataModel/Record.Version.Field.js",
86 "Clipperz/PM/DataModel/DirectLogin.js", 92 "Clipperz/PM/DataModel/DirectLogin.js",
87 "Clipperz/PM/DataModel/DirectLoginInput.js", 93 "Clipperz/PM/DataModel/DirectLoginInput.js",
88 "Clipperz/PM/DataModel/DirectLoginBinding.js", 94 "Clipperz/PM/DataModel/DirectLoginBinding.js",
89 "Clipperz/PM/DataModel/DirectLoginFormValue.js", 95 "Clipperz/PM/DataModel/DirectLoginFormValue.js",
90 "Clipperz/PM/DataModel/OneTimePassword.js", 96 "Clipperz/PM/DataModel/OneTimePassword.js",
91 97
98 "Zepto/zepto.js",
99 "Zepto/ajax.js",
100 "Zepto/assets.js",
101 "Zepto/data.js",
102 "Zepto/detect.js",
103 "Zepto/event.js",
104 "Zepto/form.js",
105 "Zepto/fx.js",
106 "Zepto/fx_methods.js",
107 "Zepto/gesture.js",
108 "Zepto/polyfill.js",
109 "Zepto/selector.js",
110 "Zepto/stack.js",
111 "Zepto/touch.js",
112
113 "JQTouch/jqtouch.js",
114
92 "Clipperz/PM/UI/Common/Components/BaseComponent.js", 115 "Clipperz/PM/UI/Common/Components/BaseComponent.js",
93 "-- Clipperz/PM/UI/Common/Components/Button.js", 116 "-- Clipperz/PM/UI/Common/Components/Button.js",
94 "Clipperz/PM/UI/Common/Components/ComponentSlot.js", 117 "Clipperz/PM/UI/Common/Components/ComponentSlot.js",
95 "-- Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js", 118 "-- Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js",
96 "Clipperz/PM/UI/Common/Components/ProgressBar.js", 119 "Clipperz/PM/UI/Common/Components/ProgressBar.js",
97 "-- Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js", 120 "-- Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js",
98 "-- Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js", 121 "-- Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js",
99 "-- Clipperz/PM/UI/Common/Components/TabPanelComponent.js", 122 "-- Clipperz/PM/UI/Common/Components/TabPanelComponent.js",
100 "-- Clipperz/PM/UI/Common/Components/Tooltip.js", 123 "-- Clipperz/PM/UI/Common/Components/Tooltip.js",
101 "-- Clipperz/PM/UI/Common/Components/TranslatorWidget.js", 124 "-- Clipperz/PM/UI/Common/Components/TranslatorWidget.js",
102 125
103 "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js", 126 "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js",
104 "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js", 127 "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js",
105 "-- Clipperz/PM/UI/Common/Controllers/TabPanelController.js", 128 "-- Clipperz/PM/UI/Common/Controllers/TabPanelController.js",
106 129
107 "Clipperz/PM/UI/iPhone/Components/LoginForm.js", 130 "Clipperz/PM/UI/Mobile/Components/LoginForm.js",
108 "Clipperz/PM/UI/iPhone/Components/CardList.js", 131 "Clipperz/PM/UI/Mobile/Components/CardList.js",
109 "Clipperz/PM/UI/iPhone/Components/CardDetail.js", 132 "-- Clipperz/PM/UI/Mobile/Components/CardDetail.js",
110 133
111 "Clipperz/PM/UI/iPhone/Controllers/MainController.js", 134 "Clipperz/PM/UI/Mobile/Controllers/MainController.js",
112 135
113 "main_iPhone.js" 136 "main.mobile.js"
114 ], 137 ],
115 138
116 "css": [ 139 "css": [
117 "clipperz/iPhone.css" 140 "mobile.css"
118 ] 141 ]
119} \ No newline at end of file 142} \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/PIN.html b/frontend/gamma/tests/tests/Clipperz/PM/PIN.html
new file mode 100644
index 0000000..a08b286
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/PIN.html
@@ -0,0 +1,66 @@
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>
27<head>
28 <title>Clipperz.PM.Proxy - TEST</title>
29
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
40
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
50<!--
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
52
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
54-->
55
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/PIN.js'></script>
57
58 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
59
60</head>
61<body>
62<pre id="test">
63 <script type="text/javascript" src="PIN.test.js"></script>
64</pre>
65</body>
66</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js b/frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js
new file mode 100644
index 0000000..ed795dd
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js
@@ -0,0 +1,97 @@
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
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27
28 Clipperz.PM.PIN['CREDENTIALS'] ='TEST.CLIPPERZ.CREDENTIALS';
29 Clipperz.PM.PIN['FAILURE_COUNT'] ='TEST.CLIPPERZ.FAILED_LOGIN_COUNT';
30
31
32var tests = {
33
34 //-------------------------------------------------------------------------
35
36 'clearCredentials': function () {
37 localStorage.removeItem(Clipperz.PM.PIN['CREDENTIALS']);
38 localStorage.removeItem(Clipperz.PM.PIN['FAILURE_COUNT']);
39 },
40
41 //-------------------------------------------------------------------------
42
43 'isSet': function () {
44 tests.clearCredentials();
45
46 is(false, Clipperz.PM.PIN.isSet(), "after cleaning all values, credentials should not be set");
47
48 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'});
49 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found");
50 },
51
52 'recordFailedAttempt': function () {
53 tests.clearCredentials();
54
55 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'});
56 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found");
57 Clipperz.PM.PIN.recordFailedAttempt();
58 is(true, Clipperz.PM.PIN.isSet(), "1st wrong PIN -> keep credentials");
59 Clipperz.PM.PIN.recordFailedAttempt();
60 is(true, Clipperz.PM.PIN.isSet(), "2nd wrong PIN -> keep credentials");
61 Clipperz.PM.PIN.recordFailedAttempt();
62 is(false, Clipperz.PM.PIN.isSet(), "3rd wrong PIN -> REMOVE credentials");
63
64 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'});
65 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found");
66 Clipperz.PM.PIN.recordFailedAttempt();
67 is(true, Clipperz.PM.PIN.isSet(), "1st wrong PIN -> keep credentials");
68 Clipperz.PM.PIN.recordFailedAttempt();
69 is(true, Clipperz.PM.PIN.isSet(), "2nd wrong PIN -> keep credentials");
70 Clipperz.PM.PIN.resetFailedAttemptCount();
71 Clipperz.PM.PIN.recordFailedAttempt();
72 is(true, Clipperz.PM.PIN.isSet(), "3rd wrong PIN, but with a successful use in between -> keep credentials");
73 },
74
75 'credentialsWithPIN': function () {
76 varcredentials;
77 varpin;
78 var decryptedCredentials;
79
80 tests.clearCredentials();
81
82 credentials = {'username': 'joe', 'passphrase':'foobar'};
83 pin = '1234';
84 Clipperz.PM.PIN.setCredentialsWithPIN(pin, credentials);
85 decryptedCredentials = Clipperz.PM.PIN.credentialsWithPIN(pin);
86
87 is(decryptedCredentials['username'],credentials['username']);
88 is(decryptedCredentials['passphrase'],credentials['passphrase']);
89 },
90
91 //-------------------------------------------------------------------------
92 'syntaxFix': MochiKit.Base.noop
93};
94
95//#############################################################################
96
97SimpleTest.runDeferredTests("Clipperz.PM.PIN", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/index.html b/frontend/gamma/tests/tests/Clipperz/PM/index.html
index b9bede1..c3df56a 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/index.html
@@ -1,53 +1,54 @@
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.* - tests</title> 28 <title>Clipperz.PM.* - tests</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/TestRunner.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script>
32</head> 32</head>
33<body> 33<body>
34<script> 34<script>
35TestRunner.runTests( 35TestRunner.runTests(
36// 36//
37 //This is still a complete mess. 37 //This is still a complete mess.
38// 38//
39 //'BookmarkletProcessor.html', 39 //'BookmarkletProcessor.html',
40 'Connection.html', 40 'Connection.html',
41 'Crypto.html', 41 'Crypto.html',
42 //'Crypto_other_implementation_comparison.html', 42 //'Crypto_other_implementation_comparison.html',
43 'Crypto_performanceEvaluation.html', 43 'Crypto_performanceEvaluation.html',
44 //'CryptoPerformance_ByteArrayArray.html', 44 //'CryptoPerformance_ByteArrayArray.html',
45 //'CryptoPerformance_ByteArrayHex.html', 45 //'CryptoPerformance_ByteArrayHex.html',
46 //'CryptoPerformance_ByteArrayString.html', 46 //'CryptoPerformance_ByteArrayString.html',
47 'Date.html', 47 'Date.html',
48 'PIN.html',
48 'Proxy.html', 49 'Proxy.html',
49 'Toll.html' 50 'Toll.html'
50); 51);
51</script> 52</script>
52</body> 53</body>
53</html> \ No newline at end of file 54</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Components/FullApp/User.data.js b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
index 7194f6a..4dfc81c 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/User.data.js
+++ b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
@@ -20,168 +20,168 @@ 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
26testData = { 26testData = {
27 27
28 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
29 29
30 'testData': { 30 'testData': {
31 users:{ 31 users:{
32 'catchAllUser': { 32 'catchAllUser': {
33 __masterkey_test_value__: 'masterkey', 33 __masterkey_test_value__: 'masterkey',
34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
36 }, 36 },
37 37
38 /* tt/tt - empty, just created, account*/ 38 /* tt/tt - empty, just created, account*/
39 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 39 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
40 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 40 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
41 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 41 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
42 version: '0.2', 42 version: '0.2',
43 maxNumberOfRecords: '100', 43 maxNumberOfRecords: '100',
44 userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}', 44 userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}',
45 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq', 45 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq',
46 userDetailsVersion: '0.3', 46 userDetailsVersion: '0.3',
47 records: { 47 records: {
48 48
49 } 49 }
50 }, 50 },
51 51
52 /* tt/tt - account with "wrong" direct login*/ 52 /* tt/tt - account with "wrong" direct login*/
53 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 53 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
54 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 54 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
55 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 55 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
56 version: '0.2', 56 version: '0.2',
57 maxNumberOfRecords: '100', 57 maxNumberOfRecords: '100',
58 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"1"},"data":"/+RHG+JLrFhZLYga2H9hsPyugT5bbiPwmNgY/RqE2g90FXfsCOvJ6TnfHX6ufeVfJ5+jUq/mRhWMlKdIqROSBLRL5EbL7i881EyKMNE24zpzUWm9zN6HcATPO2iNvDjsZjv2dEP9QWtAabw4Hc7UB+39WQ=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":1},"data":"ZF6BZYAVIJi3xrCPs6XWHwZDveEonG/5WJVKwIXbCGa5fr1myopvpqYbWI09tPCCktlMKP/X/SiIyBxlq7Z953VpOHWx0AYqTpRnw8PfJ+0BJDEblBFCZ8ZZfkZXcfYmNoY7"},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}', 58 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"1"},"data":"/+RHG+JLrFhZLYga2H9hsPyugT5bbiPwmNgY/RqE2g90FXfsCOvJ6TnfHX6ufeVfJ5+jUq/mRhWMlKdIqROSBLRL5EbL7i881EyKMNE24zpzUWm9zN6HcATPO2iNvDjsZjv2dEP9QWtAabw4Hc7UB+39WQ=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":1},"data":"ZF6BZYAVIJi3xrCPs6XWHwZDveEonG/5WJVKwIXbCGa5fr1myopvpqYbWI09tPCCktlMKP/X/SiIyBxlq7Z953VpOHWx0AYqTpRnw8PfJ+0BJDEblBFCZ8ZZfkZXcfYmNoY7"},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}',
59 statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5', 59 statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5',
60 userDetailsVersion: '0.3', 60 userDetailsVersion: '0.3',
61 records: { 61 records: {
62 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { 62 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
63 data: '93QXl+c+JmQo4WTl4rYLYb/oHehjntAroteeHd6HqrUiXYoi+02GYrYcKfvE5wgMWvOwvQ4kVdUv5ksa3gJaUzhrpY5GLM3EV3agEkQ6yuKwHgfmAQvES1c6tcw15lNTzGiZ7PHhBrW5I5H6Le0Mf10uW1DOyu6gFl+W5OarbBBGyQmRmASy+CW2l3/lY5pOFxUq3qlkwW/o4KrSiwKOFh3HDvxOQKwovm0v3puLu+NsuL5rz5blUIZpj+CsOmZUhtU5FC5s6iO2L1uj3w8+Yxu279p249H1bv1zxo1zSBpP507uuRH8dKOLsu7JI6PO+UC8PLqVhPU7fHhDhNleurE7AsUo6eHocG0DhxCAm3xeobm1K2iPd0iRprcuRXmwa8HWRDJHTItbQr9D+cnQTT7/DwneRdQzpMaVZHZcKqtAzz07jboy98plrigu03tV2MkXt2veIMLBofxxHqgZ0NJhcfrVta4FlJsrd1vO9RUkoHl+qPJqQZIVGZzoT0rdHS/nLd614EHJSfRYIl+drUEUchIidbRnMzvPTBo2s6bVfUPcQksVop4E85wMo15ah2BHzUe4vjkmM+Ki8ecUVH8jRR5fmZhCGpBFML5U7o+rERYABFuwwRC9FfCXMtmClHc2LypP+iu+lI/VycdHg/m8skQVeCDBv892vqehUs1CpeVAxMtYOJcFtm6roQNPxJe1EI/j4PAi3SEYPCFev1F7u1g4bw4cG5jCGJx6U3qTTYMX5A06dHf4iSSOUeCsrP5U+VJY0KLhU3E66DzOxNIrIyYN6iOJxKCbhH7ILfGdWAV3MlZZOpVoSIqiR7oZo2PwovtudF5tOy9lhz7SEFYLvuQy8r4mqFC7qMVnXJRrBPDZcQDTdXLG33YV6dWX17QpGrpyvPhX5/UDv8E7zc8PdO1YfJmzL1rpArlIXF1EOsLa6BqjQp5bkIlHKugQMjnn3tf4sYK0OhPskbKidfNm59NedQODEoUr5NGwmjSAqTCokt1D7q0K3vMK', 63 data: '93QXl+c+JmQo4WTl4rYLYb/oHehjntAroteeHd6HqrUiXYoi+02GYrYcKfvE5wgMWvOwvQ4kVdUv5ksa3gJaUzhrpY5GLM3EV3agEkQ6yuKwHgfmAQvES1c6tcw15lNTzGiZ7PHhBrW5I5H6Le0Mf10uW1DOyu6gFl+W5OarbBBGyQmRmASy+CW2l3/lY5pOFxUq3qlkwW/o4KrSiwKOFh3HDvxOQKwovm0v3puLu+NsuL5rz5blUIZpj+CsOmZUhtU5FC5s6iO2L1uj3w8+Yxu279p249H1bv1zxo1zSBpP507uuRH8dKOLsu7JI6PO+UC8PLqVhPU7fHhDhNleurE7AsUo6eHocG0DhxCAm3xeobm1K2iPd0iRprcuRXmwa8HWRDJHTItbQr9D+cnQTT7/DwneRdQzpMaVZHZcKqtAzz07jboy98plrigu03tV2MkXt2veIMLBofxxHqgZ0NJhcfrVta4FlJsrd1vO9RUkoHl+qPJqQZIVGZzoT0rdHS/nLd614EHJSfRYIl+drUEUchIidbRnMzvPTBo2s6bVfUPcQksVop4E85wMo15ah2BHzUe4vjkmM+Ki8ecUVH8jRR5fmZhCGpBFML5U7o+rERYABFuwwRC9FfCXMtmClHc2LypP+iu+lI/VycdHg/m8skQVeCDBv892vqehUs1CpeVAxMtYOJcFtm6roQNPxJe1EI/j4PAi3SEYPCFev1F7u1g4bw4cG5jCGJx6U3qTTYMX5A06dHf4iSSOUeCsrP5U+VJY0KLhU3E66DzOxNIrIyYN6iOJxKCbhH7ILfGdWAV3MlZZOpVoSIqiR7oZo2PwovtudF5tOy9lhz7SEFYLvuQy8r4mqFC7qMVnXJRrBPDZcQDTdXLG33YV6dWX17QpGrpyvPhX5/UDv8E7zc8PdO1YfJmzL1rpArlIXF1EOsLa6BqjQp5bkIlHKugQMjnn3tf4sYK0OhPskbKidfNm59NedQODEoUr5NGwmjSAqTCokt1D7q0K3vMK',
64 version: '0.3', 64 version: '0.3',
65 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 65 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
66 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 66 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
67 accessDate: 'Wed Jan 20 16:53:47 CET 2010', 67 accessDate: 'Wed Jan 20 16:53:47 CET 2010',
68 currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', 68 currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
69 versions: { 69 versions: {
70 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { 70 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
71 header: '####', 71 header: '####',
72 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', 72 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
73 version: '0.3', 73 version: '0.3',
74 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 74 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
75 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 75 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
76 accessDate: 'Wed Jan 20 16:53:47 CET 2010' 76 accessDate: 'Wed Jan 20 16:53:47 CET 2010'
77 } 77 }
78 } 78 }
79 } 79 }
80 } 80 }
81 }, 81 },
82*/ 82*/
83 /* tt/tt with "fixed" direct login*/ 83 /* tt/tt with "fixed" direct login*/
84 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 84 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
85 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 85 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
86 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 86 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
87 version: '0.2', 87 version: '0.2',
88 maxNumberOfRecords: '100', 88 maxNumberOfRecords: '100',
89 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"0"},"data":"K6sV3xYDTHn1PDHmbVhG3PogarwMtHCliSEGaJ5eev/RQv7MW9TCP5efsjATRT4eheX7JkXAoLo+sgMVr2fTyu7f7K0IEYp3mCi27T/TmtTM3b8FoaVfmXWEjN0FGx7N6gK6+lZxhFueRxsOha1+fTLDBg=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":"0"},"data":"9aUwb/5nIlAOPKz62xTwylK0dilpWVVEJBag5+LydmBwWxTmlfcB+OO6jGnMgDrjif3LVhWFjfKVSoZs5hSpPvhsSDPaLf5vQhF4igRaQpWI9QhBdfmv3QvZ57ei/gfcal346F4="},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}', 89 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"0"},"data":"K6sV3xYDTHn1PDHmbVhG3PogarwMtHCliSEGaJ5eev/RQv7MW9TCP5efsjATRT4eheX7JkXAoLo+sgMVr2fTyu7f7K0IEYp3mCi27T/TmtTM3b8FoaVfmXWEjN0FGx7N6gK6+lZxhFueRxsOha1+fTLDBg=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":"0"},"data":"9aUwb/5nIlAOPKz62xTwylK0dilpWVVEJBag5+LydmBwWxTmlfcB+OO6jGnMgDrjif3LVhWFjfKVSoZs5hSpPvhsSDPaLf5vQhF4igRaQpWI9QhBdfmv3QvZ57ei/gfcal346F4="},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}',
90 statistics: 'GHHkZjW0QLdUq6CPnVuDLh86', 90 statistics: 'GHHkZjW0QLdUq6CPnVuDLh86',
91 userDetailsVersion: '0.3', 91 userDetailsVersion: '0.3',
92 records: { 92 records: {
93 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { 93 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
94 data: 'SOcANZTLo4dsjpsPghF2+TndV9+1uYhGjup3StEa1kiFHHzDK6kDZkKwjhP0mxFgixlQHZBnvgsW/xdHGXdmj1RHtaNdHlte7W1Wq5MHbH4XE9bJzQAvQmop8OETgGz7Khp4BbUMVLIXhxoJmP3rMx7ulQHds+WN+S5u+iB73y5nkJwfOXrXDjwwlL1vER92XHE1VJZAjkYRB/xes6SLcITaG9LYVSGSVAhtLIzkmrAvPHPIpZSOI4NQnAMEVPllwtMlWQBEeerN7PIKImyaUd9zPzP+v0S1V+kUyioizScsDdVuaNKa+yqwFKvYYy61nobv3Mg+Fo3EGqY7GOiO7AklRTreZoOkZAdogQlA1DZuIBNSbpcMvm5MoP+PsU3HFSb/Vioo+QEcgTWqVyDNuFGZpkOI2iIBuQCwLmsCwB1JaE/1cCd1fEpOWyiFep0vxwi0ZrtRZQowQd2Ua3UIoaG5u5WoYEMYoH7FFi6Djda4Rf4gxed8rPLE+cNTI/p67OKlbAfr8iz3YZknaH+CXp9pPr7V7xXBCWNxo5DnFPeeqqrxjTAbkeg/Rp2hJeN7/zi0TSWKDUTXfkuUNyewHOHb7M+MIvC1F1CtmqLuU3h8RDINYgPtZTtTk68YBmOG88xYTtClr4kKxmp1scrV3nJ7af+IGoVKZpRAwBJYT3HV33vzO9W35zl14eZ0vVuNoHMNsh9uDxjCwRyPtQzVpQuTIYnHHoO5R17XyIfe599BOSBAGimciprURN3llC2H8YhRtMilQRYvEDVsC+mVZmGAeEdQ5o/AehnpBuVKErRBzotWe6bNMkIQqWfwCLQFBb6ap1gT5hbacrJM4AlaPgOdQsyX9npd3yN/tzjVA1IqWLnoaEXq9EfWXhBuT+juMfSQ2Y8bPbpBKZmWWL06T2fVkaZJN0VFtBXGi0XRFJngPskApLunZOfBYq831jSi8/Z937QVTQKWwOz6rLE8covE3mxJ53gDVcOlvqD9s/NGXbmnt2GnlWhVKpzhTIJ812Hr050/2AI9ZmWnv+ypSqeQ3l0BFh4D+xfk5NRv+dKbxANheZnfZMhR6u8F+jX/W3hUtNCIMQc2vLSQ', 94 data: 'SOcANZTLo4dsjpsPghF2+TndV9+1uYhGjup3StEa1kiFHHzDK6kDZkKwjhP0mxFgixlQHZBnvgsW/xdHGXdmj1RHtaNdHlte7W1Wq5MHbH4XE9bJzQAvQmop8OETgGz7Khp4BbUMVLIXhxoJmP3rMx7ulQHds+WN+S5u+iB73y5nkJwfOXrXDjwwlL1vER92XHE1VJZAjkYRB/xes6SLcITaG9LYVSGSVAhtLIzkmrAvPHPIpZSOI4NQnAMEVPllwtMlWQBEeerN7PIKImyaUd9zPzP+v0S1V+kUyioizScsDdVuaNKa+yqwFKvYYy61nobv3Mg+Fo3EGqY7GOiO7AklRTreZoOkZAdogQlA1DZuIBNSbpcMvm5MoP+PsU3HFSb/Vioo+QEcgTWqVyDNuFGZpkOI2iIBuQCwLmsCwB1JaE/1cCd1fEpOWyiFep0vxwi0ZrtRZQowQd2Ua3UIoaG5u5WoYEMYoH7FFi6Djda4Rf4gxed8rPLE+cNTI/p67OKlbAfr8iz3YZknaH+CXp9pPr7V7xXBCWNxo5DnFPeeqqrxjTAbkeg/Rp2hJeN7/zi0TSWKDUTXfkuUNyewHOHb7M+MIvC1F1CtmqLuU3h8RDINYgPtZTtTk68YBmOG88xYTtClr4kKxmp1scrV3nJ7af+IGoVKZpRAwBJYT3HV33vzO9W35zl14eZ0vVuNoHMNsh9uDxjCwRyPtQzVpQuTIYnHHoO5R17XyIfe599BOSBAGimciprURN3llC2H8YhRtMilQRYvEDVsC+mVZmGAeEdQ5o/AehnpBuVKErRBzotWe6bNMkIQqWfwCLQFBb6ap1gT5hbacrJM4AlaPgOdQsyX9npd3yN/tzjVA1IqWLnoaEXq9EfWXhBuT+juMfSQ2Y8bPbpBKZmWWL06T2fVkaZJN0VFtBXGi0XRFJngPskApLunZOfBYq831jSi8/Z937QVTQKWwOz6rLE8covE3mxJ53gDVcOlvqD9s/NGXbmnt2GnlWhVKpzhTIJ812Hr050/2AI9ZmWnv+ypSqeQ3l0BFh4D+xfk5NRv+dKbxANheZnfZMhR6u8F+jX/W3hUtNCIMQc2vLSQ',
95 version: '0.3', 95 version: '0.3',
96 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 96 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
97 updateDate: 'Wed Jan 20 16:54:56 CET 2010', 97 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
98 accessDate: 'Wed Jan 20 16:54:56 CET 2010', 98 accessDate: 'Wed Jan 20 16:54:56 CET 2010',
99 currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d', 99 currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d',
100 versions: { 100 versions: {
101 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { 101 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
102 header: '####', 102 header: '####',
103 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', 103 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
104 version: '0.3', 104 version: '0.3',
105 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 105 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
106 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 106 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
107 accessDate: 'Wed Jan 20 16:54:26 CET 2010' 107 accessDate: 'Wed Jan 20 16:54:26 CET 2010'
108 }, 108 },
109 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': { 109 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': {
110 header: '####', 110 header: '####',
111 data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ', 111 data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ',
112 version: '0.3', 112 version: '0.3',
113 previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', 113 previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
114 previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==', 114 previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==',
115 creationDate: 'Wed Jan 20 16:54:56 CET 2010', 115 creationDate: 'Wed Jan 20 16:54:56 CET 2010',
116 updateDate: 'Wed Jan 20 16:54:56 CET 2010', 116 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
117 accessDate: 'Wed Jan 20 16:54:56 CET 2010' 117 accessDate: 'Wed Jan 20 16:54:56 CET 2010'
118 } 118 }
119 } 119 }
120 } 120 }
121 } 121 }
122 }, 122 },
123*/ 123
124 124
125 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 125 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126 126
127 /* joe/clipperz*/ 127 /* joe/clipperz*/
128 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 128 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
129 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 129 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
130 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 130 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
131 version: '0.2', 131 version: '0.2',
132 maxNumberOfRecords: '100', 132 maxNumberOfRecords: '100',
133 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17","6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162":"18"},"data":"bslM8REnwweoruhrPH7r0uyrlhAJYGqjeihmeywlb2ZoyQnU1OmzbTxI7JmHzcwJ/LVmO3Zv1GqwVMO9nsxcPlix3tDdPU8uUj21Z5M6qk4qllVxWQ3CCetH1TkrCPDxmTdIEk06j+1BM+PM4XDM0ngE9TGhXd2PVTk+gQDnevV5fhc2QcOtY156dWDlPmPVEV4RBwAwG/Xv1hTK4jpdgv+6PCOEz/jkIfgPUevGOYmL7xA77U2AzIkeO9UBnecUwQ6G2RJeVs98IidDzpg4/PTrGdy6eGK02J2lLaYsDjlYD0yvfhpyVAkAHDMQa5T2OGJnoAlX8ClPzPP3/JIQD4J/PEg6mp1CBzq+2ryoGoCY11N85PlDs9OtWpA8LTsiEUA9OIBwbzh97/dfzTREqK+zDm9wxFAmd5DEzG5OwoN7imQ40nh9njnA+SnF6At4YIUAbKsIYgyHsRMRktBWvdHQ1eUh/Q7aLQEuyCm8lPVvLVV3ky+bEJqPt6NMOmfW77ndoUefm6c2tjX3HWHhmOsfr7zdGqYelHyYJXt3bdVAaINcCYn8xZuO6dJLKRA2zzyJG7ondG2WXZJz2oABvoVknB6wdl8ksbeIxzatAjLTR3uF1LXwPGmaqQTxG45CsZDwhSytxuz393zgPiH4DKHsk17zrpNj6YFX0o4Xl56LCWG0t2ynEFjuW9aheFGEpSrZk8SFXVCn/7EDOP21IMTuRk3oHjrGqDlTH6rhMMlEfZKXzwGtI2EpyqnkZr3AdRKdr/GrwOor5qAH1Ar1FCG7hGkg5bWfl4+/LLadyZEPFdLf9hc10q2qqyLA6XHasF43BYnl3aCDu9+n8gmgGY4IBJRB9kXS19P94SbEsASc8gERt6uKHhT1L5rT2qC7L6kCmD2qi8lPd5QttS8pDXS5qfr1+BshyMx18LszCijsLPweIobYWc/+dSXB6PZloZhgT3SL1JRGCCSPE9zTgAs6YCQbUqMBzMg42xAGE6PuoGrTtYgRLLLBH5qVrgVzvhfmp8aixupDysnoGuab99jv1r4YH9Ynk2+2oGwTFJP0HzV2k1ocD1fZq8a93VeZBQtJcTNqyYi4/Fm02uVA1rq397QeGXaUxoC4fy0ItqjI/l/PVsh+oIf820D/5e4+s09BVVPUmnkKYFxrzkzw3VUo7sRS+oeokeDcASFeHWI3e+W3GhUtRmp5hiU1+X6WdRfmnlMJU68p1MFWuwxHVFqgFYLtFAhWeyUw9dwhOMxItQEo0q3KNlsMmzkxsAkyN2vNrMGS6FoD0i+QmQSRg9fkH927+Mp7i2C4XA9ZmZVyhLE9u3BuNimFfoE3aqSLZEU5ECNrCk2k7Os5Jj0gPrACy0kJUfveUX3FSGHHXsOFCngDJA+cRY9Yd5BRYD11VR15cDuMD0sEYWT9KAis6bVqXdWW+LWWzIeBb3tQvHWj994PBrgrR/RZX6z/8O19L0iiwTOia/Uqu7OCipOUcj5iV5nx6iaGnQEkcO25a4wesU20nfZCfqZwXoIDXLjWJU8uHmdOsMsgmDiaKF5Xz+2jFrW5umZkFypJ6d7Hd/1y7MDGiH9iqHhUUaK0vkthFAuyzm6oR7q4TRRmkkFfjf6twQtY5MxEjP3jSaVxaalMdeLFAQFd+GM3VDeurjZazFDrKwDolkaBwUFcT8ZPkTmS1N2ofMyShY+SOyluA5IM96vePw1RoSAxWEoNhbTC24M1vIc2FeLXJuVcArZmemiY6nYKe4fYBpXapk5NW5mHkJpIrFmAC3g4BSQE6QIp5ShmKF9WfleTLdfcQflY5w6yKXR+Gb1mcTrNv/KPgwDJY+Fv706wNjaSsflX1DMzQLfkkGiqO0S1uSNN0GxgNCNF97fbHPf0oOIiLw4Ct/kU03zz9fxRm+8cyPCbNG3QerYH0qmsvf9qEyFPg1qgPmkERhOXGRLWkeUeXdsMg7rznjtvw2uxik1gBF7udq/W7nK2LSD+EdRite2BgPVQCbZfYO8qn6w+nDDyqXKFoMKFtuJS5uDq996oLrv2slc2QERMoITHoFet6l7a0/Hidbgs9ckEGSAFn+UZaTEifoHz+eWiwlhggEp4qz1CrfK8Ix0AQ+GZbDjjtrr1O4IvZIeQlLxYZnukqtXGEnMFgy3rbYq7/bEDbBumFG5ywsqjwKFM3K+KMGfrY+/YH7Yu9P3rUM7qB3UVt/Zcbn5BbIS5NI7neermcmAUIxUol+l53ybmqpZJ4AmtzxhPYiX/SUqlBU489aaTCJ8PbLWDhKBI5JjmiYS61XK63sNRYFEffxpN/veQiLrwlW8jDpI3mVQdkC1syWt8yvYsRFEmyxi0/lz8aYfE/S5IVxFwwEll+nqaTa8yW7/HlSWTKiP9AkAEfhyRCHN+RenFpGq6sXDH/fb0xVHtQ3xkVU/Jy6XzFFOCwQfFBrILV2P5UkvWQyqTyRUw8Z8COklMzdr45jfP4O2dHQ0UZXQmD5nSZjdbhG3WOkgHdO8KHK/reffKaOyW/1kyy6TuonZbgP6P6MCHxXQLCLMPFvzEUn5UBHGlGcauk+BifsX4XlkBpx/0XxzQx3j0tzgSFWsj7bEi3aaTy4kk"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20","75f306bd520b483e86a1b436d94159020197df0155ab9058fb86586925223dc7":"21"},"data":"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"},"preferences":{"data":"fwQt+Wxhev563xviKvItHr3k5MC7ciMmEayJZ7HfwTcWPqaF5Syf1czPlMQiDQzEgWWs4BmQqB0QCDDMi3VyGCrSzAtIMR4afVdRyQ=="},"oneTimePasswords":{"data":"8WhmNFYrgxqzrJwMx+goddfLb2wlXnREHH77BKpL8h4ZalAwNOAt0yoBMECtlnNcve8ufjGAXL80dgUgtqsTn8fpx7+WDL5fNynv5ve9mJq/qgqctQO+pvnLuvs4867NXYInHr84f+t8f0lyfYRQdpDJfem9ECrn5MrpQ1rvwB2PVKcU0f+VPGhu673QeDbqzF+95JfxF9Tnv1PAePL1EGahUYuxTED4y4fcVmsHKl9yZXcsuheM7ecik93cqOVSlnuN+s5c2KWqjgDdLzUjG2dDHcuY97v7JT7Pns4ad5C9i2dYLtNrSHG7QLw6RBS/EnBwGzK+sWFQFCU8u0qSeFb0eGRjvVb9SfIXSeTqAJK3JC+OLAVGiey34jFckykeQjy5nPjhSpqWWhZdpezvZHno3YCXSGkLqbazL6xtesNaZZAbHBKdrwIOuTdhMwArfX/na/gavciFM0zwGb13w6JX3Ar3iTqhnBR20zmv5vcZwIOjf36LSfSNnjT4sWE1Az+FQPmMPQi4ODHfLSJbwYQhwqM5Wq2yXHpKDf/e2RpBZ5JsUkDEyoGmglcLF+pXwk4Mn9LuNOztxXCRWaZ3M/5uVk4xXOqJax1IlnA4nlu+3N0orF5ipRwd7BfmQekiYyp69m9SJA=="},"version":"0.1"}', 133 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17","6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162":"18"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20","75f306bd520b483e86a1b436d94159020197df0155ab9058fb86586925223dc7":"21"},"data":"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"},"preferences":{"data":"fwQt+Wxhev563xviKvItHr3k5MC7ciMmEayJZ7HfwTcWPqaF5Syf1czPlMQiDQzEgWWs4BmQqB0QCDDMi3VyGCrSzAtIMR4afVdRyQ=="},"oneTimePasswords":{"data":"8WhmNFYrgxqzrJwMx+goddfLb2wlXnREHH77BKpL8h4ZalAwNOAt0yoBMECtlnNcve8ufjGAXL80dgUgtqsTn8fpx7+WDL5fNynv5ve9mJq/qgqctQO+pvnLuvs4867NXYInHr84f+t8f0lyfYRQdpDJfem9ECrn5MrpQ1rvwB2PVKcU0f+VPGhu673QeDbqzF+95JfxF9Tnv1PAePL1EGahUYuxTED4y4fcVmsHKl9yZXcsuheM7ecik93cqOVSlnuN+s5c2KWqjgDdLzUjG2dDHcuY97v7JT7Pns4ad5C9i2dYLtNrSHG7QLw6RBS/EnBwGzK+sWFQFCU8u0qSeFb0eGRjvVb9SfIXSeTqAJK3JC+OLAVGiey34jFckykeQjy5nPjhSpqWWhZdpezvZHno3YCXSGkLqbazL6xtesNaZZAbHBKdrwIOuTdhMwArfX/na/gavciFM0zwGb13w6JX3Ar3iTqhnBR20zmv5vcZwIOjf36LSfSNnjT4sWE1Az+FQPmMPQi4ODHfLSJbwYQhwqM5Wq2yXHpKDf/e2RpBZ5JsUkDEyoGmglcLF+pXwk4Mn9LuNOztxXCRWaZ3M/5uVk4xXOqJax1IlnA4nlu+3N0orF5ipRwd7BfmQekiYyp69m9SJA=="},"version":"0.1"}',
134 statistics: 's6W+Nlk1/14i/BN4u7qN8oTc', 134 statistics: 's6W+Nlk1/14i/BN4u7qN8oTc',
135 userDetailsVersion: '0.3', 135 userDetailsVersion: '0.3',
136 records: { 136 records: {
137 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 137 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
138 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 138 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
139 version: '0.2', 139 version: '0.2',
140 creationDate: 'Wed Mar 14 07:46:44 PDT 2007', 140 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
141 updateDate: 'Wed Mar 14 07:46:44 PDT 2007', 141 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
142 accessDate: 'Fri Jan 08 12:38:42 PST 2010', 142 accessDate: 'Fri Jan 08 12:38:42 PST 2010',
143 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 143 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
144 versions: { 144 versions: {
145 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 145 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
146 header: '####', 146 header: '####',
147 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 147 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
148 version: '0.2', 148 version: '0.2',
149 creationDate: 'Wed Mar 14 07:46:44 PDT 2007', 149 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
150 updateDate: 'Wed Mar 14 07:46:44 PDT 2007', 150 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
151 accessDate: 'Fri Jan 08 12:38:42 PST 2010' 151 accessDate: 'Fri Jan 08 12:38:42 PST 2010'
152 } 152 }
153 } 153 }
154 }, 154 },
155 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 155 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
156 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', 156 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
157 version: '0.3', 157 version: '0.3',
158 creationDate: 'Fri Oct 17 07:49:20 PDT 2008', 158 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
159 updateDate: 'Mon Oct 27 00:58:49 PDT 2008', 159 updateDate: 'Mon Oct 27 00:58:49 PDT 2008',
160 accessDate: 'Tue Jan 05 01:16:38 PST 2010', 160 accessDate: 'Tue Jan 05 01:16:38 PST 2010',
161 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 161 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
162 versions: { 162 versions: {
163 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 163 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
164 header: '####', 164 header: '####',
165 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 165 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
166 version: '0.3', 166 version: '0.3',
167 creationDate: 'Fri Oct 17 08:00:31 PDT 2008', 167 creationDate: 'Fri Oct 17 08:00:31 PDT 2008',
168 updateDate: 'Fri Oct 17 08:00:31 PDT 2008', 168 updateDate: 'Fri Oct 17 08:00:31 PDT 2008',
169 accessDate: 'Fri Oct 17 08:00:31 PDT 2008' 169 accessDate: 'Fri Oct 17 08:00:31 PDT 2008'
170 }, 170 },
171 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 171 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
172 header: '####', 172 header: '####',
173 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 173 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
174 version: '0.3', 174 version: '0.3',
175 creationDate: 'Fri Oct 17 07:49:20 PDT 2008', 175 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
176 updateDate: 'Fri Oct 17 07:49:20 PDT 2008', 176 updateDate: 'Fri Oct 17 07:49:20 PDT 2008',
177 accessDate: 'Fri Oct 17 07:54:23 PDT 2008' 177 accessDate: 'Fri Oct 17 07:54:23 PDT 2008'
178 }, 178 },
179 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 179 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
180 header: '####', 180 header: '####',
181 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 181 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
182 version: '0.3', 182 version: '0.3',
183 creationDate: 'Fri Oct 17 08:00:13 PDT 2008', 183 creationDate: 'Fri Oct 17 08:00:13 PDT 2008',
184 updateDate: 'Fri Oct 17 08:00:13 PDT 2008', 184 updateDate: 'Fri Oct 17 08:00:13 PDT 2008',
185 accessDate: 'Fri Oct 17 08:00:13 PDT 2008' 185 accessDate: 'Fri Oct 17 08:00:13 PDT 2008'
186 }, 186 },
187 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 187 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
diff --git a/frontend/gamma/tests/tests/Components/FullApp/index.html b/frontend/gamma/tests/tests/Components/FullApp/index.html
index bc00fa7..966a16c 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/index.html
+++ b/frontend/gamma/tests/tests/Components/FullApp/index.html
@@ -1,118 +1,115 @@
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 - online password manager - debug</title> 28 <title>FullApp TEST - WEB</title>
29 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 29 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
30 30
31 31
32 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 32 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" />
33 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
34 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
35 33
36 <link rel="shortcut icon" href="./clipperz.ico" /> 34 <link rel="shortcut icon" href="./clipperz.ico" />
37 35
38 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> 36 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
39 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 37 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
40
41<script> 38<script>
42 Clipperz_IEisBroken = false; 39 Clipperz_IEisBroken = false;
43 Clipperz_normalizedNewLine = '\n'; 40 Clipperz_normalizedNewLine = '\n';
44 Clipperz_dumpUrl = "/dump/"; 41 Clipperz_dumpUrl = "/dump/";
45</script> 42</script>
46 43
47<!--[if IE]><script> 44<!--[if IE]><script>
48Clipperz_IEisBroken = true; 45Clipperz_IEisBroken = true;
49Clipperz_normalizedNewLine = '\x0d\x0a'; 46Clipperz_normalizedNewLine = '\x0d\x0a';
50</script><![endif]--> 47</script><![endif]-->
51 48
52 49
53 <script type='text/javascript' src='../../../../js/bookmarklet.js'></script> 50 <script type='text/javascript' src='../../../../js/Bookmarklet.js'></script>
54 <script type='text/javascript' src='../../../../js/bookmarklet_ie.js'></script> 51 <script type='text/javascript' src='../../../../js/Bookmarklet_IE.js'></script>
55 52
56 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script> 53 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script>
57 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script> 54 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script>
58 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script> 55 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script>
59 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script> 56 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script>
60 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script> 57 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script>
61 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script> 58 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script>
62 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script> 59 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script>
63 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script> 60 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script>
64 <script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script> 61 <script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script>
65 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script> 62 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script>
66 <script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script> 63 <script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script>
67 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script> 64 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script>
68 <script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script> 65 <script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script>
69 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 66 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 93 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script> 95 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 96 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> 100 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 101 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 102 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 104 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 106 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 107 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 108 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
112 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 109 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
113 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 110 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
114 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 111 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
115 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 112 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
116 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 113 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
117 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 114 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
118 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 115 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
@@ -135,106 +132,102 @@ Clipperz_normalizedNewLine = '\x0d\x0a';
135 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageFooter.js'></script> 132 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageFooter.js'></script>
136 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginPage.js'></script> 133 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginPage.js'></script>
137 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginForm.js'></script> 134 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginForm.js'></script>
138 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginProgress.js'></script> 135 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginProgress.js'></script>
139 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AppPage.js'></script> 136 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AppPage.js'></script>
140 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UserInfoBox.js'></script> 137 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UserInfoBox.js'></script>
141 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TabSidePanel.js'></script> 138 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TabSidePanel.js'></script>
142 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script> 139 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script>
143 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script> 140 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script>
144 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TextColumnManager.js'></script> 141 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TextColumnManager.js'></script>
145 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script> 142 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script>
146 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js'></script> 143 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js'></script>
147 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script> 144 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script>
148 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script> 145 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script>
149 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js'></script> 146 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js'></script>
150 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script> 147 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script>
151 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script> 148 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script>
152 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js'></script> 149 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js'></script>
153 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AccountPanel.js'></script> 150 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AccountPanel.js'></script>
154 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DataPanel.js'></script> 151 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DataPanel.js'></script>
155 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ToolsPanel.js'></script> 152 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ToolsPanel.js'></script>
156 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script> 153 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script>
157 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 154 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
158 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 155 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
159 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script> 156 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
160 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script> 157 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script>
161 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script> 158 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script>
162 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script> 159 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script>
163 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script> 160 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
164 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script> 161 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script>
165 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js'></script> 162 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js'></script>
166 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script> 163 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script>
167 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script> 164 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script>
168 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/LoginController.js'></script> 165 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/LoginController.js'></script>
169 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/AppController.js'></script> 166 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/AppController.js'></script>
170 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script> 167 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script>
171 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script> 168 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script>
172 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script> 169 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script>
173 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js'></script> 170 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js'></script>
174 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 171 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
175 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script> 172 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script>
176 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js'></script> 173 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js'></script>
177 174
178 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js'></script> 175 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js'></script>
179 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/questionMark.js'></script> 176 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/questionMark.js'></script>
180 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/info.js'></script> 177 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/info.js'></script>
181 178
182 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/store.js'></script> 179 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/store.js'></script>
183 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/protect.js'></script> 180 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/protect.js'></script>
184 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/directLogin.js'></script> 181 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/directLogin.js'></script>
185 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/share.js'></script> 182 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/share.js'></script>
186 183
187 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Star/normal.js'></script> 184 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Star/normal.js'></script>
188 185
189 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/look.js'></script> 186 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/look.js'></script>
190 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/download.js'></script> 187 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/download.js'></script>
191 188
192 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/open.js'></script> 189 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/open.js'></script>
193 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/close.js'></script> 190 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/close.js'></script>
194 191
195 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js'></script> 192 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js'></script>
196 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Logo/normal.js'></script> 193 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Logo/normal.js'></script>
197 194
198 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/GraphicFunctions.js'></script> 195 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/GraphicFunctions.js'></script>
199 <!-- script type='text/javascript' src='../../../../js/main.js'></script --> 196 <script type='text/javascript' src='../../../../js/main.js'></script>
200 197
201 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 198 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
202 <script type='text/javascript' src='./User.data.js'></script> 199 <script type='text/javascript' src='./User.data.js'></script>
203 <script type='text/javascript' src='./main_test.js'></script>
204
205 200
206</head> 201</head>
207<body> 202<body>
208<div id="mainDiv"> 203<div id="mainDiv">
209 <div id="loading"> 204 <div id="loading">
210 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a> 205 <div>
211 <h5 class="clipperzPayoff">keep it to yourself!</h5> 206 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a -->
212 <h2>loading ...</h2> 207 <h1>clipperz</h1>
208 <h3 class="clipperzPayoff">keep it to yourself!</h3>
209 <!-- h5>loading ...</h5 -->
210 </div>
213 </div> 211 </div>
214 212
213@js_EMBEDDED@
215 214
216
217</div>
218<div id="applicationVersionType" class="LIVE"></div>
219
220<!-- -->
221<div id="javaScriptAlert">
222 <div class="mask"></div>
223 <div class="message">
224 <div class="header"></div>
225 <div class="body">
226 <div class="alertLogo"></div>
227 <div class="alert">
228 <h1>Attention!</h1>
229 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
230 <h3>Javascript is required to access Clipperz.</h3>
231 <h5>Please enable scripting or upgrade your browser.</h5>
232 </div>
233 </div>
234 <div class="footer"></div>
235 </div>
236</div> 215</div>
237<!-- --> 216<!-- div id="applicationVersionType" class="@application.version.type@"></div -->
217
218<script>
219 //Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
220 /*offline_data_placeholder*/
221
222 MochiKit.DOM.addLoadEvent(function () {
223 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
224
225 var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
226 proxy.dataStore().setupWithEncryptedData(testData['testData']);
227 Clipperz.PM.Proxy.defaultProxy = proxy;
228 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'tt', passphrase:'tt'});
229 });
230</script>
238 231
239</body> 232</body>
240</html> 233</html>
diff --git a/frontend/gamma/tests/tests/Components/FullApp/main_test.js b/frontend/gamma/tests/tests/Components/FullApp/main_test.js
deleted file mode 100644
index b13972a..0000000
--- a/frontend/gamma/tests/tests/Components/FullApp/main_test.js
+++ b/dev/null
@@ -1,111 +0,0 @@
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
26function _pm_logEvent(anEvent) {
27 //console.log("####", anEvent);
28
29 anEvent.preventDefault();
30}
31
32function handleGenericDeferredError(anError) {
33 var result;
34
35 if (anError instanceof MochiKit.Async.CancelledError) {
36 result = anError;
37 } else {
38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
39//console.log(anError);
40 result = new MochiKit.Async.CancelledError(anError);
41 }
42
43 return result;
44}
45
46
47Clipperz.PM.RunTime = {};
48
49
50function run() {
51 var shouldShowRegistrationForm;
52 var useCompactDesign;
53 var controllerParameters;
54 //var iPhoneDesign;
55
56 //MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent);
57 //MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent);
58 //MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent);
59
60 controllerParameters = {};
61
62 MochiKit.DOM.removeElement('javaScriptAlert');
63 Clipperz.PM.Strings.Languages.initSetup();
64
65 if (window.location.search.indexOf('registration') != -1) {
66 shouldShowRegistrationForm = true;
67 } else {
68 shouldShowRegistrationForm = false;
69 }
70
71 if (window.location.search.indexOf('autocomplete') != -1) {
72 controllerParameters['autocomplete'] = 'on'
73 }
74
75 //if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) {
76 // iPhoneDesign = true;
77 //} else {
78 // iPhoneDesign = false;
79 //}
80
81 if (window.location.search.indexOf('compact') != -1) {
82 useCompactDesign = true;
83 } else {
84 useCompactDesign = false;
85 }
86
87 if (useCompactDesign == true) {
88 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters);
89 //} else if (iPhoneDesign == true) {
90 // Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController();
91 } else {
92 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters);
93 }
94
95 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm);
96
97//Clipperz.log("HASH: " + window.location.hash);
98 //if (window.location.hash != "") {
99 // window.location.hash = ""
100 //}
101//Clipperz.log("HASH cleaned");
102 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'})
103 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
104}
105
106Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
107
108var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
109proxy.dataStore().setupWithEncryptedData(testData['testData']);
110
111MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/tests/tests/Components/FullApp/mobile.index.html b/frontend/gamma/tests/tests/Components/FullApp/mobile.index.html
new file mode 100644
index 0000000..818e3d6
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/FullApp/mobile.index.html
@@ -0,0 +1,204 @@
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<!doctype html>
27<!-- Conditional comment for mobile ie7 blogs.msdn.com/b/iemobile/ -->
28<!--[if IEMobile 7 ]> <html class="no-js iem7" lang="en"> <![endif]-->
29<!--[if (gt IEMobile 7)|!(IEMobile)]><!--> <html class="no-js" lang="en" manifest="mobile.appcache"> <!--<![endif]-->
30<head>
31 <title>FullApp TEST - MOBILE</title>
32 <meta charset="utf-8">
33
34 <meta name="HandheldFriendly" content="True">
35 <meta name="MobileOptimized" content="320">
36 <meta name="viewport" content="width=device-width">
37
38<!-- link rel="apple-touch-icon-precomposed" ... -->
39 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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">
40 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,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">
41 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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">
42 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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">
43
44 <meta http-equiv="cleartype" content="on">
45 <meta name="apple-mobile-web-app-capable" content="yes">
46
47 <link rel="stylesheet" type="text/css" href="../../../../css/mobile.css" />
48 <!-- link rel="stylesheet" type="text/css" href="../../../../css/jqtouch.css" / -->
49 <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" -->
50
51<script>
52 Clipperz_IEisBroken = false;
53 Clipperz_normalizedNewLine = '\n';
54 Clipperz_dumpUrl = "/dump/";
55 'use strict';
56
57 if (typeof(MochiKit) == 'undefined') {
58 MochiKit = {};
59 }
60 MochiKit['__export__'] = false;
61</script>
62 <!-- Zepto.js modules: polyfill zepto event detect fx ajax form apple-touch-icon-->
63 <script type='text/javascript' src='../../../../js/Zepto/polyfill.js'></script>
64 <script type='text/javascript' src='../../../../js/Zepto/zepto.js'></script>
65 <script type='text/javascript' src='../../../../js/Zepto/event.js'></script>
66 <script type='text/javascript' src='../../../../js/Zepto/detect.js'></script>
67 <script type='text/javascript' src='../../../../js/Zepto/fx.js'></script>
68 <script type='text/javascript' src='../../../../js/Zepto/ajax.js'></script>
69 <script type='text/javascript' src='../../../../js/Zepto/form.js'></script>
70 <script type='text/javascript' src='../../../../js/Zepto/touch.js'></script>
71 <script type='text/javascript' src='../../../../js/Zepto/gesture.js'></script>
72
73 <script type='text/javascript' src='../../../../js/JQTouch/jqtouch.js'></script>
74
75 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script>
76 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script>
77 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script>
78 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script>
79 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script>
80 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script>
81 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script>
82 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script>
83 <!-- script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script -->
84 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script>
85 <!-- script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script -->
86 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script>
87 <!-- script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script -->
88
89 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
90
91 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
93
94 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
97 <!-- script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script -->
98 <!-- script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script -->
99 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
103 <!-- script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script -->
104 <!-- script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script -->
105 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
112 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
113 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
114
115 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
116 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
117 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
118 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
119
120 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
121 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
122 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script>
123 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
124 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
125
126 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
127 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
128 <script type='text/javascript' src='../../../../js/Clipperz/PM/PIN.js'></script>
129
130 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
131 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
132 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
133 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
134 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
135 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
136 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
137 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
138 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
139 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
140 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
141 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
142 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
143 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
144
145 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
146<!--
147 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
148 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script -->
149
150<!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script -->
151 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script -->
152<!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js'></script -->
153<!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script -->
154<!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script -->
155<!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script -->
156
157 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script -->
158 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script -->
159<!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script -->
160<!-- script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/WizardController.js'></script -->
161
162 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Mobile/Components/LoginForm.js'></script>
163 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Mobile/Components/CardList.js'></script>
164 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Mobile/Components/CardDetail.js'></script>
165
166 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Mobile/Controllers/MainController.js'></script>
167 <script type='text/javascript' src='../../../../js/main.mobile.js'></script>
168
169 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
170 <script type='text/javascript' src='./User.data.js'></script>
171</head>
172<body>
173<div id="mainDiv">
174 <div id="loading">
175 <div>
176 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a -->
177 <h1>clipperz</h1>
178 <h3 class="clipperzPayoff">keep it to yourself!</h3>
179 <!-- h5>loading ...</h5 -->
180 </div>
181 </div>
182
183</div>
184<!-- div id="applicationVersionType" class="@application.version.type@"></div -->
185
186<script>
187 //Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
188 /*offline_data_placeholder*/
189
190 var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
191 proxy.dataStore().setupWithEncryptedData(testData['testData']);
192 Clipperz.PM.Proxy.defaultProxy = proxy;
193
194 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
195 //Clipperz.PM.PIN.setCredentialsWithPIN("1234", {username:'joe', passphrase:'clipperz'});
196
197 MochiKit.DOM.addLoadEvent(function () {
198 // MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', { credentials: {username:'joe', passphrase:'clipperz'} }, function () { alert("Doh"); } );
199 });
200
201</script>
202
203</body>
204</html>