summaryrefslogtreecommitdiff
path: root/frontend/gamma/js/Clipperz/PM/UI/Web
Unidiff
Diffstat (limited to 'frontend/gamma/js/Clipperz/PM/UI/Web') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js24
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js27
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js24
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js25
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js28
44 files changed, 442 insertions, 580 deletions
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 d6b0574..82c8dfd 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.AccountPanel = function(args) { 26Clipperz.PM.UI.Web.Components.AccountPanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments);
32 30
33 //this._initiallySelectedTab = args.selected || 'ACCOUNT'; 31 //this._initiallySelectedTab = args.selected || 'ACCOUNT';
34 this._initiallySelectedTab = args.selected || 'PASSPHRASE'; 32 this._initiallySelectedTab = args.selected || 'PASSPHRASE';
35 this._tabPanelControllerConfiguration = { 33 this._tabPanelControllerConfiguration = {
36 // 'ACCOUNT': { 34 // 'ACCOUNT': {
37 // tab:'accountTab', 35 // tab:'accountTab',
38 // panel:'accountPanel' 36 // panel:'accountPanel'
39 // }, 37 // },
40 'PASSPHRASE': { 38 'PASSPHRASE': {
41 tab:'passphraseTab', 39 tab:'passphraseTab',
42 panel:'passphrasePanel' 40 panel:'passphrasePanel'
43 }, 41 },
44 'OTP': { 42 'OTP': {
45 tab:'OTPTab', 43 tab:'OTPTab',
46 panel:'OTPPanel' 44 panel:'OTPPanel'
47 }, 45 },
48 'PREFERENCES': { 46 'PREFERENCES': {
49 tab:'preferencesTab', 47 tab:'preferencesTab',
50 panel:'preferencesPanel' 48 panel:'preferencesPanel'
51 }, 49 },
52 'LOGIN_HISTORY': { 50 'LOGIN_HISTORY': {
53 tab:'loginHistoryTab', 51 tab:'loginHistoryTab',
54 panel:'loginHistoryPanel' 52 panel:'loginHistoryPanel'
55 } 53 }
56 }; 54 };
57 55
58 return this; 56 return this;
59} 57}
60 58
61//============================================================================= 59//=============================================================================
62 60
63Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 61Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'toString': function () { 65 'toString': function () {
68 return "Clipperz.PM.UI.Web.Components.AccountPanel component"; 66 return "Clipperz.PM.UI.Web.Components.AccountPanel component";
69 }, 67 },
70 68
71 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
72 70
73 'renderSelf': function(/*aContainer, aPosition*/) { 71 'renderSelf': function(/*aContainer, aPosition*/) {
74//Clipperz.log("AccountPanel.renderSelf element", this.element()); 72//Clipperz.log("AccountPanel.renderSelf element", this.element());
75 this.append(this.element(), [ 73 this.append(this.element(), [
76 {tag:'div', cls:'header', children:[ 74 {tag:'div', cls:'header', children:[
77 {tag:'div', cls:'subPanelTabs', children:[ 75 {tag:'div', cls:'subPanelTabs', children:[
78 {tag:'ul', children:[ 76 {tag:'ul', children:[
79 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'}, 77 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'},
80 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'}, 78 {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'}]}, 79 {tag:'li', id:this.getId('OTPTab'), children:[{tag:'a', href:'#', html:'One Time Passwords'}]},
82 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]}, 80 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]},
83 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]} 81 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]}
84 ]} 82 ]}
85 ]} 83 ]}
86 ]}, 84 ]},
87 {tag:'div', cls:'body', children:[ 85 {tag:'div', cls:'body', children:[
88 {tag:'div', cls:'accountPanel', children:[ 86 {tag:'div', cls:'accountPanel', children:[
89 {tag:'div', cls:'subPanelContent', children:[ 87 {tag:'div', cls:'subPanelContent', children:[
90 {tag:'ul', children:[ 88 {tag:'ul', children:[
91 // {tag:'li', id:this.getId('accountPanel'),children:[ 89 // {tag:'li', id:this.getId('accountPanel'),children:[
92 // {tag:'h3', html:"-- Account --"} 90 // {tag:'h3', html:"-- Account --"}
93 // ]}, 91 // ]},
94 {tag:'li', id:this.getId('passphrasePanel'),children:[ 92 {tag:'li', id:this.getId('passphrasePanel'),children:[
95 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"}, 93 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"},
96 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[ 94 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[
97 {tag:'div', cls:'currentCredentials', children:[ 95 {tag:'div', cls:'currentCredentials', children:[
98 {tag:'div', cls:'field username', children:[ 96 {tag:'div', cls:'field username', children:[
99 {tag:'label', html:"username", 'for':this.getId('currentUsername')}, 97 {tag:'label', html:"username", 'for':this.getId('currentUsername')},
100 {tag:'input', id:this.getId('currentUsername')} 98 {tag:'input', id:this.getId('currentUsername')}
101 ]}, 99 ]},
102 {tag:'div', cls:'field passphrase', children:[ 100 {tag:'div', cls:'field passphrase', children:[
103 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')}, 101 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')},
104 {tag:'input', id:this.getId('currentPassphrase')} 102 {tag:'input', id:this.getId('currentPassphrase')}
105 ]} 103 ]}
106 ]}, 104 ]},
107 {tag:'div', cls:'newPassphrase', children:[ 105 {tag:'div', cls:'newPassphrase', children:[
108 {tag:'div', cls:'field', children:[ 106 {tag:'div', cls:'field', children:[
109 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')}, 107 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')},
110 {tag:'input', id:this.getId('newPassphrase')} 108 {tag:'input', id:this.getId('newPassphrase')}
111 ]}, 109 ]},
112 {tag:'div', cls:'field', children:[ 110 {tag:'div', cls:'field', children:[
113 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')}, 111 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')},
114 {tag:'input', id:this.getId('reNewPassphrase')} 112 {tag:'input', id:this.getId('reNewPassphrase')}
115 ]} 113 ]}
116 ]}, 114 ]},
117 {tag:'div', cls:'confirm', children:[ 115 {tag:'div', cls:'confirm', children:[
118 {tag:'input', type:'checkbox', id:this.getId('confirm')}, 116 {tag:'input', type:'checkbox', id:this.getId('confirm')},
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
index 3b3c8b4..da5fd76 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
@@ -1,75 +1,73 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.AppPage = function(args) { 26Clipperz.PM.UI.Web.Components.AppPage = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args); 28 Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args);
31 29
32 this._element = args.element || null; 30 this._element = args.element || null;
33 31
34 this._slots = { 32 this._slots = {
35 'cardGrid' : this.getId('cardGrid'), 33 'cardGrid' : this.getId('cardGrid'),
36 // 'directLoginGrid' : this.getId('directLoginGrid'), 34 // 'directLoginGrid' : this.getId('directLoginGrid'),
37 'accountPanel': this.getId('accountPanel'), 35 'accountPanel': this.getId('accountPanel'),
38 'dataPanel': this.getId('dataPanel'), 36 'dataPanel': this.getId('dataPanel'),
39 'toolsPanel': this.getId('toolsPanel'), 37 'toolsPanel': this.getId('toolsPanel'),
40 'userInfoBox': this.getId('userInfoBox'), 38 'userInfoBox': this.getId('userInfoBox'),
41 'tabSidePanel': this.getId('tabSidePanel') 39 'tabSidePanel': this.getId('tabSidePanel')
42 }; 40 };
43 41
44 return this; 42 return this;
45} 43}
46 44
47//============================================================================= 45//=============================================================================
48 46
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, { 47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'toString': function () { 51 'toString': function () {
54 return "Clipperz.PM.UI.Web.Components.AppPage component"; 52 return "Clipperz.PM.UI.Web.Components.AppPage component";
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'renderSelf': function(/*aContainer, aPosition*/) { 57 'renderSelf': function(/*aContainer, aPosition*/) {
60 this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'}); 58 this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'});
61 this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'}); 59 this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'});
62 this.append(this.getId('sidePanels'),{tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]}); 60 this.append(this.getId('sidePanels'),{tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]});
63 61
64 this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'}); 62 this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
65 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}); 63 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
66 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'}); 64 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'});
67 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'}); 65 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'});
68 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'}); 66 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'});
69 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'}); 67 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'});
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 __syntaxFix__: "syntax fix" 72 __syntaxFix__: "syntax fix"
75}); 73});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
index 1835ca9..4cfca32 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
@@ -1,106 +1,104 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) { 26Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments);
32 MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs'); 30 MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs');
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
40 38
41 //------------------------------------------------------------------------- 39 //-------------------------------------------------------------------------
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component"; 42 return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'renderSelf': function() { 47 'renderSelf': function() {
50 // var bookmarkletUrl; 48 // var bookmarkletUrl;
51// 49//
52 // if (Clipperz_IEisBroken == true) { 50 // if (Clipperz_IEisBroken == true) {
53 // bookmarkletUrl = bookmarklet_ie; 51 // bookmarkletUrl = bookmarklet_ie;
54 // } else { 52 // } else {
55 /// bookmarkletUrl = bookmarklet; 53 /// bookmarkletUrl = bookmarklet;
56 // bookmarkletUrl = Clipperz.PM.Strings['bookmarklet']; 54 // bookmarkletUrl = Clipperz.PM.Strings['bookmarklet'];
57 // } 55 // }
58 56
59 this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [ 57 this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [
60 {tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[ 58 {tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[
61 // {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[ 59 // {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[
62 {tag:'a', id:this.getId('link'), href:'#', children:[ 60 {tag:'a', id:this.getId('link'), href:'#', children:[
63 {tag:'div', cls:'icon'}, 61 {tag:'div', cls:'icon'},
64 {tag:'div', cls:'text', children:[ 62 {tag:'div', cls:'text', children:[
65 {tag:'span', html:"add to Clipperz"} 63 {tag:'span', html:"add to Clipperz"}
66 ]} 64 ]}
67 ]} 65 ]}
68 ]} 66 ]}
69 ]}); 67 ]});
70 68
71 new Clipperz.PM.UI.Common.Components.Tooltip({ 69 new Clipperz.PM.UI.Common.Components.Tooltip({
72 element:this.getElement('linkBlock'), 70 element:this.getElement('linkBlock'),
73 text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.", 71 text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.",
74 position:'BELOW' 72 position:'BELOW'
75 }); 73 });
76 74
77 MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick'); 75 MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick');
78 this.updateBookmarkletURLs(); 76 this.updateBookmarkletURLs();
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'handleOnclick': function (anEvent) { 81 'handleOnclick': function (anEvent) {
84 anEvent.preventDefault(); 82 anEvent.preventDefault();
85 83
86Clipperz.log("BOOKMARKLET CLICK"); 84Clipperz.log("BOOKMARKLET CLICK");
87 }, 85 },
88 86
89 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
90 88
91 'updateBookmarkletURLs': function () { 89 'updateBookmarkletURLs': function () {
92 var bookmarkletUrl; 90 var bookmarkletUrl;
93 91
94 if (Clipperz_IEisBroken == true) { 92 if (Clipperz_IEisBroken == true) {
95 bookmarkletUrl = bookmarklet_ie; 93 bookmarkletUrl = bookmarklet_ie;
96 } else { 94 } else {
97 // bookmarkletUrl = bookmarklet; 95 // bookmarkletUrl = bookmarklet;
98 bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet'); 96 bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet');
99 } 97 }
100 98
101 this.getElement('link').href = bookmarkletUrl; 99 this.getElement('link').href = bookmarkletUrl;
102 }, 100 },
103 101
104 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
105 __syntaxFix__: "syntax fix" 103 __syntaxFix__: "syntax fix"
106}); 104});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
index af33d85..8bb64f5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._tabPanelController = null; 31 this._tabPanelController = null;
34 32
35 this._tabPanelControllerConfiguration = { 33 this._tabPanelControllerConfiguration = {
36 'DETAILS': { 34 'DETAILS': {
37 tab:'detailTab', 35 tab:'detailTab',
38 panel:'detailTabpanel' 36 panel:'detailTabpanel'
39 }, 37 },
40 'DIRECT_LOGINS': { 38 'DIRECT_LOGINS': {
41 tab:'directLoginTab', 39 tab:'directLoginTab',
42 panel:'directLoginTabpanel' 40 panel:'directLoginTabpanel'
43 }, 41 },
44 'SHARING': { 42 'SHARING': {
45 tab:'sharingTab', 43 tab:'sharingTab',
46 panel:'sharingTabpanel' 44 panel:'sharingTabpanel'
47 } 45 }
48 }; 46 };
49 47
50 this._tooltips = null; 48 this._tooltips = null;
51 49
52 this._isSavingEnabled = false; 50 this._isSavingEnabled = false;
53 this._hintMode = 'OFF'; //'ON' 51 this._hintMode = 'OFF'; //'ON'
54 52
55 this._fieldComponents = {}; 53 this._fieldComponents = {};
56 this._directLoginComponents = {}; 54 this._directLoginComponents = {};
57 55
58 this._displayMode = 'fixed'; //'scrollable'; 56 this._displayMode = 'fixed'; //'scrollable';
59 57
60 return this; 58 return this;
61} 59}
62 60
63//============================================================================= 61//=============================================================================
64 62
65Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 63Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
66 64
67 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
68 66
69 'toString': function () { 67 'toString': function () {
70 return "Clipperz.PM.UI.Web.Components.CardDialogComponent component"; 68 return "Clipperz.PM.UI.Web.Components.CardDialogComponent component";
71 }, 69 },
72 70
73 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
74 72
75 'tabPanelController': function () { 73 'tabPanelController': function () {
76 if (this._tabPanelController == null) { 74 if (this._tabPanelController == null) {
77 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 75 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
78 component:this, 76 component:this,
79 configuration:this._tabPanelControllerConfiguration 77 configuration:this._tabPanelControllerConfiguration
80 }); 78 });
81 79
82 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') 80 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
83 } 81 }
84 82
85 return this._tabPanelController; 83 return this._tabPanelController;
86 }, 84 },
87 85
88 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
89 87
90 'renderSelf': function() { 88 'renderSelf': function() {
91 this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [ 89 this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [
92 {tag:'form', id:this.getId('form'), children:[ 90 {tag:'form', id:this.getId('form'), children:[
93 // {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'}, 91 // {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'},
94 {tag:'div', cls:'header', children:[ 92 {tag:'div', cls:'header', children:[
95 {tag:'div', cls:'title', children:[ 93 {tag:'div', cls:'title', children:[
96 {tag:'input', type:'text', id:this.getId('title')} 94 {tag:'input', type:'text', id:this.getId('title')}
97 ]} 95 ]}
98 ]}, 96 ]},
99 {tag:'div', id:this.getId('body'), cls:'body', children:[ 97 {tag:'div', id:this.getId('body'), cls:'body', children:[
100 {tag:'div', cls:'tabs', children:[ 98 {tag:'div', cls:'tabs', children:[
101 {tag:'ul', cls:'tabs', children:[ 99 {tag:'ul', cls:'tabs', children:[
102 {tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]}, 100 {tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]},
103 {tag:'li', id:this.getId('directLoginTab'), children:[ 101 {tag:'li', id:this.getId('directLoginTab'), children:[
104 {tag:'span', html:"direct logins"}//, 102 {tag:'span', html:"direct logins"}//,
105 // {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[ 103 // {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[
106 // {tag:'span', html:"+"} 104 // {tag:'span', html:"+"}
107 // ]} 105 // ]}
108 ]}, 106 ]},
109 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]} 107 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]}
110 ]} 108 ]}
111 ]}, 109 ]},
112 {tag:'div', cls:'tabPanels', children:[ 110 {tag:'div', cls:'tabPanels', children:[
113 {tag:'ul', cls:'tabPanels', children:[ 111 {tag:'ul', cls:'tabPanels', children:[
114 {tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[ 112 {tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[
115 {tag:'div', id:this.getId('recordFields'), children:[ 113 {tag:'div', id:this.getId('recordFields'), children:[
116 {tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[ 114 {tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[
117 {tag:'thead', children:[ 115 {tag:'thead', children:[
118 {tag:'tr', children:[ 116 {tag:'tr', children:[
@@ -589,290 +587,286 @@ Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz
589 //------------------------------------------------------------------------- 587 //-------------------------------------------------------------------------
590 588
591 'toggleLock': function (aFieldKey, anEvent) { 589 'toggleLock': function (aFieldKey, anEvent) {
592 var shouldRedrawAsLocked; 590 var shouldRedrawAsLocked;
593 var currentTRElement; 591 var currentTRElement;
594 592
595 anEvent.preventDefault(); 593 anEvent.preventDefault();
596 594
597 currentTRElement = Clipperz.DOM.get(aFieldKey); 595 currentTRElement = Clipperz.DOM.get(aFieldKey);
598 shouldRedrawAsLocked = (MochiKit.DOM.hasElementClass(currentTRElement, 'locked') ? false : true); 596 shouldRedrawAsLocked = (MochiKit.DOM.hasElementClass(currentTRElement, 'locked') ? false : true);
599 597
600 this.renderFieldTR(currentTRElement, { 598 this.renderFieldTR(currentTRElement, {
601 label:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldLabel input'])[0].value, 599 label:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldLabel input'])[0].value,
602 value:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldValue input'])[0].value 600 value:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldValue input'])[0].value
603 }, shouldRedrawAsLocked, MochiKit.DOM.hasElementClass(currentTRElement, 'new')); 601 }, shouldRedrawAsLocked, MochiKit.DOM.hasElementClass(currentTRElement, 'new'));
604 }, 602 },
605 603
606 //========================================================================= 604 //=========================================================================
607 605
608 'fixNotesHeight': function () { 606 'fixNotesHeight': function () {
609 var element; 607 var element;
610 608
611 element = this.getElement('recordNote'); 609 element = this.getElement('recordNote');
612 610
613 if (element.scrollHeight == 0) { 611 if (element.scrollHeight == 0) {
614 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixNotesHeight')); 612 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixNotesHeight'));
615 } else { 613 } else {
616 var textareaHeight; 614 var textareaHeight;
617 615
618 textareaHeight = Math.min(Math.max(50, element.scrollHeight), 500); 616 textareaHeight = Math.min(Math.max(50, element.scrollHeight), 500);
619 617
620 MochiKit.Style.setElementDimensions(element, {h:textareaHeight}, 'px'); 618 MochiKit.Style.setElementDimensions(element, {h:textareaHeight}, 'px');
621 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixRendering')); 619 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixRendering'));
622 } 620 }
623 }, 621 },
624 622
625 //------------------------------------------------------------------------- 623 //-------------------------------------------------------------------------
626 624
627 'fixRendering': function () { 625 'fixRendering': function () {
628 // varheight; 626 // varheight;
629 var y; 627 var y;
630 varscrollHeight; 628 varscrollHeight;
631 var viewportHeight; 629 var viewportHeight;
632 var viewportY; 630 var viewportY;
633 var footerElement; 631 var footerElement;
634 var footerElementPosition; 632 var footerElementPosition;
635 var footerElementDimensions; 633 var footerElementDimensions;
636 var footerComputedHeight; 634 var footerComputedHeight;
637 635
638 // height = MochiKit.Style.getElementDimensions(this.displayElement())['h']; 636 // height = MochiKit.Style.getElementDimensions(this.displayElement())['h'];
639 y = MochiKit.Style.getElementPosition(this.displayElement())['y']; 637 y = MochiKit.Style.getElementPosition(this.displayElement())['y'];
640 638
641 footerElement = MochiKit.Selector.findChildElements(this.displayElement(), ['div.footer'])[0]; 639 footerElement = MochiKit.Selector.findChildElements(this.displayElement(), ['div.footer'])[0];
642 footerElementPosition = MochiKit.Style.getElementPosition(footerElement); 640 footerElementPosition = MochiKit.Style.getElementPosition(footerElement);
643 footerElementDimensions = MochiKit.Style.getElementDimensions(footerElement); 641 footerElementDimensions = MochiKit.Style.getElementDimensions(footerElement);
644 footerComputedHeight = footerElementPosition['y'] + footerElementDimensions['h'] - y; 642 footerComputedHeight = footerElementPosition['y'] + footerElementDimensions['h'] - y;
645 643
646 // scrollHeight = this.displayElement().scrollHeight; 644 // scrollHeight = this.displayElement().scrollHeight;
647 scrollHeight = footerComputedHeight; 645 scrollHeight = footerComputedHeight;
648 646
649 viewportHeight = MochiKit.Style.getViewportDimensions()['h']; 647 viewportHeight = MochiKit.Style.getViewportDimensions()['h'];
650 viewportY = MochiKit.Style.getViewportPosition()['y']; 648 viewportY = MochiKit.Style.getViewportPosition()['y'];
651 649
652 if ((y + scrollHeight) > (viewportY + viewportHeight)) { 650 if ((y + scrollHeight) > (viewportY + viewportHeight)) {
653 this.setDisplayMode('scrollable'); 651 this.setDisplayMode('scrollable');
654 MochiKit.DOM.addElementClass(this.element(), 'scrollable'); 652 MochiKit.DOM.addElementClass(this.element(), 'scrollable');
655 MochiKit.DOM.removeElementClass(this.element(), 'fixed'); 653 MochiKit.DOM.removeElementClass(this.element(), 'fixed');
656 MochiKit.Style.setElementPosition(this.displayElement(), {y:Math.max(0, Math.min(y, (viewportY + viewportHeight) - scrollHeight))}, 'px'); 654 MochiKit.Style.setElementPosition(this.displayElement(), {y:Math.max(0, Math.min(y, (viewportY + viewportHeight) - scrollHeight))}, 'px');
657 MochiKit.Visual.ScrollTo(this.displayElement(), {duration:0.5}); 655 MochiKit.Visual.ScrollTo(this.displayElement(), {duration:0.5});
658 } else { 656 } else {
659 this.setDisplayMode('fixed'); 657 this.setDisplayMode('fixed');
660 MochiKit.DOM.removeElementClass(this.element(), 'scrollable'); 658 MochiKit.DOM.removeElementClass(this.element(), 'scrollable');
661 MochiKit.DOM.addElementClass(this.element(), 'fixed'); 659 MochiKit.DOM.addElementClass(this.element(), 'fixed');
662 } 660 }
663 }, 661 },
664 662
665 //========================================================================= 663 //=========================================================================
666 664
667 'unselectCurrentSelectedItems': function () { 665 'unselectCurrentSelectedItems': function () {
668 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.displayElement(), ['.selectedField']), function (anElement) { 666 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.displayElement(), ['.selectedField']), function (anElement) {
669 MochiKit.DOM.removeElementClass(anElement, 'selectedField'); 667 MochiKit.DOM.removeElementClass(anElement, 'selectedField');
670 }); 668 });
671 }, 669 },
672 670
673 //========================================================================= 671 //=========================================================================
674 672
675 'hideProgressMask': function () { 673 'hideProgressMask': function () {
676 MochiKit.DOM.removeElementClass(this.getId('panel'), 'loading'); 674 MochiKit.DOM.removeElementClass(this.getId('panel'), 'loading');
677 }, 675 },
678 676
679 'showProgressMask': function () { 677 'showProgressMask': function () {
680 this.getElement('progressDescription').innerHTML = "Saving"; 678 this.getElement('progressDescription').innerHTML = "Saving";
681 MochiKit.DOM.addElementClass(this.getId('panel'), 'loading'); 679 MochiKit.DOM.addElementClass(this.getId('panel'), 'loading');
682 }, 680 },
683 681
684 'showError': function (anError) { 682 'showError': function (anError) {
685//console.log(">>> showError", anError);
686 MochiKit.Style.hideElement(this.getId('progress')); 683 MochiKit.Style.hideElement(this.getId('progress'));
687 this.getElement('errorMessage').innerHTML = Clipperz.PM.Strings.errorDescriptionForException(anError['message']); 684 this.getElement('errorMessage').innerHTML = Clipperz.PM.Strings.errorDescriptionForException(anError['message']);
688 MochiKit.Style.showElement(this.getId('error')); 685 MochiKit.Style.showElement(this.getId('error'));
689 }, 686 },
690 687
691 //------------------------------------------------------------------------- 688 //-------------------------------------------------------------------------
692 689
693 'cancel': function () { 690 'cancel': function () {
694/* 691/*
695 var deferredResult; 692 var deferredResult;
696 693
697 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.cancel", {trace:false}); 694 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.cancel", {trace:false});
698 deferredResult.addCallback(MochiKit.Base.method(this, 'isSavingEnabled')); 695 deferredResult.addCallback(MochiKit.Base.method(this, 'isSavingEnabled'));
699 deferredResult.addIf([ 696 deferredResult.addIf([
700 MochiKit.Base.method(this, 'askConfirmationForLoosingPendingChanges') 697 MochiKit.Base.method(this, 'askConfirmationForLoosingPendingChanges')
701 ], []); 698 ], []);
702 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Signal.signal, this, 'cancel')); 699 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Signal.signal, this, 'cancel'));
703 deferredResult.callback(); 700 deferredResult.callback();
704 701
705 return deferredResult; 702 return deferredResult;
706*/ 703*/
707 MochiKit.Signal.signal(this, 'cancel'); 704 MochiKit.Signal.signal(this, 'cancel');
708 }, 705 },
709 706
710 'handleCancelEvent': function (anEvent) { 707 'handleCancelEvent': function (anEvent) {
711 anEvent.preventDefault(); 708 anEvent.preventDefault();
712 this.cancel(); 709 this.cancel();
713 }, 710 },
714 711
715 //------------------------------------------------------------------------- 712 //-------------------------------------------------------------------------
716 713
717 'handleSaveEvent': function (anEvent) { 714 'handleSaveEvent': function (anEvent) {
718 anEvent.preventDefault(); 715 anEvent.preventDefault();
719 716
720 if (! MochiKit.DOM.hasElementClass(anEvent.src(), 'disabled')) { 717 if (! MochiKit.DOM.hasElementClass(anEvent.src(), 'disabled')) {
721 MochiKit.Signal.signal(this, 'save'); 718 MochiKit.Signal.signal(this, 'save');
722 } 719 }
723 }, 720 },
724 721
725 //------------------------------------------------------------------------- 722 //-------------------------------------------------------------------------
726 723
727 'handleAddDirectLogin': function (anEvent) { 724 'handleAddDirectLogin': function (anEvent) {
728 anEvent.preventDefault(); 725 anEvent.preventDefault();
729 726
730 MochiKit.Signal.signal(this, 'addDirectLogin'); 727 MochiKit.Signal.signal(this, 'addDirectLogin');
731 }, 728 },
732 729
733 //------------------------------------------------------------------------- 730 //-------------------------------------------------------------------------
734 731
735 'handleOnFocusEvent': function (anElement, anEvent) { 732 'handleOnFocusEvent': function (anElement, anEvent) {
736 this.unselectCurrentSelectedItems(); 733 this.unselectCurrentSelectedItems();
737 MochiKit.DOM.addElementClass(anElement, 'selectedField'); 734 MochiKit.DOM.addElementClass(anElement, 'selectedField');
738 }, 735 },
739 736
740 'handleLooseFocusEvent': function (anElement, anEvent) { 737 'handleLooseFocusEvent': function (anElement, anEvent) {
741 this.unselectCurrentSelectedItems(); 738 this.unselectCurrentSelectedItems();
742 }, 739 },
743 740
744 //------------------------------------------------------------------------- 741 //-------------------------------------------------------------------------
745 742
746 'handleTabSelected': function (aSelectedTab) { 743 'handleTabSelected': function (aSelectedTab) {
747 this.unselectCurrentSelectedItems(); 744 this.unselectCurrentSelectedItems();
748 745
749 switch (aSelectedTab) { 746 switch (aSelectedTab) {
750 case 'DETAILS': 747 case 'DETAILS':
751 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton')); 748 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
752 break; 749 break;
753 case 'DIRECT_LOGINS': 750 case 'DIRECT_LOGINS':
754 // MochiKit.Style.showElement(this.getElement('addDirectLoginButton')); 751 // MochiKit.Style.showElement(this.getElement('addDirectLoginButton'));
755 break; 752 break;
756 case 'SHARING': 753 case 'SHARING':
757 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton')); 754 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
758 break; 755 break;
759 } 756 }
760 }, 757 },
761 758
762 //------------------------------------------------------------------------- 759 //-------------------------------------------------------------------------
763 760
764 'handleKeyEvent': function (anEvent) { 761 'handleKeyEvent': function (anEvent) {
765//console.log("####", anEvent.key().string);
766 if (anEvent.key().string == 'KEY_ESCAPE') { 762 if (anEvent.key().string == 'KEY_ESCAPE') {
767 MochiKit.Signal.signal(this, 'changedValue'); 763 MochiKit.Signal.signal(this, 'changedValue');
768 this.cancel(); 764 this.cancel();
769 } else if (anEvent.key().string == 'KEY_ENTER') { 765 } else if (anEvent.key().string == 'KEY_ENTER') {
770 if (anEvent.target().nodeName == 'TEXTAREA') { 766 if (anEvent.target().nodeName == 'TEXTAREA') {
771 767
772 } else { 768 } else {
773 anEvent.preventDefault(); 769 anEvent.preventDefault();
774 } 770 }
775 } 771 }
776 }, 772 },
777 773
778 //========================================================================= 774 //=========================================================================
779 775
780 'askConfirmationForLoosingPendingChanges': function () { 776 'askConfirmationForLoosingPendingChanges': function () {
781 var deferredResult; 777 var deferredResult;
782 var confirmationDialog; 778 var confirmationDialog;
783 779
784 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 780 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
785 title:"Alert", 781 title:"Alert",
786 text:"Should lost pending changes?", 782 text:"Should lost pending changes?",
787 type:'ALERT', 783 type:'ALERT',
788 buttons: [ 784 buttons: [
789 {text:"Cancel",result:'CANCEL', isDefault:true}, 785 {text:"Cancel",result:'CANCEL', isDefault:true},
790 {text:"Ok", result:'OK'} 786 {text:"Ok", result:'OK'}
791 ] 787 ]
792 }); 788 });
793 789
794 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); 790 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
795 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()}); 791 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()});
796 deferredResult.addMethod(confirmationDialog, 'deferredShow', { 792 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
797 'openFromElement': this.getElement('cancelButton'), 793 'openFromElement': this.getElement('cancelButton'),
798 'onOkCloseToElement': null, //this.getElement('cancelButton'), 794 'onOkCloseToElement': null, //this.getElement('cancelButton'),
799 'onCancelCloseToElement':this.getElement('cancelButton') 795 'onCancelCloseToElement':this.getElement('cancelButton')
800 }); 796 });
801 // deferredResult.addCallback(function () { console.log("DELETE: " + anObject.toString(), anObject); });
802 // deferredResult.addErrbackPass(function () { console.log("skip deletion: " + anObject.toString(), anObject); });
803 deferredResult.callback(); 797 deferredResult.callback();
804 798
805 return deferredResult; 799 return deferredResult;
806 }, 800 },
807 801
808 //========================================================================= 802 //=========================================================================
809 803
810 'showDirectLoginEditingComponent': function () { 804 'showDirectLoginEditingComponent': function () {
811 varwidth; 805 varwidth;
812 var transition; 806 var transition;
813 var duration; 807 var duration;
814 808
815 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w']; 809 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
816 transition = MochiKit.Visual.Transitions.sinoidal; 810 transition = MochiKit.Visual.Transitions.sinoidal;
817 duration = 1; 811 duration = 1;
818 812
819 return Clipperz.Async.callbacks("CardDialogComponent.showDirectLoginEditingComponent", [ 813 return Clipperz.Async.callbacks("CardDialogComponent.showDirectLoginEditingComponent", [
820 MochiKit.Base.method(this, 'disableCardTitleEditing'), 814 MochiKit.Base.method(this, 'disableCardTitleEditing'),
821 MochiKit.Base.method(this.tabPanelController(), 'disable'), 815 MochiKit.Base.method(this.tabPanelController(), 'disable'),
822 816
823 MochiKit.Base.bind(function () { 817 MochiKit.Base.bind(function () {
824 MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}); 818 MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
825 MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width}); 819 MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width});
826 MochiKit.Style.showElement(this.getElement('directLoginEditDetail')); 820 MochiKit.Style.showElement(this.getElement('directLoginEditDetail'));
827 MochiKit.Style.setOpacity(this.getElement('directLoginEditDetail'), 0); 821 MochiKit.Style.setOpacity(this.getElement('directLoginEditDetail'), 0);
828 MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), { 822 MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {
829 h:Math.max( 823 h:Math.max(
830 MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h'], 824 MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h'],
831 MochiKit.Style.getElementDimensions(this.getElement('directLoginEditDetail'))['h'] 825 MochiKit.Style.getElementDimensions(this.getElement('directLoginEditDetail'))['h']
832 ) 826 )
833 }); 827 });
834 // MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}); 828 // MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
835 }, this), 829 }, this),
836 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [ 830 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [
837 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}), 831 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
838 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:1.0, to:0.0, transition:transition, sync:true}), 832 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:1.0, to:0.0, transition:transition, sync:true}),
839 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}), 833 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
840 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:0.0, to:1.0, transition:transition, sync:true}) 834 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:0.0, to:1.0, transition:transition, sync:true})
841 ], {duration:duration}), 835 ], {duration:duration}),
842 836
843 MochiKit.Base.noop 837 MochiKit.Base.noop
844 ], {trace:false}); 838 ], {trace:false});
845 }, 839 },
846 840
847 //------------------------------------------------------------------------- 841 //-------------------------------------------------------------------------
848 842
849 'hideDirectLoginEditingComponent': function () { 843 'hideDirectLoginEditingComponent': function () {
850 varwidth; 844 varwidth;
851 var transition; 845 var transition;
852 var duration; 846 var duration;
853 847
854 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w']; 848 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
855 transition = MochiKit.Visual.Transitions.sinoidal; 849 transition = MochiKit.Visual.Transitions.sinoidal;
856 duration = 1; 850 duration = 1;
857 851
858 return Clipperz.Async.callbacks("CardDialogComponent.hideDirectLoginEditingComponent", [ 852 return Clipperz.Async.callbacks("CardDialogComponent.hideDirectLoginEditingComponent", [
859 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [ 853 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [
860 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:width, y:0, mode:'relative', transition:transition, sync:true}), 854 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
861 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:0.0, to:1.0, transition:transition, sync:true}), 855 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:0.0, to:1.0, transition:transition, sync:true}),
862 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:width, y:0, mode:'relative', transition:transition, sync:true}), 856 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
863 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:1.0, to:0.0, transition:transition, sync:true}) 857 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:1.0, to:0.0, transition:transition, sync:true})
864 ], {duration:duration}), 858 ], {duration:duration}),
865 // MochiKit.Base.partial(MochiKit.Visual.appear, this.getElement('addDirectLoginButton'), {duration:0.3}), 859 // MochiKit.Base.partial(MochiKit.Visual.appear, this.getElement('addDirectLoginButton'), {duration:0.3}),
866 Clipperz.Async.clearResult, 860 Clipperz.Async.clearResult,
867 MochiKit.Base.partial(MochiKit.Style.hideElement, this.getElement('directLoginEditDetail')), 861 MochiKit.Base.partial(MochiKit.Style.hideElement, this.getElement('directLoginEditDetail')),
868 // MochiKit.Base.partial(MochiKit.Style.showElement, this.getElement('directLogins')), 862 // MochiKit.Base.partial(MochiKit.Style.showElement, this.getElement('directLogins')),
869 MochiKit.Base.partial(MochiKit.Style.setElementDimensions, this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}), 863 MochiKit.Base.partial(MochiKit.Style.setElementDimensions, this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}),
870 864
871 MochiKit.Base.method(this, 'enableCardTitleEditing'), 865 MochiKit.Base.method(this, 'enableCardTitleEditing'),
872 MochiKit.Base.method(this.tabPanelController(), 'enable') 866 MochiKit.Base.method(this.tabPanelController(), 'enable')
873 ], {trace:false}); 867 ], {trace:false});
874 }, 868 },
875 869
876 //========================================================================= 870 //=========================================================================
877 __syntaxFix__: "syntax fix" 871 __syntaxFix__: "syntax fix"
878}); 872});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
index 2e61f5f..0cee650 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
@@ -1,179 +1,173 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._faviconComponent = null; 32 this._faviconComponent = null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 40
43 //------------------------------------------------------------------------- 41 //-------------------------------------------------------------------------
44 42
45 'toString': function () { 43 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component"; 44 return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component";
47 }, 45 },
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'reference': function () { 49 'reference': function () {
52 return this._reference; 50 return this._reference;
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'renderSelf': function() { 55 'renderSelf': function() {
58//console.log(">>> CardDialogRecordDirectLoginComponent.renderSelf");
59 this.append(this.element(), [ 56 this.append(this.element(), [
60 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[ 57 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[
61 {tag:'img', cls:'favicon', id:this.getId('favicon')} 58 {tag:'img', cls:'favicon', id:this.getId('favicon')}
62 ]}, 59 ]},
63 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[ 60 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[
64 {tag:'input', id:this.getId('label'), type:'text'} 61 {tag:'input', id:this.getId('label'), type:'text'}
65 ]}, 62 ]},
66 {tag:'div', cls:'open', children:[ 63 {tag:'div', cls:'open', children:[
67 {tag:'span', children:[ 64 {tag:'span', children:[
68 {tag:'a', href:'open', id:this.getId('open'), html:'&nbsp;'} 65 {tag:'a', href:'open', id:this.getId('open'), html:'&nbsp;'}
69 ]} 66 ]}
70 ]}, 67 ]},
71 {tag:'div', cls:'edit', children:[ 68 {tag:'div', cls:'edit', children:[
72 {tag:'span', children:[ 69 {tag:'span', children:[
73 {tag:'a', href:'edit', id:this.getId('edit'), html:"edit"} 70 {tag:'a', href:'edit', id:this.getId('edit'), html:"edit"}
74 ]} 71 ]}
75 ]}, 72 ]},
76 {tag:'div', cls:'delete', children:[ 73 {tag:'div', cls:'delete', children:[
77 {tag:'span', children:[ 74 {tag:'span', children:[
78 {tag:'a', href:'delete', id:this.getId('delete'), html:"delete"} 75 {tag:'a', href:'delete', id:this.getId('delete'), html:"delete"}
79 ]} 76 ]}
80 ]} 77 ]}
81/* 78/*
82 {tag:'td', cls:'fieldState'}, 79 {tag:'td', cls:'fieldState'},
83 {tag:'td', cls:'fieldLabel', children:[ 80 {tag:'td', cls:'fieldLabel', children:[
84 {tag:'input', cls:'label', id:this.getId('label')} 81 {tag:'input', cls:'label', id:this.getId('label')}
85 ]}, 82 ]},
86 {tag:'td', cls:'fieldLock', children:[ 83 {tag:'td', cls:'fieldLock', children:[
87 {tag:'div', cls:'unlocked', id:this.getId('isHidden')} 84 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
88 ]}, 85 ]},
89 {tag:'td', cls:'fieldValue', children:[ 86 {tag:'td', cls:'fieldValue', children:[
90 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[ 87 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
91 {tag:'input', type:'text', cls:'value', id:this.getId('value')} 88 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
92 ]} 89 ]}
93 ]}, 90 ]},
94 {tag:'td', cls:'fieldAddDelete', children:[ 91 {tag:'td', cls:'fieldAddDelete', children:[
95 {tag:'div', cls:'delete', children:[ 92 {tag:'div', cls:'delete', children:[
96 {tag:'span', children:[ 93 {tag:'span', children:[
97 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"} 94 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
98 ]} 95 ]}
99 ]} 96 ]}
100 ]} 97 ]}
101*/ 98*/
102 ]); 99 ]);
103 100
104 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 101 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
105 MochiKit.Signal.connect(this.getId('open'), 'onclick',this, 'openDirectLogin'); 102 MochiKit.Signal.connect(this.getId('open'), 'onclick',this, 'openDirectLogin');
106 MochiKit.Signal.connect(this.getId('edit'), 'onclick',this, 'editDirectLogin'); 103 MochiKit.Signal.connect(this.getId('edit'), 'onclick',this, 'editDirectLogin');
107 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteDirectLogin'); 104 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteDirectLogin');
108 }, 105 },
109 106
110 //------------------------------------------------------------------------- 107 //-------------------------------------------------------------------------
111 108
112 'shouldShowElementWhileRendering': function () { 109 'shouldShowElementWhileRendering': function () {
113 return false; 110 return false;
114 }, 111 },
115 112
116 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
117 114
118 'faviconComponent': function () { 115 'faviconComponent': function () {
119 if (this._faviconComponent == null) { 116 if (this._faviconComponent == null) {
120//console.log("created the FAVICON component");
121 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')}); 117 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
122 } 118 }
123 119
124 return this._faviconComponent; 120 return this._faviconComponent;
125 }, 121 },
126 122
127 //========================================================================= 123 //=========================================================================
128 124
129 'label': function () { 125 'label': function () {
130 return this.getElement('label').value; 126 return this.getElement('label').value;
131 }, 127 },
132 128
133 'setLabel': function (aValue) { 129 'setLabel': function (aValue) {
134 this.getElement('label').value = Clipperz.Base.sanitizeString(aValue); 130 this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
135 }, 131 },
136 132
137 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
138 134
139 'favicon': function () { 135 'favicon': function () {
140 // return this.getElement('favicon').src; 136 // return this.getElement('favicon').src;
141 return this.faviconComponent().src(); 137 return this.faviconComponent().src();
142 }, 138 },
143 139
144 'setFavicon': function (aValue) { 140 'setFavicon': function (aValue) {
145 // this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue); 141 // this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue);
146 this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue)); 142 this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue));
147 }, 143 },
148 144
149 //========================================================================= 145 //=========================================================================
150 146
151 'openDirectLogin': function (anEvent) { 147 'openDirectLogin': function (anEvent) {
152 anEvent.preventDefault(); 148 anEvent.preventDefault();
153 149
154 MochiKit.Signal.signal(this, 'openDirectLogin', this.reference()); 150 MochiKit.Signal.signal(this, 'openDirectLogin', this.reference());
155 }, 151 },
156 152
157 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
158 154
159 'editDirectLogin': function (anEvent) { 155 'editDirectLogin': function (anEvent) {
160 anEvent.preventDefault(); 156 anEvent.preventDefault();
161 157
162 MochiKit.Signal.signal(this, 'editDirectLogin', this.reference()); 158 MochiKit.Signal.signal(this, 'editDirectLogin', this.reference());
163//console.log("EDIT DIRECT LOGIN");
164 }, 159 },
165 160
166 //------------------------------------------------------------------------- 161 //-------------------------------------------------------------------------
167 162
168 'deleteDirectLogin': function (anEvent) { 163 'deleteDirectLogin': function (anEvent) {
169 anEvent.preventDefault(); 164 anEvent.preventDefault();
170 165
171 MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference()); 166 MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference());
172//console.log("DELETE DIRECT LOGIN");
173 }, 167 },
174 168
175 169
176 170
177 //========================================================================= 171 //=========================================================================
178 __syntaxFix__: "syntax fix" 172 __syntaxFix__: "syntax fix"
179}); 173});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
index b58062c..689406a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
@@ -1,187 +1,183 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._actionType = null; 32 this._actionType = null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 40
43 //------------------------------------------------------------------------- 41 //-------------------------------------------------------------------------
44 42
45 'toString': function () { 43 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component"; 44 return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component";
47 }, 45 },
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'renderSelf': function() { 49 'renderSelf': function() {
52 this.append(this.element(), [ 50 this.append(this.element(), [
53 {tag:'td', cls:'fieldState'}, 51 {tag:'td', cls:'fieldState'},
54 {tag:'td', cls:'fieldLabel', children:[ 52 {tag:'td', cls:'fieldLabel', children:[
55 {tag:'input', cls:'label', id:this.getId('label')} 53 {tag:'input', cls:'label', id:this.getId('label')}
56 ]}, 54 ]},
57 {tag:'td', cls:'fieldLock', children:[ 55 {tag:'td', cls:'fieldLock', children:[
58 {tag:'div', cls:'unlocked', id:this.getId('isHidden')} 56 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
59 ]}, 57 ]},
60 {tag:'td', cls:'fieldValue', children:[ 58 {tag:'td', cls:'fieldValue', children:[
61 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[ 59 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
62 {tag:'input', type:'text', cls:'value', id:this.getId('value')} 60 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
63 ]} 61 ]}
64 ]}, 62 ]},
65 {tag:'td', cls:'fieldAction', children:[ 63 {tag:'td', cls:'fieldAction', children:[
66 {tag:'a', href:'#', id:this.getId('actionLink'), html:'&nbsp;'} 64 {tag:'a', href:'#', id:this.getId('actionLink'), html:'&nbsp;'}
67 ]}, 65 ]},
68 {tag:'td', cls:'fieldAddDelete', children:[ 66 {tag:'td', cls:'fieldAddDelete', children:[
69 {tag:'div', cls:'delete', children:[ 67 {tag:'div', cls:'delete', children:[
70 {tag:'span', children:[ 68 {tag:'span', children:[
71 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"} 69 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
72 ]} 70 ]}
73 ]} 71 ]}
74 ]} 72 ]}
75 ]); 73 ]);
76 74
77 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 75 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
78 MochiKit.Signal.connect(this.getId('isHidden'), 'onclick',this, 'toggleIsHidden'); 76 MochiKit.Signal.connect(this.getId('isHidden'), 'onclick',this, 'toggleIsHidden');
79 MochiKit.Signal.connect(this.getId('value'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 77 MochiKit.Signal.connect(this.getId('value'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
80 MochiKit.Signal.connect(this.getId('actionLink'), 'onclick',this, 'handleActionLink'); 78 MochiKit.Signal.connect(this.getId('actionLink'), 'onclick',this, 'handleActionLink');
81 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteField'); 79 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteField');
82 // MochiKit.Signal.connect(this.getId('delete'), 'onclick',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference())); 80 // MochiKit.Signal.connect(this.getId('delete'), 'onclick',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference()));
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'shouldShowElementWhileRendering': function () { 85 'shouldShowElementWhileRendering': function () {
88 return false; 86 return false;
89 }, 87 },
90 88
91 //========================================================================= 89 //=========================================================================
92 90
93 'reference': function () { 91 'reference': function () {
94 return this._reference; 92 return this._reference;
95 }, 93 },
96 94
97 //========================================================================= 95 //=========================================================================
98 96
99 'label': function () { 97 'label': function () {
100 return this.getElement('label').value; 98 return this.getElement('label').value;
101 }, 99 },
102 100
103 'setLabel': function (aValue) { 101 'setLabel': function (aValue) {
104 // this.getElement('label').value = Clipperz.Base.sanitizeString(aValue); 102 // this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
105 this.getElement('label').value = aValue; 103 this.getElement('label').value = aValue;
106 }, 104 },
107 105
108 //========================================================================= 106 //=========================================================================
109 107
110 'value': function () { 108 'value': function () {
111 return this.getElement('value').value; 109 return this.getElement('value').value;
112 }, 110 },
113 111
114 'setValue': function (aValue) { 112 'setValue': function (aValue) {
115 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue); 113 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
116 this.getElement('value').value = aValue; 114 this.getElement('value').value = aValue;
117 }, 115 },
118 116
119 //------------------------------------------------------------------------- 117 //-------------------------------------------------------------------------
120 118
121 'actionType': function () { 119 'actionType': function () {
122 return this._actionType; 120 return this._actionType;
123 }, 121 },
124 122
125 'setActionType': function (anActionType) { 123 'setActionType': function (anActionType) {
126 this._actionType = anActionType; 124 this._actionType = anActionType;
127 125
128 switch (this._actionType) { 126 switch (this._actionType) {
129 case 'NONE': 127 case 'NONE':
130 MochiKit.Style.hideElement(this.getId('actionLink')); 128 MochiKit.Style.hideElement(this.getId('actionLink'));
131 MochiKit.DOM.setElementClass(this.getId('actionLink'), ''); 129 MochiKit.DOM.setElementClass(this.getId('actionLink'), '');
132 break; 130 break;
133 case 'URL': 131 case 'URL':
134 MochiKit.Style.showElement(this.getId('actionLink')); 132 MochiKit.Style.showElement(this.getId('actionLink'));
135 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url'); 133 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url');
136 break; 134 break;
137 case 'EMAIL': 135 case 'EMAIL':
138 MochiKit.Style.showElement(this.getId('actionLink')); 136 MochiKit.Style.showElement(this.getId('actionLink'));
139 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email'); 137 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email');
140 break; 138 break;
141 case 'PASSWORD': 139 case 'PASSWORD':
142 MochiKit.Style.showElement(this.getId('actionLink')); 140 MochiKit.Style.showElement(this.getId('actionLink'));
143 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password'); 141 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password');
144 break; 142 break;
145 } 143 }
146 }, 144 },
147 145
148 //========================================================================= 146 //=========================================================================
149 147
150 'isHidden': function () { 148 'isHidden': function () {
151 // return this.getElement('value').value; 149 // return this.getElement('value').value;
152 return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked'); 150 return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked');
153 }, 151 },
154 152
155 'setIsHidden': function (aValue) { 153 'setIsHidden': function (aValue) {
156 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue); 154 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
157 MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked')); 155 MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked'));
158 MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked')); 156 MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked'));
159 }, 157 },
160 158
161 'toggleIsHidden': function (anEvent) { 159 'toggleIsHidden': function (anEvent) {
162 anEvent.preventDefault(); 160 anEvent.preventDefault();
163 161
164 this.setIsHidden(! this.isHidden()); 162 this.setIsHidden(! this.isHidden());
165 MochiKit.Signal.signal(this, 'changedValue'); 163 MochiKit.Signal.signal(this, 'changedValue');
166 }, 164 },
167 165
168 //========================================================================= 166 //=========================================================================
169 167
170 'handleActionLink': function (anEvent) { 168 'handleActionLink': function (anEvent) {
171 anEvent.preventDefault(); 169 anEvent.preventDefault();
172
173//console.log("ACTION LINK - " + this.actionType());
174 MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target()); 170 MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target());
175 }, 171 },
176 172
177 //========================================================================= 173 //=========================================================================
178 174
179 'deleteField': function (anEvent) { 175 'deleteField': function (anEvent) {
180 anEvent.preventDefault(); 176 anEvent.preventDefault();
181 177
182 MochiKit.Signal.signal(this, 'deleteField', this.reference()); 178 MochiKit.Signal.signal(this, 'deleteField', this.reference());
183 }, 179 },
184 180
185 //========================================================================= 181 //=========================================================================
186 __syntaxFix__: "syntax fix" 182 __syntaxFix__: "syntax fix"
187}); 183});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
index 391c379..41e32a0 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.ColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.ColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args);
33 31
34 this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._selector = args.selector|| Clipperz.Base.exception.raise('MandatoryParameter');; 33 this._selector = args.selector|| Clipperz.Base.exception.raise('MandatoryParameter');;
36 this._label = args.label || null; 34 this._label = args.label || null;
37 this._isSortable = args.sortable|| false; 35 this._isSortable = args.sortable|| false;
38 this._comparator = args.comparator|| null; 36 this._comparator = args.comparator|| null;
39 this._sorted = args.sorted || 'UNSORTED'; //'ASCENDING' | 'DESCENDING' | 'UNSORTED' 37 this._sorted = args.sorted || 'UNSORTED'; //'ASCENDING' | 'DESCENDING' | 'UNSORTED'
40 this._cssClass = args.cssClass|| ''; 38 this._cssClass = args.cssClass|| '';
41 39
42 this._signalIdentifiers = []; 40 this._signalIdentifiers = [];
43 41
44 return this; 42 return this;
45} 43}
46 44
47//============================================================================= 45//=============================================================================
48 46
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, { 47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, {
50 48
51 'toString': function () { 49 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name; 50 return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name;
53 }, 51 },
54 52
55 'name': function () { 53 'name': function () {
56 return this._name; 54 return this._name;
57 }, 55 },
58 56
59 'label': function () { 57 'label': function () {
60 return this._label; 58 return this._label;
61 }, 59 },
62 60
63 'selector': function () { 61 'selector': function () {
64 return this._selector; 62 return this._selector;
65 }, 63 },
66 64
67 'comparator': function() { 65 'comparator': function() {
68 return this._comparator; 66 return this._comparator;
69 }, 67 },
70 68
71 'cssClass': function() { 69 'cssClass': function() {
72 return this._cssClass; 70 return this._cssClass;
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'isSortable': function () { 75 'isSortable': function () {
78 return this._isSortable; 76 return this._isSortable;
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'sorted': function () { 81 'sorted': function () {
84 return this._sorted; 82 return this._sorted;
85 }, 83 },
86 84
87 'isSorted': function () { 85 'isSorted': function () {
88 return (this.sorted() != 'UNSORTED'); 86 return (this.sorted() != 'UNSORTED');
89 }, 87 },
90 88
91 'setSorted': function(aValue) { 89 'setSorted': function(aValue) {
92 this._sorted = aValue; 90 this._sorted = aValue;
93 this.updateSortIcon(); 91 this.updateSortIcon();
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 'signalIdentifiers': function () { 96 'signalIdentifiers': function () {
99 return this._signalIdentifiers; 97 return this._signalIdentifiers;
100 }, 98 },
101 99
102 'resetSignalIdentifiers': function () { 100 'resetSignalIdentifiers': function () {
103 this._signalIdentifiers = []; 101 this._signalIdentifiers = [];
104 }, 102 },
105 103
106 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
107 105
108 'disconnectRowsSignals': function () { 106 'disconnectRowsSignals': function () {
109 MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers()); 107 MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers());
110 this.resetSignalIdentifiers(); 108 this.resetSignalIdentifiers();
111 }, 109 },
112 110
113 'connectEvent': function () { 111 'connectEvent': function () {
114 var ident; 112 var ident;
115 113
116 ident = MochiKit.Signal.connect.apply(null, arguments); 114 ident = MochiKit.Signal.connect.apply(null, arguments);
117 this.signalIdentifiers().push(ident); 115 this.signalIdentifiers().push(ident);
118 }, 116 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
index d3aa175..3d0ba76 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
@@ -1,68 +1,66 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments);
32 30
33 return this; 31 return this;
34} 32}
35 33
36//============================================================================= 34//=============================================================================
37 35
38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 36Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component"; 41 return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'renderSelf': function() { 46 'renderSelf': function() {
49 this.append(this.element(), [ 47 this.append(this.element(), [
50 {tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[ 48 {tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[
51 {tag:'span', html:"Create New Card"} 49 {tag:'span', html:"Create New Card"}
52 ]} 50 ]}
53 ]); 51 ]);
54 52
55 MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick'); 53 MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick');
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'handleClick': function (anEvent) { 58 'handleClick': function (anEvent) {
61 anEvent.preventDefault(); 59 anEvent.preventDefault();
62 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element()); 60 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element());
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 __syntaxFix__: "syntax fix" 65 __syntaxFix__: "syntax fix"
68}); 66});
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 462d864..23f6710 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
@@ -1,116 +1,114 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DataPanel = function(args) { 26Clipperz.PM.UI.Web.Components.DataPanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments);
32 30
33 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY'; 31 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY';
34 this._tabPanelControllerConfiguration = { 32 this._tabPanelControllerConfiguration = {
35 'OFFLINE_COPY': { 33 'OFFLINE_COPY': {
36 tab:'offlineCopyTab', 34 tab:'offlineCopyTab',
37 panel:'offlineCopyPanel' 35 panel:'offlineCopyPanel'
38 }, 36 },
39 'SHARING': { 37 'SHARING': {
40 tab:'sharingTab', 38 tab:'sharingTab',
41 panel:'sharingPanel' 39 panel:'sharingPanel'
42 }, 40 },
43 'IMPORT': { 41 'IMPORT': {
44 tab:'importTab', 42 tab:'importTab',
45 panel:'importPanel' 43 panel:'importPanel'
46 }, 44 },
47 'EXPORT': { 45 'EXPORT': {
48 tab:'exportTab', 46 tab:'exportTab',
49 panel:'exportPanel' 47 panel:'exportPanel'
50 } 48 }
51 }; 49 };
52 50
53 return this; 51 return this;
54} 52}
55 53
56//============================================================================= 54//=============================================================================
57 55
58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 56Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'toString': function () { 60 'toString': function () {
63 return "Clipperz.PM.UI.Web.Components.DataPanel component"; 61 return "Clipperz.PM.UI.Web.Components.DataPanel component";
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'renderSelf': function(/*aContainer, aPosition*/) { 66 'renderSelf': function(/*aContainer, aPosition*/) {
69 this.append(this.element(), [ 67 this.append(this.element(), [
70 {tag:'div', cls:'header', children:[ 68 {tag:'div', cls:'header', children:[
71 {tag:'div', cls:'subPanelTabs', children:[ 69 {tag:'div', cls:'subPanelTabs', children:[
72 {tag:'ul', children:[ 70 {tag:'ul', children:[
73 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'}, 71 {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'}]}, 72 {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'}]}, 73 {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'}]} 74 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]}
77 ]} 75 ]}
78 ]} 76 ]}
79 ]}, 77 ]},
80 {tag:'div', cls:'body', children:[ 78 {tag:'div', cls:'body', children:[
81 {tag:'div', cls:'accountPanel', children:[ 79 {tag:'div', cls:'accountPanel', children:[
82 {tag:'div', cls:'subPanelContent', children:[ 80 {tag:'div', cls:'subPanelContent', children:[
83 {tag:'ul', children:[ 81 {tag:'ul', children:[
84 {tag:'li', id:this.getId('offlineCopyPanel'),children:[ 82 {tag:'li', id:this.getId('offlineCopyPanel'),children:[
85 // {tag:'h3', html:"Offline copy"}, 83 // {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."}, 84 {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'} 85 {tag:'a', id:this.getId('offlineCopyDownloadLink'), href:'#', html:"Download", cls:'downloadOfflineCopy'}
88 ]}, 86 ]},
89 {tag:'li', id:this.getId('sharingPanel'),children:[ 87 {tag:'li', id:this.getId('sharingPanel'),children:[
90 // {tag:'h3', html:"Sharing"} 88 // {tag:'h3', html:"Sharing"}
91 ]}, 89 ]},
92 {tag:'li', id:this.getId('importPanel'), children:[ 90 {tag:'li', id:this.getId('importPanel'), children:[
93 // {tag:'h3', html:"Import"} 91 // {tag:'h3', html:"Import"}
94 ]}, 92 ]},
95 {tag:'li', id:this.getId('exportPanel'), children:[ 93 {tag:'li', id:this.getId('exportPanel'), children:[
96 // {tag:'h3', html:"Export"} 94 // {tag:'h3', html:"Export"}
97 ]} 95 ]}
98 ]} 96 ]}
99 ]} 97 ]}
100 ]} 98 ]}
101 ]}, 99 ]},
102 {tag:'div', cls:'footer'} 100 {tag:'div', cls:'footer'}
103 ]); 101 ]);
104 102
105 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 103 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
106 MochiKit.Signal.connect(this.getId('offlineCopyDownloadLink'), 'onclick', this, 'downloadOfflineCopy'); 104 MochiKit.Signal.connect(this.getId('offlineCopyDownloadLink'), 'onclick', this, 'downloadOfflineCopy');
107 }, 105 },
108 106
109 'downloadOfflineCopy': function (anEvent) { 107 'downloadOfflineCopy': function (anEvent) {
110 anEvent.preventDefault(); 108 anEvent.preventDefault();
111 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy', anEvent.src()); 109 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy', anEvent.src());
112 }, 110 },
113 111
114 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
115 __syntaxFix__: "syntax fix" 113 __syntaxFix__: "syntax fix"
116}); 114});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
index ea55ba4..b305045 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
@@ -1,69 +1,67 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args);
33 31
34 this._format = args.format|| Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._format = args.format|| Clipperz.Base.exception.raise('MandatoryParameter');
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'format': function () { 47 'format': function () {
50 return this._format; 48 return this._format;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'renderCell': function(aRowElement, anObject) { 53 'renderCell': function(aRowElement, anObject) {
56 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 54 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
57 { 55 {
58 tag:'span', 56 tag:'span',
59 title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"), 57 title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"),
60 html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format()) 58 html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format())
61 } 59 }
62 ]}); 60 ]});
63 }, 61 },
64 62
65 //----------------------------------------------------- 63 //-----------------------------------------------------
66 64
67 '__syntax_fix__' : 'syntax fix' 65 '__syntax_fix__' : 'syntax fix'
68}); 66});
69 67
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
index fe59494..6efe4c6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
@@ -1,67 +1,65 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'renderCell': function(aRowElement, anObject) { 45 'renderCell': function(aRowElement, anObject) {
48 var tdElement; 46 var tdElement;
49 var linkElement; 47 var linkElement;
50 48
51 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 49 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
52 {tag:'div', cls:'delete', children:[ 50 {tag:'div', cls:'delete', children:[
53 {tag:'span', children:[ 51 {tag:'span', children:[
54 {tag:'a', href:'delete', html:"delete"} 52 {tag:'a', href:'delete', html:"delete"}
55 ]} 53 ]}
56 ]} 54 ]}
57 ]}); 55 ]});
58 56
59 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 57 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
60 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 58 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
61 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 59 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
62 }, 60 },
63 61
64 //----------------------------------------------------- 62 //-----------------------------------------------------
65 '__syntax_fix__' : 'syntax fix' 63 '__syntax_fix__' : 'syntax fix'
66}); 64});
67 65
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
index a1f0f9f..2dad703 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
@@ -1,87 +1,85 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* 24/*
27Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 25Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
28 26
29//############################################################################# 27//#############################################################################
30 28
31Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) { 29Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) {
32 args = args || {}; 30 args = args || {};
33 Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args); 31 Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args);
34 32
35 this._actionMethod = args.actionMethod || null; 33 this._actionMethod = args.actionMethod || null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 43 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'actionMethod': function () { 48 'actionMethod': function () {
51 return this._actionMethod; 49 return this._actionMethod;
52 }, 50 },
53 51
54 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
55 53
56 'renderCell': function(aRowElement, anObject) { 54 'renderCell': function(aRowElement, anObject) {
57 vartdElement; 55 vartdElement;
58 varlinkElement; 56 varlinkElement;
59 57
60 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 58 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
61 {tag:'div', cls:'directLogin_directLogin', children:[ 59 {tag:'div', cls:'directLogin_directLogin', children:[
62 {tag:'div', cls:'directLogin_directLogin_body', children:[ 60 {tag:'div', cls:'directLogin_directLogin_body', children:[
63 {tag:'a', href:'#', html:anObject[this.name()]} 61 {tag:'a', href:'#', html:anObject[this.name()]}
64 ]} 62 ]}
65 ]} 63 ]}
66 ]}); 64 ]});
67 65
68 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 66 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
69 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 67 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
70 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 68 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
71 }, 69 },
72 70
73 //----------------------------------------------------- 71 //-----------------------------------------------------
74 72
75 'handleLinkClick': function (anObject, anEvent) { 73 'handleLinkClick': function (anObject, anEvent) {
76 anEvent.preventDefault(); 74 anEvent.preventDefault();
77 75
78 if (this.actionMethod() != null) { 76 if (this.actionMethod() != null) {
79 this.actionMethod()(anObject, anEvent); 77 this.actionMethod()(anObject, anEvent);
80 } 78 }
81 }, 79 },
82 80
83 //----------------------------------------------------- 81 //-----------------------------------------------------
84 '__syntax_fix__' : 'syntax fix' 82 '__syntax_fix__' : 'syntax fix'
85}); 83});
86 84
87*/ \ No newline at end of file 85*/ \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
index 1a76b0c..f5f99d4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) { 26Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._initiallySelectedFieldKey = args.selectedFieldKey|| null; 33 this._initiallySelectedFieldKey = args.selectedFieldKey|| null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component"; 45 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'formFieldName': function () { 50 'formFieldName': function () {
53 return this._formFieldName; 51 return this._formFieldName;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'fields': function () { 56 'fields': function () {
59 return this._fields; 57 return this._fields;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'selectedValue': function () { 62 'selectedValue': function () {
65 var result; 63 var result;
66 64
67 result = this.getElement('select').value; 65 result = this.getElement('select').value;
68 66
69 if (result == '---') { 67 if (result == '---') {
70 result = null; 68 result = null;
71 } 69 }
72 70
73 return result; 71 return result;
74 }, 72 },
75 73
76 'initiallySelectedFieldKey': function () { 74 'initiallySelectedFieldKey': function () {
77 return this._initiallySelectedFieldKey; 75 return this._initiallySelectedFieldKey;
78 }, 76 },
79 77
80 //========================================================================= 78 //=========================================================================
81 79
82 'renderSelf': function() { 80 'renderSelf': function() {
83 var initiallySelectedOptions; 81 var initiallySelectedOptions;
84 82
85 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[ 83 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[
86 {tag:'span', cls:'formFieldName', html:this.formFieldName()}, 84 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
87 {tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[ 85 {tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[
88 {tag:'a', href:'#', id:this.getId('showHide'), html:'&nbsp;'} 86 {tag:'a', href:'#', id:this.getId('showHide'), html:'&nbsp;'}
89 ]}, 87 ]},
90 {tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''}, 88 {tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''},
91 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children: 89 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
92 MochiKit.Base.flattenArguments( 90 MochiKit.Base.flattenArguments(
93 {tag:'option', value:'---', html:"---"}, 91 {tag:'option', value:'---', html:"---"},
94 MochiKit.Base.map( 92 MochiKit.Base.map(
95 MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this), 93 MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this),
96 this.fields() 94 this.fields()
97 ) 95 )
98 ) 96 )
99 } 97 }
100 ]}); 98 ]});
101 99
102 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange'); 100 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
103 MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide'); 101 MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide');
104 102
105 if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) { 103 if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) {
106 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']); 104 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']);
107 if (initiallySelectedOptions.length == 1) { 105 if (initiallySelectedOptions.length == 1) {
108 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true}); 106 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
109 this.handleSelectChange(); 107 this.handleSelectChange();
110 } 108 }
111 } 109 }
112 }, 110 },
113 111
114 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
115 113
116 'setFieldValue': function (aValue) { 114 'setFieldValue': function (aValue) {
117 this.getElement('input').value = aValue; 115 this.getElement('input').value = aValue;
118 }, 116 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
index 5114b1d..55d2c01 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
@@ -1,204 +1,201 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) { 26Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._tabPanelController = null; 31 this._tabPanelController = null;
34 32
35 this._initiallySelectedTab = args.selected || 'TYPE'; 33 this._initiallySelectedTab = args.selected || 'TYPE';
36 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
37 'LABEL': { 35 'LABEL': {
38 tab:'labelTab', 36 tab:'labelTab',
39 panel:'labelTabpanel' 37 panel:'labelTabpanel'
40 }, 38 },
41 'TYPE': { 39 'TYPE': {
42 tab:'typeTab', 40 tab:'typeTab',
43 panel:'typeTabpanel' 41 panel:'typeTabpanel'
44 }, 42 },
45 'CONFIGURATION': { 43 'CONFIGURATION': {
46 tab:'configurationTab', 44 tab:'configurationTab',
47 panel:'configurationTabpanel' 45 panel:'configurationTabpanel'
48 }, 46 },
49 'BINDINGS': { 47 'BINDINGS': {
50 tab:'bindingsTab', 48 tab:'bindingsTab',
51 panel:'bindingsTabpanel' 49 panel:'bindingsTabpanel'
52 }, 50 },
53 'FAVICON': { 51 'FAVICON': {
54 tab:'faviconTab', 52 tab:'faviconTab',
55 panel:'faviconTabpanel' 53 panel:'faviconTabpanel'
56 }, 54 },
57 'DONE': { 55 'DONE': {
58 tab:'doneTab', 56 tab:'doneTab',
59 panel:'doneTabpanel' 57 panel:'doneTabpanel'
60 } 58 }
61 }; 59 };
62 60
63 this._directLoginReference = null; 61 this._directLoginReference = null;
64 62
65 this._directLoginFavicon = null; 63 this._directLoginFavicon = null;
66 64
67 this._updateFaviconCounter = 0; 65 this._updateFaviconCounter = 0;
68 this._faviconComponent = null; 66 this._faviconComponent = null;
69 67
70 this._bindingComponents= []; 68 this._bindingComponents= [];
71 this._formValueComponents = []; 69 this._formValueComponents = [];
72 70
73 return this; 71 return this;
74} 72}
75 73
76//============================================================================= 74//=============================================================================
77 75
78//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 76//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
79Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 77Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'toString': function () { 81 'toString': function () {
84 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component"; 82 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component";
85 }, 83 },
86 84
87 //========================================================================= 85 //=========================================================================
88 86
89 'directLoginReference': function () { 87 'directLoginReference': function () {
90 return this._directLoginReference; 88 return this._directLoginReference;
91 }, 89 },
92 90
93 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
94 92
95 'setDirectLoginReference': function (aDirectLoginReference) { 93 'setDirectLoginReference': function (aDirectLoginReference) {
96 this._directLoginReference = aDirectLoginReference; 94 this._directLoginReference = aDirectLoginReference;
97 95
98 return this._directLoginReference; 96 return this._directLoginReference;
99 }, 97 },
100 98
101 //========================================================================= 99 //=========================================================================
102 100
103 'label': function () { 101 'label': function () {
104 return this.getElement('label').value 102 return this.getElement('label').value
105 }, 103 },
106 104
107 'setLabel': function (aValue) { 105 'setLabel': function (aValue) {
108//console.log("##> LABEL: " + aValue);
109 this.getElement('label').value = (aValue ? aValue : ''); 106 this.getElement('label').value = (aValue ? aValue : '');
110 }, 107 },
111 108
112 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
113 110
114 'favicon': function () { 111 'favicon': function () {
115 return this.getElement('faviconURL').value; 112 return this.getElement('faviconURL').value;
116 }, 113 },
117 114
118 'setFavicon': function (aValue) { 115 'setFavicon': function (aValue) {
119 var regexp; 116 var regexp;
120 var displayValue; 117 var displayValue;
121 118
122 regexp = new RegExp('^data\:\/\/.*', 'i'); 119 regexp = new RegExp('^data\:\/\/.*', 'i');
123 if (regexp.test(aValue)) { 120 if (regexp.test(aValue)) {
124 displayValue = '' 121 displayValue = ''
125 } else { 122 } else {
126 displayValue = (aValue ? aValue : ''); 123 displayValue = (aValue ? aValue : '');
127 } 124 }
128 125
129 this.getElement('faviconURL').value = displayValue; 126 this.getElement('faviconURL').value = displayValue;
130 this.faviconComponent().setSrc(aValue); 127 this.faviconComponent().setSrc(aValue);
131 }, 128 },
132 129
133 //'setFaviconData': function (aValue) { 130 //'setFaviconData': function (aValue) {
134 // this.getElement('faviconIcon').src = aValue; 131 // this.getElement('faviconIcon').src = aValue;
135 //}, 132 //},
136 133
137 'directLoginFavicon': function () { 134 'directLoginFavicon': function () {
138 return this._directLoginFavicon; 135 return this._directLoginFavicon;
139 }, 136 },
140 137
141 'setDirectLoginFavicon': function (aValue) { 138 'setDirectLoginFavicon': function (aValue) {
142 this._directLoginFavicon = aValue; 139 this._directLoginFavicon = aValue;
143 this.setFavicon(aValue); 140 this.setFavicon(aValue);
144 }, 141 },
145 142
146 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
147 144
148 'bookmarkletConfiguration': function () { 145 'bookmarkletConfiguration': function () {
149 return this.getElement('bookmarkletConfiguration').value 146 return this.getElement('bookmarkletConfiguration').value
150 }, 147 },
151 148
152 'setBookmarkletConfiguration': function (aValue) { 149 'setBookmarkletConfiguration': function (aValue) {
153 this.getElement('bookmarkletConfiguration').value = aValue; 150 this.getElement('bookmarkletConfiguration').value = aValue;
154 }, 151 },
155 152
156 'highlightConfigurationSyntaxError': function () { 153 'highlightConfigurationSyntaxError': function () {
157 MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error'); 154 MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error');
158 }, 155 },
159 156
160 'removeHighlightConfigurationSyntaxError': function () { 157 'removeHighlightConfigurationSyntaxError': function () {
161 MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error'); 158 MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error');
162 }, 159 },
163 160
164 //========================================================================= 161 //=========================================================================
165 162
166 'disableAllPanels': function () { 163 'disableAllPanels': function () {
167 this.getElement('label').disabled = true; 164 this.getElement('label').disabled = true;
168 MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled'); 165 MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
169 166
170 this.tabPanelController().selectTab(null); 167 this.tabPanelController().selectTab(null);
171 }, 168 },
172 169
173 //------------------------------------------------------------------------- 170 //-------------------------------------------------------------------------
174 171
175 //'disableLabelField': function () { 172 //'disableLabelField': function () {
176 // this.getElement('label').disabled = true; 173 // this.getElement('label').disabled = true;
177 // MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled'); 174 // MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
178 //}, 175 //},
179 176
180 'enableLabelField': function () { 177 'enableLabelField': function () {
181 this.getElement('label').disabled = false; 178 this.getElement('label').disabled = false;
182 MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled'); 179 MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled');
183 this.tabPanelController().selectTab('LABEL'); 180 this.tabPanelController().selectTab('LABEL');
184 }, 181 },
185 182
186 //------------------------------------------------------------------------- 183 //-------------------------------------------------------------------------
187 184
188 //'disableTypeField': function () { 185 //'disableTypeField': function () {
189 // this.tabPanelController().selectTab(null); 186 // this.tabPanelController().selectTab(null);
190 //}, 187 //},
191 188
192 'enableTypeField': function () { 189 'enableTypeField': function () {
193 this.tabPanelController().selectTab('TYPE'); 190 this.tabPanelController().selectTab('TYPE');
194 }, 191 },
195 192
196 //------------------------------------------------------------------------- 193 //-------------------------------------------------------------------------
197 194
198 //'disableConfigurationField': function () { 195 //'disableConfigurationField': function () {
199 // this.tabPanelController().selectTab(null); 196 // this.tabPanelController().selectTab(null);
200 //}, 197 //},
201 198
202 'enableConfigurationField': function () { 199 'enableConfigurationField': function () {
203 this.tabPanelController().selectTab('CONFIGURATION'); 200 this.tabPanelController().selectTab('CONFIGURATION');
204 }, 201 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
index fa57233..58b5b26 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
@@ -1,176 +1,169 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) { 26Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._initialValue = args.initialValue || null; 33 this._initialValue = args.initialValue || null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component"; 45 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'formFieldName': function () { 50 'formFieldName': function () {
53 return this._formFieldName; 51 return this._formFieldName;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'fieldOptions': function () { 56 'fieldOptions': function () {
59 return this._fieldOptions; 57 return this._fieldOptions;
60 }, 58 },
61 59
62 'fieldType': function () { 60 'fieldType': function () {
63 return this.fieldOptions()['type']; 61 return this.fieldOptions()['type'];
64 }, 62 },
65 63
66 'optionValues': function () { 64 'optionValues': function () {
67 return MochiKit.Base.map(function (anOptionValue) { 65 return MochiKit.Base.map(function (anOptionValue) {
68 return { 66 return {
69 'label': anOptionValue['label'] || anOptionValue['value'], 67 'label': anOptionValue['label'] || anOptionValue['value'],
70 'value': anOptionValue['value'] 68 'value': anOptionValue['value']
71 } 69 }
72 }, this.fieldOptions()['options']); 70 }, this.fieldOptions()['options']);
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'selectedValue': function () { 75 'selectedValue': function () {
78 var result; 76 var result;
79 77
80 result = this.getElement('select').value; 78 result = this.getElement('select').value;
81 79
82 if (result == '---') { 80 if (result == '---') {
83 result = null; 81 result = null;
84 } 82 }
85 83
86 return result; 84 return result;
87 }, 85 },
88 86
89 'initialValue': function () { 87 'initialValue': function () {
90 return this._initialValue; 88 return this._initialValue;
91 }, 89 },
92 90
93 //========================================================================= 91 //=========================================================================
94 92
95 'renderSelf': function() { 93 'renderSelf': function() {
96//console.log(">>> DirectLoginEditingFormValueComponent.renderSelf");
97//console.log("FIELD OPTIONS", this.fieldOptions());
98//console.log("OPTION VALUES", this.optionValues());
99 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[ 94 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[
100 {tag:'span', cls:'formFieldName', html:this.formFieldName()}, 95 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
101 {tag:'div', id:this.getId('values')} 96 {tag:'div', id:this.getId('values')}
102 ]}); 97 ]});
103 98
104 if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) { 99 if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) {
105 this.append(this.getElement('values'), 100 this.append(this.getElement('values'),
106 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children: 101 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
107 MochiKit.Base.flattenArguments( 102 MochiKit.Base.flattenArguments(
108 // {tag:'option', value:'---', html:"---"}, 103 // {tag:'option', value:'---', html:"---"},
109 MochiKit.Base.map( 104 MochiKit.Base.map(
110 MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this), 105 MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this),
111 this.optionValues() 106 this.optionValues()
112 ) 107 )
113 ) 108 )
114 } 109 }
115 ); 110 );
116 111
117 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange'); 112 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
118 113
119 if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) { 114 if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) {
120 var initiallySelectedOptions; 115 var initiallySelectedOptions;
121 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']); 116 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']);
122 if (initiallySelectedOptions.length == 1) { 117 if (initiallySelectedOptions.length == 1) {
123 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true}); 118 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
124 this.handleSelectChange(); 119 this.handleSelectChange();
125 } else { 120 } else {
126 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true}); 121 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
127 } 122 }
128 } else { 123 } else {
129 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true}); 124 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
130 } 125 }
131 } else if (this.fieldType() == 'checkbox') { 126 } else if (this.fieldType() == 'checkbox') {
132 this.append(this.getElement('values'), 127 this.append(this.getElement('values'),
133 {tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'} 128 {tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'}
134 ); 129 );
135 130
136 MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange'); 131 MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange');
137 132
138 if (this.initialValue()) { 133 if (this.initialValue()) {
139 MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true}); 134 MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true});
140 } 135 }
141 } else { 136 } else {
142 WTF = TODO; 137 WTF = TODO;
143 } 138 }
144//console.log("<<< DirectLoginEditingFormValueComponent.renderSelf");
145 }, 139 },
146 140
147 //========================================================================= 141 //=========================================================================
148 142
149 'handleSelectChange': function (anEvent) { 143 'handleSelectChange': function (anEvent) {
150//console.log("handleSelectChange", anEvent, anEvent.src(), anEvent.src().value);
151 var options; 144 var options;
152 145
153 options = {}; 146 options = {};
154 147
155 options['fieldName'] = this.formFieldName(); 148 options['fieldName'] = this.formFieldName();
156 149
157 if (this.fieldType() == 'checkbox') { 150 if (this.fieldType() == 'checkbox') {
158 options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null); 151 options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null);
159 } else { 152 } else {
160 options['selectedValue'] = this.selectedValue(); 153 options['selectedValue'] = this.selectedValue();
161 } 154 }
162 155
163 MochiKit.Signal.signal(this, 'formValueChange', options); 156 MochiKit.Signal.signal(this, 'formValueChange', options);
164 }, 157 },
165 158
166 //========================================================================= 159 //=========================================================================
167 __syntaxFix__: "syntax fix" 160 __syntaxFix__: "syntax fix"
168}); 161});
169 162
170 163
171 164
172 165
173 166
174 167
175 168
176 169
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
index d8dc941..b4fc24e 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args);
33 31
34 this._enterLeaveCounter = 0; 32 this._enterLeaveCounter = 0;
35 this._selectedRowObject = null; 33 this._selectedRowObject = null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component"; 43 return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'renderHeader': function(aTRElement) { 48 'renderHeader': function(aTRElement) {
51 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement); 49 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement);
52 50
53 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[ 51 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[
54 {tag:'div', cls:'DirectLoginListPopup_body', children:[ 52 {tag:'div', cls:'DirectLoginListPopup_body', children:[
55 {tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[ 53 {tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[
56 // {tag:'li', children:[ 54 // {tag:'li', children:[
57 // {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'}, 55 // {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'},
58 // {tag:'a', href:'#', html:"Google Mail"} 56 // {tag:'a', href:'#', html:"Google Mail"}
59 // ]}, 57 // ]},
60 // ... 58 // ...
61 ]} 59 ]}
62 ]}, 60 ]},
63 {tag:'div', cls:'DirectLoginListPopup_footer'} 61 {tag:'div', cls:'DirectLoginListPopup_footer'}
64 ]}); 62 ]});
65 63
66 MochiKit.Style.hideElement(this.getId('DirectLoginListPopup')); 64 MochiKit.Style.hideElement(this.getId('DirectLoginListPopup'));
67 65
68 //BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh 66 //BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh
69 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter'); 67 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter');
70 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave'); 68 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave');
71 }, 69 },
72 70
73 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
74 72
75 'renderCell': function(aRowElement, anObject) { 73 'renderCell': function(aRowElement, anObject) {
76 var i,c; 74 var i,c;
77 var directLoginsInfo; 75 var directLoginsInfo;
78 76
79 directLoginsInfo = anObject[this.name()]; 77 directLoginsInfo = anObject[this.name()];
80 78
81 TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'}); 79 TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'});
82 80
83 c = Math.min(2, directLoginsInfo.length); 81 c = Math.min(2, directLoginsInfo.length);
84 for (i=0; i<c; i++) { 82 for (i=0; i<c; i++) {
85 var elementID; 83 var elementID;
86 84
87 elementID = 'directLogin_' + directLoginsInfo[i]['_reference']; 85 elementID = 'directLogin_' + directLoginsInfo[i]['_reference'];
88 86
89 Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[ 87 Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[
90 {tag:'div', cls:'card_directLogin_body', children:[ 88 {tag:'div', cls:'card_directLogin_body', children:[
91 {tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']} 89 {tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']}
92 ]} 90 ]}
93 ]}); 91 ]});
94 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 92 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
95 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 93 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
96 } 94 }
97 95
98 if (directLoginsInfo.length > 2) { 96 if (directLoginsInfo.length > 2) {
99 var ellipsesElement; 97 var ellipsesElement;
100 98
101 ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[ 99 ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[
102 {tag:'div', cls:'card_directLogin_ellipses_body', children:[ 100 {tag:'div', cls:'card_directLogin_ellipses_body', children:[
103 {tag:'span', html:'&hellip;'} 101 {tag:'span', html:'&hellip;'}
104 ]} 102 ]}
105 ]}); 103 ]});
106 104
107 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject)); 105 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject));
108 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave')); 106 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave'));
109 // MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave')); 107 // MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
110 this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave')); 108 this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
111 } 109 }
112 // MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject)); 110 // MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
113 this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject)); 111 this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
114 112
115 }, 113 },
116 114
117 //========================================================================= 115 //=========================================================================
118/* 116/*
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
index 6297002..bdb044a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
@@ -1,86 +1,84 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'renderCell': function(aRowElement, anObject) { 45 'renderCell': function(aRowElement, anObject) {
48 varfaviconImageElement; 46 varfaviconImageElement;
49 var faviconUrl; 47 var faviconUrl;
50 48
51 faviconImageElement = this.getId('favicon'); 49 faviconImageElement = this.getId('favicon');
52 faviconUrl = anObject[this.name()]; 50 faviconUrl = anObject[this.name()];
53 51
54 if (faviconUrl == null) { 52 if (faviconUrl == null) {
55 faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 53 faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
56 } 54 }
57 55
58 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 56 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
59 {tag:'img', id:faviconImageElement, src:faviconUrl} 57 {tag:'img', id:faviconImageElement, src:faviconUrl}
60 ]}); 58 ]});
61 59
62 MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage'); 60 MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage');
63 MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage'); 61 MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage');
64 MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage'); 62 MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage');
65 }, 63 },
66 64
67 //----------------------------------------------------- 65 //-----------------------------------------------------
68 66
69 'handleLoadedFaviconImage': function(anEvent) { 67 'handleLoadedFaviconImage': function(anEvent) {
70 MochiKit.Signal.disconnectAllTo(anEvent.src()); 68 MochiKit.Signal.disconnectAllTo(anEvent.src());
71 if (anEvent.src().complete == false) { 69 if (anEvent.src().complete == false) {
72 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 70 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
73 } 71 }
74 }, 72 },
75 73
76 //----------------------------------------------------- 74 //-----------------------------------------------------
77 75
78 'handleMissingFaviconImage': function(anEvent) { 76 'handleMissingFaviconImage': function(anEvent) {
79 MochiKit.Signal.disconnectAllTo(anEvent.src()); 77 MochiKit.Signal.disconnectAllTo(anEvent.src());
80 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 78 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
81 }, 79 },
82 80
83 //----------------------------------------------------- 81 //-----------------------------------------------------
84 '__syntax_fix__' : 'syntax fix' 82 '__syntax_fix__' : 'syntax fix'
85}); 83});
86 84
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
index 51d55f4..21dddc9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
@@ -1,230 +1,226 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.GridComponent = function(args) { 26Clipperz.PM.UI.Web.Components.GridComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._columnsManagers = args.columnsManagers; 31 this._columnsManagers = args.columnsManagers;
34 32
35 this._rowsObjects = []; 33 this._rowsObjects = [];
36 this._noRowsGridComponent = null; 34 this._noRowsGridComponent = null;
37 35
38 this._slots = { 36 this._slots = {
39 'headerSlot':this.getId('headerSlot') 37 'headerSlot':this.getId('headerSlot')
40 }; 38 };
41 39
42 return this; 40 return this;
43} 41}
44 42
45//============================================================================= 43//=============================================================================
46 44
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'toString': function () { 49 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.GridComponent component"; 50 return "Clipperz.PM.UI.Web.Components.GridComponent component";
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'rows': function () { 55 'rows': function () {
58 throw Clipperz.Base.exception.AbstractMethod; 56 throw Clipperz.Base.exception.AbstractMethod;
59 // return this._rows; 57 // return this._rows;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'columnsManagers': function () { 62 'columnsManagers': function () {
65 return this._columnsManagers; 63 return this._columnsManagers;
66 }, 64 },
67 65
68 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
69 67
70 'renderSelf': function(/*aContainer, aPosition*/) { 68 'renderSelf': function(/*aContainer, aPosition*/) {
71 this.append(this.element(), [ 69 this.append(this.element(), [
72 {tag:'div', cls:'header', children:[ 70 {tag:'div', cls:'header', children:[
73 {tag:'form', id:this.getId('searchForm'), cls:'search', children:[ 71 {tag:'form', id:this.getId('searchForm'), cls:'search', children:[
74 {tag:'div', cls:'search', children:[ 72 {tag:'div', cls:'search', children:[
75 {tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/} 73 {tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/}
76 ]}, 74 ]},
77 {tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')}, 75 {tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')},
78 // {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"}, 76 // {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"},
79 {tag:'div', cls:'headerSlot', id:this.getId('headerSlot')} 77 {tag:'div', cls:'headerSlot', id:this.getId('headerSlot')}
80 ]} 78 ]}
81 ]}, 79 ]},
82 {tag:'div', cls:'body', children:[ 80 {tag:'div', cls:'body', children:[
83 {tag:'div', cls:'rows', id:this.getId('rows'), children:[ 81 {tag:'div', cls:'rows', id:this.getId('rows'), children:[
84 {tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[ 82 {tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[
85 {tag:'thead', children:[ 83 {tag:'thead', children:[
86 {tag:'tr', id:this.getId('thead_tr'), children:[]} 84 {tag:'tr', id:this.getId('thead_tr'), children:[]}
87 ]}, 85 ]},
88 {tag:'tbody', id:this.getId('gridRows'), children:[]} 86 {tag:'tbody', id:this.getId('gridRows'), children:[]}
89 ]} 87 ]}
90 ]}, 88 ]},
91 {tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]} 89 {tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]}
92 ]}, 90 ]},
93 {tag:'div', cls:'footer'} 91 {tag:'div', cls:'footer'}
94 ]); 92 ]);
95 93
96 this.renderHeader(); 94 this.renderHeader();
97 MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler'); 95 MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler');
98 }, 96 },
99 97
100 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
101 99
102 'renderHeader': function () { 100 'renderHeader': function () {
103 var headerElement; 101 var headerElement;
104 102
105 headerElement = this.getElement('thead_tr'); 103 headerElement = this.getElement('thead_tr');
106 headerElement.innerHTML = ""; 104 headerElement.innerHTML = "";
107 105
108 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 106 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
109 aColumnManager.renderHeader(headerElement); 107 aColumnManager.renderHeader(headerElement);
110 }); 108 });
111 }, 109 },
112 110
113 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
114 112
115 'update': function (someObjects) { 113 'update': function (someObjects) {
116 this._rowsObjects = someObjects 114 this._rowsObjects = someObjects
117 this.refresh(); 115 this.refresh();
118 this.focus(); 116 this.focus();
119 }, 117 },
120 118
121 'focus': function () { 119 'focus': function () {
122 this.getElement('search').focus(); 120 this.getElement('search').focus();
123 }, 121 },
124 122
125 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
126 124
127 'startSearch': function () { 125 'startSearch': function () {
128//console.log("--> startSearch");
129 MochiKit.DOM.addElementClass(this.getElement('search'), 'running'); 126 MochiKit.DOM.addElementClass(this.getElement('search'), 'running');
130 }, 127 },
131 128
132 'endSearch': function () { 129 'endSearch': function () {
133 MochiKit.DOM.removeElementClass(this.getElement('search'), 'running'); 130 MochiKit.DOM.removeElementClass(this.getElement('search'), 'running');
134//console.log("<-- startSearch");
135 }, 131 },
136 132
137 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
138 134
139 'disconnectColumnManagersRowsSignals': function () { 135 'disconnectColumnManagersRowsSignals': function () {
140 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 136 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
141 aColumnManager.disconnectRowsSignals(); 137 aColumnManager.disconnectRowsSignals();
142 }); 138 });
143 }, 139 },
144 140
145 //------------------------------------------------------------------------- 141 //-------------------------------------------------------------------------
146 142
147 'refresh': function () { 143 'refresh': function () {
148 var gridRowsElement; 144 var gridRowsElement;
149 var rowClass; 145 var rowClass;
150 146
151 this.disconnectColumnManagersRowsSignals(); 147 this.disconnectColumnManagersRowsSignals();
152 148
153 { 149 {
154 MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled'); 150 MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled');
155 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null); 151 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null);
156 MochiKit.DOM.removeElementClass(this.element(), 'empty'); 152 MochiKit.DOM.removeElementClass(this.element(), 'empty');
157 MochiKit.DOM.removeElementClass(this.element(), 'noRows'); 153 MochiKit.DOM.removeElementClass(this.element(), 'noRows');
158 } 154 }
159 155
160 156
161 gridRowsElement = this.getElement('gridRows'); 157 gridRowsElement = this.getElement('gridRows');
162 gridRowsElement.innerHTML = ""; 158 gridRowsElement.innerHTML = "";
163 159
164 MochiKit.DOM.removeElementClass(this.element(), 'empty'); 160 MochiKit.DOM.removeElementClass(this.element(), 'empty');
165 161
166 rowClass = 'odd'; 162 rowClass = 'odd';
167 MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) { 163 MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) {
168 var cardRowElement; 164 var cardRowElement;
169 165
170 cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass}); 166 cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass});
171 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 167 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
172 aColumnManager.renderCell(cardRowElement, aRowObject); 168 aColumnManager.renderCell(cardRowElement, aRowObject);
173 }); 169 });
174 170
175 rowClass = (rowClass == 'odd') ? 'even' : 'odd'; 171 rowClass = (rowClass == 'odd') ? 'even' : 'odd';
176 }, this)); 172 }, this));
177 }, 173 },
178 174
179 //----------------------------------------------------------------------------- 175 //-----------------------------------------------------------------------------
180 176
181 'filterElement': function () { 177 'filterElement': function () {
182 return this.getElement('search'); 178 return this.getElement('search');
183 }, 179 },
184 180
185 //------------------------------------------------------------------------- 181 //-------------------------------------------------------------------------
186 182
187 'shouldShowElementWhileRendering': function () { 183 'shouldShowElementWhileRendering': function () {
188 return false; 184 return false;
189 }, 185 },
190 186
191 //------------------------------------------------------------------------- 187 //-------------------------------------------------------------------------
192 188
193 'selectRow': function (aRowObject) { 189 'selectRow': function (aRowObject) {
194 MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected'); 190 MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected');
195 }, 191 },
196 192
197 'unselectRow': function (aRowObject) { 193 'unselectRow': function (aRowObject) {
198 MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected'); 194 MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected');
199 }, 195 },
200 196
201 //------------------------------------------------------------------------- 197 //-------------------------------------------------------------------------
202 /* 198 /*
203 'passOpenDirectLogin': function(aDirectLoginReferenceId) { 199 'passOpenDirectLogin': function(aDirectLoginReferenceId) {
204 MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId); 200 MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId);
205 }, 201 },
206 */ 202 */
207 //------------------------------------------------------------------------- 203 //-------------------------------------------------------------------------
208 204
209 'clearSearchHandler': function (anEvent) { 205 'clearSearchHandler': function (anEvent) {
210 var searchElement; 206 var searchElement;
211 207
212 anEvent.preventDefault(); 208 anEvent.preventDefault();
213 209
214 searchElement = this.getElement('search'); 210 searchElement = this.getElement('search');
215 searchElement.value = ""; 211 searchElement.value = "";
216 searchElement.focus(); 212 searchElement.focus();
217 }, 213 },
218 214
219 //------------------------------------------------------------------------- 215 //-------------------------------------------------------------------------
220 216
221 'drawEmpty': function () { 217 'drawEmpty': function () {
222 this.disconnectColumnManagersRowsSignals(); 218 this.disconnectColumnManagersRowsSignals();
223 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled'); 219 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
224 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled'); 220 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
225 221
226 gridRowsElement = this.getElement('gridRows'); 222 gridRowsElement = this.getElement('gridRows');
227 gridRowsElement.innerHTML = ""; 223 gridRowsElement.innerHTML = "";
228 MochiKit.DOM.addElementClass(this.element(), 'empty'); 224 MochiKit.DOM.addElementClass(this.element(), 'empty');
229 }, 225 },
230 226
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
index 3e03fcf..d1d9d7f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
@@ -1,65 +1,63 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.ImageColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.ImageColumnManager component";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'renderCell': function(aRowElement, anObject) { 45 'renderCell': function(aRowElement, anObject) {
48 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 46 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
49 {tag:'img', src:anObject[this.name()]} 47 {tag:'img', src:anObject[this.name()]}
50 ]}); 48 ]});
51 49
52 // return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [ 50 // return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [
53 // this.selector(), 51 // this.selector(),
54 // MochiKit.Base.bind(function (aValue) { 52 // MochiKit.Base.bind(function (aValue) {
55 // Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 53 // Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
56 // {tag:'img', src:aValue} 54 // {tag:'img', src:aValue}
57 // ]}); 55 // ]});
58 // }, this) 56 // }, this)
59 // ], {trace:false}, anObject); 57 // ], {trace:false}, anObject);
60 }, 58 },
61 59
62 //----------------------------------------------------- 60 //-----------------------------------------------------
63 '__syntax_fix__' : 'syntax fix' 61 '__syntax_fix__' : 'syntax fix'
64}); 62});
65 63
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
index f3f9cd5..69f735b 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
@@ -1,89 +1,87 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args);
33 31
34 this._actionMethod = args.actionMethod || null; 32 this._actionMethod = args.actionMethod || null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'actionMethod': function () { 47 'actionMethod': function () {
50 return this._actionMethod; 48 return this._actionMethod;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'renderCell': function(aRowElement, anObject) { 53 'renderCell': function(aRowElement, anObject) {
56 vartdElement; 54 vartdElement;
57 varlinkElement; 55 varlinkElement;
58 56
59 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 57 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
60 {tag:'span', children:[ 58 {tag:'span', children:[
61 {tag:'a', href:'#', html:anObject[this.name()]} 59 {tag:'a', href:'#', html:anObject[this.name()]}
62 ]} 60 ]}
63 ]}); 61 ]});
64 62
65 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 63 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
66 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 64 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
67 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 65 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
68 }, 66 },
69 67
70 //----------------------------------------------------- 68 //-----------------------------------------------------
71 69
72 'handleLinkClick': function (anObject, anEvent) { 70 'handleLinkClick': function (anObject, anEvent) {
73 anEvent.preventDefault(); 71 anEvent.preventDefault();
74 72
75 if (this.actionMethod() != null) { 73 if (this.actionMethod() != null) {
76 var deferredResult; 74 var deferredResult;
77 75
78 deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false}); 76 deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false});
79 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject); 77 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject);
80 deferredResult.addCallback(this.actionMethod(), anObject, anEvent); 78 deferredResult.addCallback(this.actionMethod(), anObject, anEvent);
81 // deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject); 79 // deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject);
82 deferredResult.callback(); 80 deferredResult.callback();
83 } 81 }
84 }, 82 },
85 83
86 //----------------------------------------------------- 84 //-----------------------------------------------------
87 '__syntax_fix__' : 'syntax fix' 85 '__syntax_fix__' : 'syntax fix'
88}); 86});
89 87
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
index a10ba4f..38a9421 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.LoginForm = function(args) { 26Clipperz.PM.UI.Web.Components.LoginForm = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 this._autocomplete = args.autocomplete || 'off'; 29 this._autocomplete = args.autocomplete || 'off';
32 30
33 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments);
34 32
35 this._slots = { 33 this._slots = {
36 'passphraseEntropy':this.getId('passphraseEntropy') 34 'passphraseEntropy':this.getId('passphraseEntropy')
37 }; 35 };
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.LoginForm component"; 47 return "Clipperz.PM.UI.Web.Components.LoginForm component";
50 }, 48 },
51 49
52 'autocomplete': function () { 50 'autocomplete': function () {
53 return this._autocomplete; 51 return this._autocomplete;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'renderSelf': function() { 56 'renderSelf': function() {
59 this.append(this.element(), {tag:'div', id:'loginBox', children:[ 57 this.append(this.element(), {tag:'div', id:'loginBox', children:[
60 {tag:'div', cls:'header'}, 58 {tag:'div', cls:'header'},
61 {tag:'div', cls:'body', id:this.getId('body'), children:[ 59 {tag:'div', cls:'body', id:this.getId('body'), children:[
62 {tag:'div', id:this.getId('loginForm'), children:[ 60 {tag:'div', id:this.getId('loginForm'), children:[
63 {tag:'div', children:[ 61 {tag:'div', children:[
64 {tag:'h4', html:'Login'}, 62 {tag:'h4', html:'Login'},
65 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[ 63 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[
66 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[ 64 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[
67 {tag:'label', html:'username', 'for':this.getId('usernameField')}, 65 {tag:'label', html:'username', 'for':this.getId('usernameField')},
68 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'}, 66 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'},
69 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')}, 67 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')},
70 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'}, 68 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'},
71 69
72 {tag:'div', cls:'translations', children:[ 70 {tag:'div', cls:'translations', children:[
73 {tag:'h4', html:'choose your language'}, 71 {tag:'h4', html:'choose your language'},
74 {tag:'ul', children:[ 72 {tag:'ul', children:[
75 {tag:'li', cls:'selected', html:'english'}, 73 {tag:'li', cls:'selected', html:'english'},
76 {tag:'li', html:'italiano'}, 74 {tag:'li', html:'italiano'},
77 {tag:'li', html:'dutch'}, 75 {tag:'li', html:'dutch'},
78 {tag:'li', html:'french'}, 76 {tag:'li', html:'french'},
79 {tag:'li', html:'spanish'}, 77 {tag:'li', html:'spanish'},
80 {tag:'li', html:'chinese'}, 78 {tag:'li', html:'chinese'},
81 {tag:'li', html:'japanese'}, 79 {tag:'li', html:'japanese'},
82 {tag:'li', html:'portugal'}, 80 {tag:'li', html:'portugal'},
83 {tag:'li', html:'arabic'} 81 {tag:'li', html:'arabic'}
84 ]} 82 ]}
85 ]}, 83 ]},
86 84
87 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'} 85 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'}
88 ]} 86 ]}
89 ]} 87 ]}
90 ]} 88 ]}
91 ]}, 89 ]},
92 {tag:'div', cls:'footer'} 90 {tag:'div', cls:'footer'}
93 ]}); 91 ]});
94 92
95 if (this.autocomplete() == 'off') { 93 if (this.autocomplete() == 'off') {
96 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'}); 94 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'});
97 } 95 }
98 96
99 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"}) 97 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"})
100 98
101 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField'))); 99 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField')));
102 100
103 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields'); 101 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields');
104 // this.showPassphraseField(); 102 // this.showPassphraseField();
105 103
106 this.getElement('usernameField').focus(); 104 this.getElement('usernameField').focus();
107 105
108 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler'); 106 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler');
109 }, 107 },
110 108
111 //----------------------------------------------------------------------------- 109 //-----------------------------------------------------------------------------
112/* 110/*
113 'togglePasswordFields': function(anEvent) { 111 'togglePasswordFields': function(anEvent) {
114 var shouldUseOTP; 112 var shouldUseOTP;
115 113
116 shouldUseOTP = this.getElement('otpCheckbox').checked; 114 shouldUseOTP = this.getElement('otpCheckbox').checked;
117 115
118 if (shouldUseOTP == false) { 116 if (shouldUseOTP == false) {
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
index 2894af8..3498e3f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.LoginPage = function(args) { 26Clipperz.PM.UI.Web.Components.LoginPage = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments);
32 30
33 this._slots = { 31 this._slots = {
34 'loginForm':this.getId('loginBoxSlot') 32 'loginForm':this.getId('loginBoxSlot')
35 }; 33 };
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.LoginPage component"; 45 return "Clipperz.PM.UI.Web.Components.LoginPage component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'renderSelf': function(/*aContainer, aPosition*/) { 50 'renderSelf': function(/*aContainer, aPosition*/) {
53 this.append(this.element(), [ 51 this.append(this.element(), [
54 {tag:'div', id:this.getId('loginBoxSlot')}, 52 {tag:'div', id:this.getId('loginBoxSlot')},
55 {tag:'div', id:'main', children:[ 53 {tag:'div', id:'main', children:[
56 {tag:'div', id:'featurePoints', children:[ 54 {tag:'div', id:'featurePoints', children:[
57 {tag:'table', children:[ 55 {tag:'table', children:[
58 {tag:'tr', children:[ 56 {tag:'tr', children:[
59 {tag:'td', children:[ 57 {tag:'td', children:[
60 {tag:'div', cls:'block', children:[ 58 {tag:'div', cls:'block', children:[
61 {tag:'h3', html:'Clipperz is:'}, 59 {tag:'h3', html:'Clipperz is:'},
62 {tag:'ul', children:[ 60 {tag:'ul', children:[
63 {tag:'li', html:'a secure and simple password manager'}, 61 {tag:'li', html:'a secure and simple password manager'},
64 {tag:'li', html:'an effective single sign-on solution'}, 62 {tag:'li', html:'an effective single sign-on solution'},
65 {tag:'li', html:'a digital vault for your personal data'} 63 {tag:'li', html:'a digital vault for your personal data'}
66 ]} 64 ]}
67 ]}, 65 ]},
68 {tag:'div', cls:'block', children:[ 66 {tag:'div', cls:'block', children:[
69 {tag:'h3', html:'Clipperz benefits:'}, 67 {tag:'h3', html:'Clipperz benefits:'},
70 {tag:'ul', children:[ 68 {tag:'ul', children:[
71 {tag:'li', html:'free and completely anonymous'}, 69 {tag:'li', html:'free and completely anonymous'},
72 {tag:'li', html:'access it any time from any computer'}, 70 {tag:'li', html:'access it any time from any computer'},
73 {tag:'li', html:'no software to download and nothing to install'}, 71 {tag:'li', html:'no software to download and nothing to install'},
74 {tag:'li', html:'avoid keeping secrets on your PC or on paper'} 72 {tag:'li', html:'avoid keeping secrets on your PC or on paper'}
75 ]} 73 ]}
76 ]} 74 ]}
77 ]}, {tag:'td', children:[ 75 ]}, {tag:'td', children:[
78 {tag:'div', cls:'block', children:[ 76 {tag:'div', cls:'block', children:[
79 {tag:'h3', html:'Clipperz security:'}, 77 {tag:'h3', html:'Clipperz security:'},
80 {tag:'ul', children:[ 78 {tag:'ul', children:[
81 {tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'}, 79 {tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'},
82 {tag:'li', html:'the encryption key is a passphrase known only to you'}, 80 {tag:'li', html:'the encryption key is a passphrase known only to you'},
83 {tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'}, 81 {tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'},
84 {tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'}, 82 {tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'},
85 {tag:'li', html:'you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!'} 83 {tag:'li', html:'you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!'}
86 ]} 84 ]}
87 ]} 85 ]}
88 ]} 86 ]}
89 ]} 87 ]}
90 ]} 88 ]}
91 ]}, 89 ]},
92 {tag:'div', cls:'activeFeatures', children:[ 90 {tag:'div', cls:'activeFeatures', children:[
93 {tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[ 91 {tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[
94 {tag:'canvas', id:this.getId('registerButtonIcon')}, 92 {tag:'canvas', id:this.getId('registerButtonIcon')},
95 {tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[ 93 {tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[
96 {tag:'span', cls:'payoff', html:"Free sign up!"}, 94 {tag:'span', cls:'payoff', html:"Free sign up!"},
97 {tag:'span', cls:'link', html:"Create account >>"} 95 {tag:'span', cls:'link', html:"Create account >>"}
98 ]} 96 ]}
99 ]}, 97 ]},
100 {tag:'div', cls:'keepTogether', children:[ 98 {tag:'div', cls:'keepTogether', children:[
101 {tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[ 99 {tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[
102 {tag:'canvas', id:this.getId('lookIcon')}, 100 {tag:'canvas', id:this.getId('lookIcon')},
103 {tag:'a', href:'#', cls:'screenshotLink', children:[ 101 {tag:'a', href:'#', cls:'screenshotLink', children:[
104 {tag:'span', cls:'payoff', html:"Look Clipperz!"}, 102 {tag:'span', cls:'payoff', html:"Look Clipperz!"},
105 {tag:'span', cls:'link', html:"screenshot tour >>"} 103 {tag:'span', cls:'link', html:"screenshot tour >>"}
106 ]} 104 ]}
107 ]}, 105 ]},
108 {tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[ 106 {tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[
109 {tag:'canvas', id:this.getId('downloadIcon')}, 107 {tag:'canvas', id:this.getId('downloadIcon')},
110 {tag:'a', href:'#', cls:'offlineLink', children:[ 108 {tag:'a', href:'#', cls:'offlineLink', children:[
111 {tag:'span', cls:'payoff', html:"Download!"}, 109 {tag:'span', cls:'payoff', html:"Download!"},
112 {tag:'span', cls:'link', html:"Offline version >>"} 110 {tag:'span', cls:'link', html:"Offline version >>"}
113 ]} 111 ]}
114 ]} 112 ]}
115 ]} 113 ]}
116 ]} 114 ]}
117 ]} 115 ]}
118 ]); 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 26506e7..3fef6c5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
@@ -1,156 +1,153 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.LoginProgress = function(args) { 26Clipperz.PM.UI.Web.Components.LoginProgress = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments);
32 30
33 this._deferred = null; 31 this._deferred = null;
34 32
35 return this; 33 return this;
36} 34}
37 35
38//============================================================================= 36//=============================================================================
39 37
40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, { 38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, {
41 39
42 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.LoginProgress component"; 43 return "Clipperz.PM.UI.Web.Components.LoginProgress component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'deferred': function() { 48 'deferred': function() {
51 return this._deferred; 49 return this._deferred;
52 }, 50 },
53 51
54 'setDeferred': function(aValue) { 52 'setDeferred': function(aValue) {
55 this._deferred = aValue; 53 this._deferred = aValue;
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'renderSelf': function() { 58 'renderSelf': function() {
61 // var loginProgressElement; 59 // var loginProgressElement;
62 // 60 //
63 // loginProgressElement = MochiKit.DOM.getElement('loginProgress'); 61 // loginProgressElement = MochiKit.DOM.getElement('loginProgress');
64 // 62 //
65 // if (loginProgressElement == null) { 63 // if (loginProgressElement == null) {
66 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true); 64 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true);
67 // } 65 // }
68 66
69//console.log(">> LoginProgress.renderSelf", this.element());
70 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [ 67 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [
71 // this.append(loginProgressElement, [ 68 // this.append(loginProgressElement, [
72 {tag:'div', cls:'header', children:[ 69 {tag:'div', cls:'header', children:[
73 {tag:'h3', id:this.getId('title'), html:"login progress"} 70 {tag:'h3', id:this.getId('title'), html:"login progress"}
74 ]}, 71 ]},
75 {tag:'div', cls:'body', children:[ 72 {tag:'div', cls:'body', children:[
76 {tag:'div', id:this.getId('progressBar')}, 73 {tag:'div', id:this.getId('progressBar')},
77 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[ 74 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[
78 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]}, 75 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]},
79 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]}, 76 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]},
80 {tag:'p', html:"Login failed"} 77 {tag:'p', html:"Login failed"}
81 ]} 78 ]}
82 ]}, 79 ]},
83 {tag:'div', cls:'footer', children:[ 80 {tag:'div', cls:'footer', children:[
84 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[ 81 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[
85 // {tag:'div', cls:'button', id:this.getId('button'), children:[ 82 // {tag:'div', cls:'button', id:this.getId('button'), children:[
86 // {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"} 83 // {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"}
87 // ]} 84 // ]}
88 {tag:'a', cls:'button', id:this.getId('button'), html:"cancel"} 85 {tag:'a', cls:'button', id:this.getId('button'), html:"cancel"}
89 ]} 86 ]}
90 ]} 87 ]}
91 ]}); 88 ]});
92 // ]); 89 // ]);
93 90
94 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff"); 91 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff");
95 92
96 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 93 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
97 MochiKit.Style.hideElement(this.getElement('errorBox')); 94 MochiKit.Style.hideElement(this.getElement('errorBox'));
98 95
99 // MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler'); 96 // MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler');
100 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'cancelEventHandler'); 97 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'cancelEventHandler');
101 }, 98 },
102 99
103 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
104 101
105 'displayElement': function() { 102 'displayElement': function() {
106 return MochiKit.DOM.getElement('loginProgress'); 103 return MochiKit.DOM.getElement('loginProgress');
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 107
111 'cancelEventHandler': function(anEvent) { 108 'cancelEventHandler': function(anEvent) {
112 anEvent.preventDefault(); 109 anEvent.preventDefault();
113 110
114 MochiKit.Signal.signal(this, 'cancelEvent'); 111 MochiKit.Signal.signal(this, 'cancelEvent');
115 }, 112 },
116 113
117 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
118 115
119 'disableCancel': function() { 116 'disableCancel': function() {
120 MochiKit.Style.hideElement(this.getElement('buttonArea')); 117 MochiKit.Style.hideElement(this.getElement('buttonArea'));
121 }, 118 },
122 119
123 //------------------------------------------------------------------------- 120 //-------------------------------------------------------------------------
124 121
125 'showErrorMessage': function() { 122 'showErrorMessage': function() {
126 // this.getElement('buttonLink').innerHTML = "close"; 123 // this.getElement('buttonLink').innerHTML = "close";
127 this.getElement('button').innerHTML = "close"; 124 this.getElement('button').innerHTML = "close";
128 MochiKit.DOM.addElementClass(this.getElement('button'), 'default'); 125 MochiKit.DOM.addElementClass(this.getElement('button'), 'default');
129 126
130 MochiKit.Style.hideElement(this.getElement('progressBar')); 127 MochiKit.Style.hideElement(this.getElement('progressBar'));
131 128
132 this.getElement('title').innerHTML = "Error"; 129 this.getElement('title').innerHTML = "Error";
133 MochiKit.Style.showElement(this.getElement('errorBox')); 130 MochiKit.Style.showElement(this.getElement('errorBox'));
134 MochiKit.Style.showElement(this.getElement('buttonArea')); 131 MochiKit.Style.showElement(this.getElement('buttonArea'));
135 }, 132 },
136 133
137 //------------------------------------------------------------------------- 134 //-------------------------------------------------------------------------
138 135
139 'deferredHideModalAndRemove': function(someParameters, aResult) { 136 'deferredHideModalAndRemove': function(someParameters, aResult) {
140 vardeferredResult; 137 vardeferredResult;
141 138
142 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false}); 139 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false});
143 deferredResult.addMethod(this, 'deferredHideModal'); 140 deferredResult.addMethod(this, 'deferredHideModal');
144 deferredResult.addMethod(this, 'remove'); 141 deferredResult.addMethod(this, 'remove');
145 deferredResult.addCallback(function () { 142 deferredResult.addCallback(function () {
146 return aResult; 143 return aResult;
147 }); 144 });
148 deferredResult.callback(someParameters); 145 deferredResult.callback(someParameters);
149 146
150 return deferredResult; 147 return deferredResult;
151 }, 148 },
152 149
153 //------------------------------------------------------------------------- 150 //-------------------------------------------------------------------------
154 151
155 __syntaxFix__: "syntax fix" 152 __syntaxFix__: "syntax fix"
156}); 153});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
index feb16ad..06746d1 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
@@ -1,223 +1,219 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) { 26Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._tabPanelController = null; 31 this._tabPanelController = null;
34 32
35 this._initiallySelectedTab = args.selected || 'CREDENTIALS'; 33 this._initiallySelectedTab = args.selected || 'CREDENTIALS';
36 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
37 'CREDENTIALS': { 35 'CREDENTIALS': {
38 tab:'credentialsTab', 36 tab:'credentialsTab',
39 panel:'credentialsTabpanel' 37 panel:'credentialsTabpanel'
40 }, 38 },
41 'CHECK_CREDENTIALS': { 39 'CHECK_CREDENTIALS': {
42 tab:'checkCredentialsTab', 40 tab:'checkCredentialsTab',
43 panel:'checkCredentialsTabpanel' 41 panel:'checkCredentialsTabpanel'
44 }, 42 },
45 'TERMS_OF_SERVICE': { 43 'TERMS_OF_SERVICE': {
46 tab:'termsOfServiceTab', 44 tab:'termsOfServiceTab',
47 panel:'termsOfServiceTabpanel' 45 panel:'termsOfServiceTabpanel'
48 }, 46 },
49 'CREATE_USER': { 47 'CREATE_USER': {
50 tab:'createUserTab', 48 tab:'createUserTab',
51 panel:'createUserTabpanel' 49 panel:'createUserTabpanel'
52 }//, 50 }//,
53/* 51/*
54 'LOGIN': { 52 'LOGIN': {
55 tab:'loginTab', 53 tab:'loginTab',
56 panel:'loginTabpanel' 54 panel:'loginTabpanel'
57 } 55 }
58*/ 56*/
59 }; 57 };
60 58
61 return this; 59 return this;
62} 60}
63 61
64//============================================================================= 62//=============================================================================
65 63
66Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 64Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
67 65
68 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
69 67
70 'toString': function () { 68 'toString': function () {
71 return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component"; 69 return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component";
72 }, 70 },
73 71
74 //========================================================================= 72 //=========================================================================
75 73
76 'disableAllPanels': function () { 74 'disableAllPanels': function () {
77 this.tabPanelController().selectTab(null); 75 this.tabPanelController().selectTab(null);
78 }, 76 },
79 77
80 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
81 79
82 'enableCredentialsPanel': function () { 80 'enableCredentialsPanel': function () {
83 this.tabPanelController().selectTab('CREDENTIALS'); 81 this.tabPanelController().selectTab('CREDENTIALS');
84 }, 82 },
85 83
86 'enableCheckCredentialsPanel': function () { 84 'enableCheckCredentialsPanel': function () {
87 this.tabPanelController().selectTab('CHECK_CREDENTIALS'); 85 this.tabPanelController().selectTab('CHECK_CREDENTIALS');
88 }, 86 },
89 87
90 'enableTermsOfServicePanel': function () { 88 'enableTermsOfServicePanel': function () {
91 this.tabPanelController().selectTab('TERMS_OF_SERVICE'); 89 this.tabPanelController().selectTab('TERMS_OF_SERVICE');
92 }, 90 },
93 91
94 'enableCreateUserPanel': function () { 92 'enableCreateUserPanel': function () {
95 this.tabPanelController().selectTab('CREATE_USER'); 93 this.tabPanelController().selectTab('CREATE_USER');
96 }, 94 },
97 95
98 //'enableLoginPanel': function () { 96 //'enableLoginPanel': function () {
99 // this.tabPanelController().selectTab('LOGIN'); 97 // this.tabPanelController().selectTab('LOGIN');
100 //}, 98 //},
101 99
102 //========================================================================= 100 //=========================================================================
103 101
104 'shouldShowElementWhileRendering': function() { 102 'shouldShowElementWhileRendering': function() {
105 return false; 103 return false;
106 }, 104 },
107 105
108 //========================================================================= 106 //=========================================================================
109 107
110 'tabPanelController': function () { 108 'tabPanelController': function () {
111 if (this._tabPanelController == null) { 109 if (this._tabPanelController == null) {
112 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 110 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
113 component:this, 111 component:this,
114 configuration:this._tabPanelControllerConfiguration 112 configuration:this._tabPanelControllerConfiguration
115 }); 113 });
116 114
117 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') 115 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
118 } 116 }
119 117
120 return this._tabPanelController; 118 return this._tabPanelController;
121 }, 119 },
122 120
123 //------------------------------------------------------------------------- 121 //-------------------------------------------------------------------------
124 122
125 'renderSelf': function() { 123 'renderSelf': function() {
126//console.log('** Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
127
128 this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [ 124 this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [
129 {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[ 125 {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[
130 {tag:'div', cls:'header', children:[ 126 {tag:'div', cls:'header', children:[
131 {tag:'div', cls:'title', children:[ 127 {tag:'div', cls:'title', children:[
132 {tag:'h3', id:this.getId('title'), html:"Create new user"} 128 {tag:'h3', id:this.getId('title'), html:"Create new user"}
133 ]} 129 ]}
134 ]}, 130 ]},
135 {tag:'div', id:this.getId('body'), cls:'body', children:[ 131 {tag:'div', id:this.getId('body'), cls:'body', children:[
136 {tag:'div', cls:'tabContainer', children:[ 132 {tag:'div', cls:'tabContainer', children:[
137 {tag:'ul', cls:'tabs', children:[ 133 {tag:'ul', cls:'tabs', children:[
138 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]}, 134 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]},
139 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]}, 135 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]},
140 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]}, 136 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]},
141 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//, 137 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//,
142 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]}, 138 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]},
143 ]}, 139 ]},
144 {tag:'ul', cls:'tabPanels', children:[ 140 {tag:'ul', cls:'tabPanels', children:[
145 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[ 141 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[
146 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]}, 142 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]},
147 {tag:'ul', cls:'credentials', children:[ 143 {tag:'ul', cls:'credentials', children:[
148 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]}, 144 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]},
149 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]} 145 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]}
150 ]} 146 ]}
151 ]}, 147 ]},
152 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[ 148 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[
153 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]}, 149 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]},
154 {tag:'ul', cls:'credentials', children:[ 150 {tag:'ul', cls:'credentials', children:[
155 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]} 151 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]}
156 ]} 152 ]}
157 ]}, 153 ]},
158 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[ 154 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[
159 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]}, 155 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]},
160 {tag:'ul', cls:'termsOfService', children:[ 156 {tag:'ul', cls:'termsOfService', children:[
161 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]}, 157 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]},
162 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>."}]} 158 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>."}]}
163 ]} 159 ]}
164 ]}, 160 ]},
165 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[ 161 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[
166 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]}, 162 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]},
167 {tag:'ul', cls:'createUserStates', children:[ 163 {tag:'ul', cls:'createUserStates', children:[
168 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]}, 164 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]},
169 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]}, 165 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]},
170 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]} 166 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]}
171 ]} 167 ]}
172 ]}//, 168 ]}//,
173 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[ 169 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[
174 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]}, 170 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]},
175 // ]} 171 // ]}
176 ]} 172 ]}
177 ]} 173 ]}
178 ]}, 174 ]},
179 {tag:'div', id:this.getId('footer'), cls:'footer', children:[ 175 {tag:'div', id:this.getId('footer'), cls:'footer', children:[
180 {tag:'div', cls:'buttonArea', children:[ 176 {tag:'div', cls:'buttonArea', children:[
181 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"}, 177 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
182 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"} 178 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
183 ]} 179 ]}
184 ]} 180 ]}
185 ]}, 181 ]},
186 {tag:'div', cls:'clear'} 182 {tag:'div', cls:'clear'}
187 ]}); 183 ]});
188 184
189 this.tabPanelController().setup(); 185 this.tabPanelController().setup();
190 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent'); 186 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent');
191 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent'); 187 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent');
192 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 188 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
193 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 189 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
194 }, 190 },
195 191
196 //------------------------------------------------------------------------- 192 //-------------------------------------------------------------------------
197/* 193/*
198 'resetContent': function () { 194 'resetContent': function () {
199 this.getElement('username').value = ''; 195 this.getElement('username').value = '';
200 this.getElement('passphrase').value = ''; 196 this.getElement('passphrase').value = '';
201 }, 197 },
202*/ 198*/
203 //------------------------------------------------------------------------- 199 //-------------------------------------------------------------------------
204 200
205 'displayElement': function() { 201 'displayElement': function() {
206 return this.getElement('panel'); 202 return this.getElement('panel');
207 }, 203 },
208 204
209 //------------------------------------------------------------------------- 205 //-------------------------------------------------------------------------
210 206
211 'handleTabSelected': function (aSelectedTab) { 207 'handleTabSelected': function (aSelectedTab) {
212/* 208/*
213 switch (aSelectedTab) { 209 switch (aSelectedTab) {
214 case 'DETAILS': 210 case 'DETAILS':
215 break; 211 break;
216 case 'DIRECT_LOGINS': 212 case 'DIRECT_LOGINS':
217 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList')); 213 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
218 break; 214 break;
219 case 'SHARING': 215 case 'SHARING':
220 break; 216 break;
221 } 217 }
222*/ 218*/
223 }, 219 },
@@ -240,188 +236,184 @@ Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Cli
240 return this.getElement('re-passphrase').value; 236 return this.getElement('re-passphrase').value;
241 }, 237 },
242 238
243 'awareOfUnrecoverablePassphrase': function () { 239 'awareOfUnrecoverablePassphrase': function () {
244 return this.getElement('awareOfUnrecoverablePassphrase').value; 240 return this.getElement('awareOfUnrecoverablePassphrase').value;
245 }, 241 },
246 242
247 'readTermsOfService': function () { 243 'readTermsOfService': function () {
248 return this.getElement('readTermsOfService').value; 244 return this.getElement('readTermsOfService').value;
249 }, 245 },
250 246
251 //========================================================================= 247 //=========================================================================
252/* 248/*
253 'incrementUpdateFaviconCounter': function () { 249 'incrementUpdateFaviconCounter': function () {
254 this._updateFaviconCounter ++; 250 this._updateFaviconCounter ++;
255 }, 251 },
256 252
257 'decrementUpdateFaviconCounter': function () { 253 'decrementUpdateFaviconCounter': function () {
258 this._updateFaviconCounter --; 254 this._updateFaviconCounter --;
259 }, 255 },
260 256
261 'updateFaviconCounter': function () { 257 'updateFaviconCounter': function () {
262 return this._updateFaviconCounter; 258 return this._updateFaviconCounter;
263 }, 259 },
264 */ 260 */
265 //------------------------------------------------------------------------- 261 //-------------------------------------------------------------------------
266/* 262/*
267 'updateFavicon': function () { 263 'updateFavicon': function () {
268 this.decrementUpdateFaviconCounter(); 264 this.decrementUpdateFaviconCounter();
269 265
270 if (this.updateFaviconCounter() == 0) { 266 if (this.updateFaviconCounter() == 0) {
271 this.setFavicon(this.favicon()); 267 this.setFavicon(this.favicon());
272 } 268 }
273 }, 269 },
274*/ 270*/
275 //========================================================================= 271 //=========================================================================
276/* 272/*
277 'bindingComponents': function () { 273 'bindingComponents': function () {
278 return this._bindingComponents; 274 return this._bindingComponents;
279 }, 275 },
280 276
281 'clearAllBindingsComponents': function () { 277 'clearAllBindingsComponents': function () {
282 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove')); 278 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
283 this._bindingComponents = []; 279 this._bindingComponents = [];
284 this.getElement('bindings').innerHTML = ''; 280 this.getElement('bindings').innerHTML = '';
285 }, 281 },
286 282
287 'addBindingComponent': function (aBindingComponent) { 283 'addBindingComponent': function (aBindingComponent) {
288 this.bindingComponents().push(aBindingComponent); 284 this.bindingComponents().push(aBindingComponent);
289 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'})); 285 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
290 }, 286 },
291*/ 287*/
292 //========================================================================= 288 //=========================================================================
293/* 289/*
294 'formValueComponents': function () { 290 'formValueComponents': function () {
295 return this._formValueComponents; 291 return this._formValueComponents;
296 }, 292 },
297 293
298 'clearAllFormValueComponents': function () { 294 'clearAllFormValueComponents': function () {
299 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove')); 295 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
300 this._formValueComponents = []; 296 this._formValueComponents = [];
301 this.getElement('formValues').innerHTML = ''; 297 this.getElement('formValues').innerHTML = '';
302 }, 298 },
303 299
304 'addFormValueComponent': function (aFormValueComponent) { 300 'addFormValueComponent': function (aFormValueComponent) {
305 this.formValueComponents().push(aFormValueComponent); 301 this.formValueComponents().push(aFormValueComponent);
306 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'})); 302 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'}));
307 }, 303 },
308*/ 304*/
309 //========================================================================= 305 //=========================================================================
310 306
311 'changedValue': function (anEvent) { 307 'changedValue': function (anEvent) {
312 MochiKit.Signal.signal(this, 'changedValue', anEvent); 308 MochiKit.Signal.signal(this, 'changedValue', anEvent);
313 309
314 this.incrementUpdateFaviconCounter(); 310 this.incrementUpdateFaviconCounter();
315 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon')); 311 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon'));
316 }, 312 },
317 313
318 //------------------------------------------------------------------------- 314 //-------------------------------------------------------------------------
319 315
320 'handleBackClick': function (anEvent) { 316 'handleBackClick': function (anEvent) {
321 anEvent.preventDefault(); 317 anEvent.preventDefault();
322 318
323 MochiKit.Signal.signal(this, 'back'); 319 MochiKit.Signal.signal(this, 'back');
324 }, 320 },
325 321
326 //========================================================================= 322 //=========================================================================
327 323
328 'bottomMargin': function () { 324 'bottomMargin': function () {
329 var result; 325 var result;
330 326
331 //TODO: WTF!!! 327 //TODO: WTF!!!
332 // result =MochiKit.Style.getElementPosition(this.element())['y'] + 328 // result =MochiKit.Style.getElementPosition(this.element())['y'] +
333 // MochiKit.Style.getElementDimensions(this.element())['h']; 329 // MochiKit.Style.getElementDimensions(this.element())['h'];
334 330
335 // result =MochiKit.Style.getElementPosition(this.getElement('footer'))['y']; 331 // result =MochiKit.Style.getElementPosition(this.getElement('footer'))['y'];
336//console.log("### bottomMargin");
337//console.log('displayElement', this.displayElement());
338//console.log('-- Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
339//console.log('element', MochiKit.Style.getElementPosition('modalDialog') ['y'], MochiKit.Style.getElementDimensions('modalDialog')['h']);
340 // result = 450; 332 // result = 450;
341 333
342 result =Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] + 334 result =Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] +
343 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] - 335 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] -
344 60; 336 60;
345 337
346 return result; 338 return result;
347 }, 339 },
348 340
349 //========================================================================= 341 //=========================================================================
350 342
351 'focusOnUsernameElement': function () { 343 'focusOnUsernameElement': function () {
352 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus')); 344 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus'));
353 }, 345 },
354 346
355 'focusOnRePassphraseElement': function () { 347 'focusOnRePassphraseElement': function () {
356 this.getElement('re-passphrase').focus(); 348 this.getElement('re-passphrase').focus();
357 }, 349 },
358 /* 350 /*
359 'focusOnBookmarkletConfigurationElement': function () { 351 'focusOnBookmarkletConfigurationElement': function () {
360 this.getElement('bookmarkletConfiguration').focus(); 352 this.getElement('bookmarkletConfiguration').focus();
361 }, 353 },
362 354
363 'focusOnFaviconElement': function () { 355 'focusOnFaviconElement': function () {
364 this.getElement('faviconURL').focus(); 356 this.getElement('faviconURL').focus();
365 }, 357 },
366*/ 358*/
367 359
368 //========================================================================= 360 //=========================================================================
369 361
370 'hideAllProgeressStates': function () { 362 'hideAllProgeressStates': function () {
371 MochiKit.Style.hideElement(this.getElement('creatingRegistering')); 363 MochiKit.Style.hideElement(this.getElement('creatingRegistering'));
372 MochiKit.Style.hideElement(this.getElement('creatingDone')); 364 MochiKit.Style.hideElement(this.getElement('creatingDone'));
373 MochiKit.Style.hideElement(this.getElement('creatingFailed')); 365 MochiKit.Style.hideElement(this.getElement('creatingFailed'));
374 }, 366 },
375 367
376 'showProgressOnUserCreation': function () { 368 'showProgressOnUserCreation': function () {
377//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation"); 369//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation");
378 this.hideAllProgeressStates(); 370 this.hideAllProgeressStates();
379 MochiKit.Style.showElement(this.getElement('creatingRegistering')); 371 MochiKit.Style.showElement(this.getElement('creatingRegistering'));
380 }, 372 },
381 373
382 'showUserCreationDone': function () { 374 'showUserCreationDone': function () {
383//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone"); 375//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone");
384 this.hideAllProgeressStates(); 376 this.hideAllProgeressStates();
385 MochiKit.Style.showElement(this.getElement('creatingDone')); 377 MochiKit.Style.showElement(this.getElement('creatingDone'));
386//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone"); 378//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone");
387 }, 379 },
388 380
389 'showUserCreationFailed': function () { 381 'showUserCreationFailed': function () {
390//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed"); 382//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed");
391 this.hideAllProgeressStates(); 383 this.hideAllProgeressStates();
392 MochiKit.Style.showElement(this.getElement('creatingFailed')); 384 MochiKit.Style.showElement(this.getElement('creatingFailed'));
393 }, 385 },
394 386
395 //========================================================================= 387 //=========================================================================
396 388
397 'handleKeyEvent': function (anEvent) { 389 'handleKeyEvent': function (anEvent) {
398 MochiKit.Signal.signal(this, 'keyPressed', anEvent); 390 MochiKit.Signal.signal(this, 'keyPressed', anEvent);
399/* 391/*
400 if (anEvent.key().string == 'KEY_ENTER') { 392 if (anEvent.key().string == 'KEY_ENTER') {
401 if (anEvent.target().nodeName != 'TEXTAREA') { 393 if (anEvent.target().nodeName != 'TEXTAREA') {
402 MochiKit.Signal.signal(this, 'moveForward'); 394 MochiKit.Signal.signal(this, 'moveForward');
403 anEvent.preventDefault(); 395 anEvent.preventDefault();
404 } 396 }
405 } else if (anEvent.key().string == 'KEY_TAB') { 397 } else if (anEvent.key().string == 'KEY_TAB') {
406 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) { 398 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
407 MochiKit.Signal.signal(this, 'moveForward'); 399 MochiKit.Signal.signal(this, 'moveForward');
408 anEvent.preventDefault(); 400 anEvent.preventDefault();
409 } 401 }
410 } 402 }
411*/ 403*/
412 }, 404 },
413 405
414 'handleTermsOfServiceCheckboxChange': function (anEvent) { 406 'handleTermsOfServiceCheckboxChange': function (anEvent) {
415 MochiKit.Signal.signal(this, 'changedValue'); 407 MochiKit.Signal.signal(this, 'changedValue');
416 }, 408 },
417 409
418 //========================================================================= 410 //=========================================================================
419 411
420 'clear': function () { 412 'clear': function () {
421 this.tabPanelController().selectTab(null); 413 this.tabPanelController().selectTab(null);
422 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.clear.apply(this, arguments); 414 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.clear.apply(this, arguments);
423 }, 415 },
424 416
425 //========================================================================= 417 //=========================================================================
426 __syntaxFix__: "syntax fix" 418 __syntaxFix__: "syntax fix"
427}); 419});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
index 3cc5a37..30cbeb2 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
@@ -1,68 +1,66 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.Page = function(args) { 26Clipperz.PM.UI.Web.Components.Page = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments);
32 30
33 this._slots = { 31 this._slots = {
34 'header':'pageHeader', 32 'header':'pageHeader',
35 'body': 'pageBody', 33 'body': 'pageBody',
36 'footer':'pageFooter' 34 'footer':'pageFooter'
37 }; 35 };
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.Page component"; 47 return "Clipperz.PM.UI.Web.Components.Page component";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'renderSelf': function(/*aContainer, aPosition*/) { 52 'renderSelf': function(/*aContainer, aPosition*/) {
55 this.append(this.element(), [ 53 this.append(this.element(), [
56 {tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[ 54 {tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[
57 {tag:'div', id:'pageHeader', cls:'pageHeader'}, 55 {tag:'div', id:'pageHeader', cls:'pageHeader'},
58 {tag:'div', id:'pageBody', cls:'pageBody'} 56 {tag:'div', id:'pageBody', cls:'pageBody'}
59 ]}, 57 ]},
60 {tag:'div', id:'pageFooter', cls:'pageFooter'} 58 {tag:'div', id:'pageFooter', cls:'pageFooter'}
61 ]); 59 ]);
62 60
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 __syntaxFix__: "syntax fix" 65 __syntaxFix__: "syntax fix"
68}); 66});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
index dcf506f..df3ca0c 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
@@ -1,67 +1,65 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.PageFooter = function(args) { 26Clipperz.PM.UI.Web.Components.PageFooter = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments);
32 30
33 return this; 31 return this;
34} 32}
35 33
36//============================================================================= 34//=============================================================================
37 35
38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, { 36Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, {
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return "Clipperz.PM.UI.Web.Components.PageFooter component"; 41 return "Clipperz.PM.UI.Web.Components.PageFooter component";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'renderSelf': function(/*aContainer, aPosition*/) { 46 'renderSelf': function(/*aContainer, aPosition*/) {
49 this.append(this.element(), [ 47 this.append(this.element(), [
50 {tag:'div', cls:'footerWrapper', children:[ 48 {tag:'div', cls:'footerWrapper', children:[
51 {tag:'div', cls:'footerContent', children:[ 49 {tag:'div', cls:'footerContent', children:[
52 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'}, 50 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'},
53 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009-2013 Clipperz Srl'}, 51 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009-2013 Clipperz Srl'},
54 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'}, 52 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'},
55 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'}, 53 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'},
56 {tag:'div', cls:'applicationVersion', htmlString:'application version: <a href="https://github.com/clipperz/password-manager/tree/' + Clipperz_version + '" target="github">' + Clipperz_version + '</a>'} 54 {tag:'div', cls:'applicationVersion', htmlString:'application version: <a href="https://github.com/clipperz/password-manager/tree/' + Clipperz_version + '" target="github">' + Clipperz_version + '</a>'}
57 ]} 55 ]}
58 ]} 56 ]}
59 ]); 57 ]);
60 58
61 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e"); 59 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e");
62 }, 60 },
63 61
64 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
65 63
66 __syntaxFix__: "syntax fix" 64 __syntaxFix__: "syntax fix"
67}); 65});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
index b8f3b05..5e49fb5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.PageHeader = function(args) { 26Clipperz.PM.UI.Web.Components.PageHeader = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments);
32 this._newsIsOpen = args.newsIsOpen || false; 30 this._newsIsOpen = args.newsIsOpen || false;
33 this._animationDuration = args.animationDuration || 0.5; 31 this._animationDuration = args.animationDuration || 0.5;
34 32
35 this._offset = 82; 33 this._offset = 82;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.PageHeader component"; 45 return "Clipperz.PM.UI.Web.Components.PageHeader component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'iframeURL': function () { 50 'iframeURL': function () {
53 // return './rss_view.html'; 51 // return './rss_view.html';
54 return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html'; 52 return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html';
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'renderSelf': function(/*aContainer, aPosition*/) { 57 'renderSelf': function(/*aContainer, aPosition*/) {
60 this.append(this.element(), [ 58 this.append(this.element(), [
61 {tag:'div', id:'miscLinks', children:[ 59 {tag:'div', id:'miscLinks', children:[
62 {tag:'ul', children:[ 60 {tag:'ul', children:[
63 {tag:'li', children:[{tag:'a', id:'donateHeaderLink', stringID:'pageHeader.donation', href:'http://www.clipperz.com/donations', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.donation')}]}, 61 {tag:'li', children:[{tag:'a', id:'donateHeaderLink', stringID:'pageHeader.donation', href:'http://www.clipperz.com/donations', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.donation')}]},
64 {tag:'li', children:[{tag:'a', id:'forumHeaderLink', stringID:'pageHeader.forum', href:'http://www.clipperz.com/forum', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.forum')}]}, 62 {tag:'li', children:[{tag:'a', id:'forumHeaderLink', stringID:'pageHeader.forum', href:'http://www.clipperz.com/forum', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.forum')}]},
65 {tag:'li', children:[{tag:'a', id:'creditsHeaderLink', stringID:'pageHeader.credits', href:'http://www.clipperz.com/credits', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.credits')}]}, 63 {tag:'li', children:[{tag:'a', id:'creditsHeaderLink', stringID:'pageHeader.credits', href:'http://www.clipperz.com/credits', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.credits')}]},
66 {tag:'li', children:[{tag:'a', id:'feedbackHeaderLink', stringID:'pageHeader.feedback', href:'http://www.clipperz.com/contact', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.feedback')}]}, 64 {tag:'li', children:[{tag:'a', id:'feedbackHeaderLink', stringID:'pageHeader.feedback', href:'http://www.clipperz.com/contact', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.feedback')}]},
67 {tag:'li', children:[{tag:'a', id:'helpHeaderLink', stringID:'pageHeader.help', href:'http://www.clipperz.com/support/user_guide',target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.help')}]} 65 {tag:'li', children:[{tag:'a', id:'helpHeaderLink', stringID:'pageHeader.help', href:'http://www.clipperz.com/support/user_guide',target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.help')}]}
68 ]} 66 ]}
69 ]}, 67 ]},
70 {tag:'div', id:'logoFrame', children:[ 68 {tag:'div', id:'logoFrame', children:[
71 {tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[ 69 {tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[
72 // {tag:'h1', cls:'logo', html:"clipperz"}, 70 // {tag:'h1', cls:'logo', html:"clipperz"},
73 {tag:'canvas', id:this.getId('logo'), cls:'logo'}, 71 {tag:'canvas', id:this.getId('logo'), cls:'logo'},
74 {tag:'h5', cls:'clipperzPayoff', html:"keep it to yourself!"} 72 {tag:'h5', cls:'clipperzPayoff', html:"keep it to yourself!"}
75 ]} 73 ]}
76 ]}, 74 ]},
77 {tag:'div', id:'news', cls:'hidden', children:[ 75 {tag:'div', id:'news', cls:'hidden', children:[
78 // {tag:'div', cls:'close', children:[ 76 // {tag:'div', cls:'close', children:[
79 // {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'} 77 // {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'}
80 // ]}, 78 // ]},
81 {tag:'div', id:'newsframe', children:[ 79 {tag:'div', id:'newsframe', children:[
82 {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()} 80 {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()}
83 ]}, 81 ]},
84 {tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[ 82 {tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[
85 {tag:'div', cls:'gripHandler', children:[]} 83 {tag:'div', cls:'gripHandler', children:[]}
86 ]} 84 ]}
87 ]}, 85 ]},
88 {tag:'div', id:'featureTabs', children:[ 86 {tag:'div', id:'featureTabs', children:[
89 {tag:'table', children:[{tag:'tr', children:[ 87 {tag:'table', children:[{tag:'tr', children:[
90 {tag:'td', children:[{tag:'div', id:'feature_store', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('storeIcon')}, {tag:'span', html:"Store and manage your password and online credentials"}]}]}, 88 {tag:'td', children:[{tag:'div', id:'feature_store', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('storeIcon')}, {tag:'span', html:"Store and manage your password and online credentials"}]}]},
91 {tag:'td', children:[{tag:'div', id:'feature_protect', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('protectIcon')}, {tag:'span', html:"Protect all your sensitive data"}]}]}, 89 {tag:'td', children:[{tag:'div', id:'feature_protect', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('protectIcon')}, {tag:'span', html:"Protect all your sensitive data"}]}]},
92 {tag:'td', children:[{tag:'div', id:'feature_directLogin', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('directLoginIcon')},{tag:'span', html:"Login to your web services without entering any username or password"}]}]}, 90 {tag:'td', children:[{tag:'div', id:'feature_directLogin', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('directLoginIcon')},{tag:'span', html:"Login to your web services without entering any username or password"}]}]},
93 {tag:'td', children:[{tag:'div', id:'feature_share', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('shareIcon')}, {tag:'span', html:"Share secret with family members and associates"}]}]} 91 {tag:'td', children:[{tag:'div', id:'feature_share', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('shareIcon')}, {tag:'span', html:"Share secret with family members and associates"}]}]}
94 ]}]} 92 ]}]}
95 ]} 93 ]}
96 ]); 94 ]);
97 95
98 Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff"); 96 Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff");
99 Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff"); 97 Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff");
100 Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff"); 98 Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff");
101 Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000"); 99 Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000");
102 100
103 MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips'); 101 MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips');
104 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad'); 102 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
105 this.setLogoDefaultColors(); 103 this.setLogoDefaultColors();
106 }, 104 },
107 105
108 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
109 107
110 'switchToLoggedMode': function() { 108 'switchToLoggedMode': function() {
111 // MochiKit.Style.addElementClass(this.element(), 'logged'); 109 // MochiKit.Style.addElementClass(this.element(), 'logged');
112 MochiKit.Style.hideElement('featureTabs'); 110 MochiKit.Style.hideElement('featureTabs');
113 }, 111 },
114 112
115 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
116 114
117 'animationDuration': function () { 115 'animationDuration': function () {
118 return this._animationDuration; 116 return this._animationDuration;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
index 987e51e..5eb0c1f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) { 26Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments);
32 30
33 this._referenceElement = args.referenceElement|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._referenceElement = args.referenceElement|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
35 33
36 this._boxDimensions = null; 34 this._boxDimensions = null;
37 this._isVisible = false; 35 this._isVisible = false;
38 36
39 this.renderSelf(); 37 this.renderSelf();
40 38
41 return this; 39 return this;
42} 40}
43 41
44//============================================================================= 42//=============================================================================
45 43
46Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'toString': function () { 48 'toString': function () {
51 return "Clipperz.PM.UI.Web.Components.PasswordTooltip component"; 49 return "Clipperz.PM.UI.Web.Components.PasswordTooltip component";
52 }, 50 },
53 51
54 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
55 53
56 'referenceElement': function () { 54 'referenceElement': function () {
57 return this._referenceElement; 55 return this._referenceElement;
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'text': function () { 60 'text': function () {
63 return this._text; 61 return this._text;
64 }, 62 },
65 63
66 'setText': function (aValue) { 64 'setText': function (aValue) {
67 this._text = aValue; 65 this._text = aValue;
68 }, 66 },
69 67
70 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
71 69
72 'isVisible': function () { 70 'isVisible': function () {
73 return this._isVisible; 71 return this._isVisible;
74 }, 72 },
75 73
76 'setIsVisible': function (aValue) { 74 'setIsVisible': function (aValue) {
77 this._isVisible = aValue; 75 this._isVisible = aValue;
78 }, 76 },
79 77
80 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
81 79
82 'renderSelf': function() { 80 'renderSelf': function() {
83 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[ 81 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[
84 {tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[ 82 {tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[
85 {tag:'div', cls:'passwordTooltip_text', children:[ 83 {tag:'div', cls:'passwordTooltip_text', children:[
86 {tag:'span', html:this.text()} 84 {tag:'span', html:this.text()}
87 ]}, 85 ]},
88 {tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'} 86 {tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'}
89 ]}, 87 ]},
90 {tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'} 88 {tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'}
91 ]}); 89 ]});
92 90
93 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 91 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
94 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 92 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
95 93
96 MochiKit.Style.hideElement(this.displayElement()); 94 MochiKit.Style.hideElement(this.displayElement());
97 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 95 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
98 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 96 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
99 }, 97 },
100 98
101 //----------------------------------------------------- 99 //-----------------------------------------------------
102 100
103 'displayElement': function() { 101 'displayElement': function() {
104 return this.getElement('tooltip'); 102 return this.getElement('tooltip');
105 }, 103 },
106 104
107 //------------------------------------------------------------------------- 105 //-------------------------------------------------------------------------
108 106
109 'boxDimensions': function () { 107 'boxDimensions': function () {
110 return this._boxDimensions; 108 return this._boxDimensions;
111 }, 109 },
112 110
113 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
114 112
115 'show': function () { 113 'show': function () {
116 var elementSizeAndPosition; 114 var elementSizeAndPosition;
117 var arrowPosition; 115 var arrowPosition;
118 var bodyPosition; 116 var bodyPosition;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
index 69c1ede..ad8d677 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
@@ -1,211 +1,208 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.RulerComponent = function(args) { 26Clipperz.PM.UI.Web.Components.RulerComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments); 28 Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments);
31 29
32 this._translationContext = args.translationContext|| Clipperz.Base.exception.raise('MandatoryParameter'); 30 this._translationContext = args.translationContext|| Clipperz.Base.exception.raise('MandatoryParameter');
33 // this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter'); 31 // this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter');
34 this._steps = args.steps; 32 this._steps = args.steps;
35 33
36 this._currentStep = -1; 34 this._currentStep = -1;
37 35
38 return this; 36 return this;
39} 37}
40 38
41//============================================================================= 39//=============================================================================
42 40
43Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'toString': function () { 45 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.RulerComponent component"; 46 return "Clipperz.PM.UI.Web.Components.RulerComponent component";
49 }, 47 },
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'resetStatus': function (args) { 51 'resetStatus': function (args) {
54 args = args || {}; 52 args = args || {};
55 53
56 if (this.currentStep() != 0) { 54 if (this.currentStep() != 0) {
57 var shouldAnimateTransition; 55 var shouldAnimateTransition;
58 56
59 shouldAnimateTransition = args.animateTransition || false; 57 shouldAnimateTransition = args.animateTransition || false;
60 58
61 if (shouldAnimateTransition) { 59 if (shouldAnimateTransition) {
62 this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved')); 60 this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved'));
63 } else { 61 } else {
64 this._currentStep = 0; 62 this._currentStep = 0;
65 this.cursorMoved(); 63 this.cursorMoved();
66 } 64 }
67 } 65 }
68 }, 66 },
69 67
70 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
71 69
72 'translationContext': function () { 70 'translationContext': function () {
73 return this._translationContext; 71 return this._translationContext;
74 }, 72 },
75 73
76 'steps': function () { 74 'steps': function () {
77 return this._steps; 75 return this._steps;
78 }, 76 },
79 77
80 'setSteps': function (aValue) { 78 'setSteps': function (aValue) {
81 this._steps = aValue; 79 this._steps = aValue;
82 this.renderStepsComponents(); 80 this.renderStepsComponents();
83 this.resetStatus(); 81 this.resetStatus();
84 }, 82 },
85 83
86 'translatedStepDescription': function (aStep) { 84 'translatedStepDescription': function (aStep) {
87 return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name'); 85 return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name');
88 }, 86 },
89 87
90 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
91 89
92 'renderSelf': function(/*aContainer, aPosition*/) { 90 'renderSelf': function(/*aContainer, aPosition*/) {
93 this.setElement(this.append(MochiKit.DOM.currentDocument().body, [ 91 this.setElement(this.append(MochiKit.DOM.currentDocument().body, [
94 {tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[ 92 {tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[
95 {tag:'div', cls:'ruler', children:[ 93 {tag:'div', cls:'ruler', children:[
96 {tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:'&nbsp;'}, 94 {tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:'&nbsp;'},
97 {tag:'a', href:'#', id:this.getId('smallPreviousButton'),cls:'smallButton previous', html:'&nbsp;'}, 95 {tag:'a', href:'#', id:this.getId('smallPreviousButton'),cls:'smallButton previous', html:'&nbsp;'},
98 {tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:'&nbsp;'}, 96 {tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:'&nbsp;'},
99 {tag:'div', cls:'marker', id:this.getId('marker'), children:[ 97 {tag:'div', cls:'marker', id:this.getId('marker'), children:[
100 {tag:'div', cls:'previous', id:this.getId('previousButton')}, 98 {tag:'div', cls:'previous', id:this.getId('previousButton')},
101 {tag:'div', cls:'markerBody'}, 99 {tag:'div', cls:'markerBody'},
102 {tag:'div', cls:'next', id:this.getId('nextButton')} 100 {tag:'div', cls:'next', id:this.getId('nextButton')}
103 ]}, 101 ]},
104 {tag:'div', cls:'steps', id:this.getId('stepsFrame')}, 102 {tag:'div', cls:'steps', id:this.getId('stepsFrame')},
105 // {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[ 103 // {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[
106 // {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), this.steps())} 104 // {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), this.steps())}
107 // ]}, 105 // ]},
108 {tag:'div', cls:'dots', id:this.getId('dotsFrame')} 106 {tag:'div', cls:'dots', id:this.getId('dotsFrame')}
109 // {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[ 107 // {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[
110 // {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())} 108 // {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())}
111 // ]} 109 // ]}
112 ]} 110 ]}
113 ]} 111 ]}
114 ])); 112 ]));
115//console.log("ELEMENT", this.element());
116 113
117 MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit'); 114 MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit');
118 115
119 MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious'); 116 MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious');
120 MochiKit.Signal.connect(this.getElement('smallPreviousButton'),'onclick', this, 'handlePrevious'); 117 MochiKit.Signal.connect(this.getElement('smallPreviousButton'),'onclick', this, 'handlePrevious');
121 118
122 MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext'); 119 MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext');
123 MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext'); 120 MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext');
124 121
125 this.enablePrevious(false); 122 this.enablePrevious(false);
126 this.enableNext(false); 123 this.enableNext(false);
127 124
128 // this.cursorMoved(); 125 // this.cursorMoved();
129 }, 126 },
130 127
131 //......................................................................... 128 //.........................................................................
132 129
133 'renderStepsComponents': function () { 130 'renderStepsComponents': function () {
134 varstepsFrame; 131 varstepsFrame;
135 var dotsFrame; 132 var dotsFrame;
136 133
137 stepsFrames = this.getElement('stepsFrame'); 134 stepsFrames = this.getElement('stepsFrame');
138 MochiKit.DOM.setElementClass(stepsFrames, 'steps'); 135 MochiKit.DOM.setElementClass(stepsFrames, 'steps');
139 MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length); 136 MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length);
140 137
141 stepsFrames.innerHTML = ""; 138 stepsFrames.innerHTML = "";
142 this.append(stepsFrames, {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map( 139 this.append(stepsFrames, {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(
143 MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), 140 MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this),
144 this.steps())} 141 this.steps())}
145 ); 142 );
146 143
147 dotsFrames = this.getElement('dotsFrame'); 144 dotsFrames = this.getElement('dotsFrame');
148 MochiKit.DOM.setElementClass(dotsFrames, 'dots'); 145 MochiKit.DOM.setElementClass(dotsFrames, 'dots');
149 MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length); 146 MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length);
150 147
151 dotsFrames.innerHTML = ""; 148 dotsFrames.innerHTML = "";
152 this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map( 149 this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(
153 function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; }, 150 function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; },
154 this.steps())} 151 this.steps())}
155 ); 152 );
156 }, 153 },
157 154
158 //------------------------------------------------------------------------- 155 //-------------------------------------------------------------------------
159 156
160 'handleExit': function (anEvent) { 157 'handleExit': function (anEvent) {
161 anEvent.preventDefault(); 158 anEvent.preventDefault();
162 159
163 MochiKit.Signal.signal(this, 'exit'); 160 MochiKit.Signal.signal(this, 'exit');
164 }, 161 },
165 162
166 //------------------------------------------------------------------------- 163 //-------------------------------------------------------------------------
167 164
168 'handlePrevious': function (anEvent) { 165 'handlePrevious': function (anEvent) {
169 anEvent.preventDefault(); 166 anEvent.preventDefault();
170 167
171 // if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) { 168 // if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) {
172 // this.moveBackward(); 169 // this.moveBackward();
173 // } 170 // }
174 171
175 MochiKit.Signal.signal(this, 'moveBackward'); 172 MochiKit.Signal.signal(this, 'moveBackward');
176 }, 173 },
177 174
178 'handleNext': function (anEvent) { 175 'handleNext': function (anEvent) {
179 anEvent.preventDefault(); 176 anEvent.preventDefault();
180 177
181 // if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) { 178 // if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) {
182 // this.moveForward(); 179 // this.moveForward();
183 // } 180 // }
184 181
185 MochiKit.Signal.signal(this, 'moveForward'); 182 MochiKit.Signal.signal(this, 'moveForward');
186 }, 183 },
187 184
188 //------------------------------------------------------------------------- 185 //-------------------------------------------------------------------------
189 186
190 'currentStep': function () { 187 'currentStep': function () {
191 return this._currentStep; 188 return this._currentStep;
192 }, 189 },
193 190
194 'markerInitialOffset': function () { 191 'markerInitialOffset': function () {
195 return -246; 192 return -246;
196 }, 193 },
197 194
198 'markerStepOffset': function () { 195 'markerStepOffset': function () {
199 return 410 / (this.steps().length - 1); 196 return 410 / (this.steps().length - 1);
200 // return 100; 197 // return 100;
201 }, 198 },
202 199
203 //------------------------------------------------------------------------- 200 //-------------------------------------------------------------------------
204 201
205 'moveToFirstStep': function (aCallback) { 202 'moveToFirstStep': function (aCallback) {
206 varstepsToMove; 203 varstepsToMove;
207 204
208 stepsToMove = this._currentStep; 205 stepsToMove = this._currentStep;
209 this._currentStep = 0; 206 this._currentStep = 0;
210 207
211 this.enablePrevious(false); 208 this.enablePrevious(false);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
index 666afe9..edcdb62 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) { 26Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args); 28 Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args);
31 29
32 this._element = args.element || null; 30 this._element = args.element || null;
33 31
34 this._slots = { 32 this._slots = {
35 }; 33 };
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.TabSidePanel component"; 45 return "Clipperz.PM.UI.Web.Components.TabSidePanel component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'deselectAllTabs': function() { 50 'deselectAllTabs': function() {
53 var tabListItems; 51 var tabListItems;
54 52
55 tabListItems = [ 53 tabListItems = [
56 'cardsLI', 54 'cardsLI',
57 // 'directLoginLI', 55 // 'directLoginLI',
58 'accountLI', 56 'accountLI',
59 'dataLI', 57 'dataLI',
60 'toolsLI' 58 'toolsLI'
61 ]; 59 ];
62 60
63//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id); 61//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id);
64 for (var i in tabListItems) { 62 for (var i in tabListItems) {
65//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]); 63//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]);
66 MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected'); 64 MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected');
67 } 65 }
68 }, 66 },
69 67
70 'selectTab': function(aTabName) { 68 'selectTab': function(aTabName) {
71 this.deselectAllTabs(); 69 this.deselectAllTabs();
72 MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected'); 70 MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected');
73 MochiKit.Signal.signal(this, 'tabSelected', aTabName); 71 MochiKit.Signal.signal(this, 'tabSelected', aTabName);
74 }, 72 },
75 73
76 'tabNameForAnchorId': function(anId) { 74 'tabNameForAnchorId': function(anId) {
77 var result; 75 var result;
78 76
79 switch(anId) { 77 switch(anId) {
80 case 'cards_tabSidePanel': 78 case 'cards_tabSidePanel':
81 result = 'cards'; 79 result = 'cards';
82 break; 80 break;
83 // case 'directLogins_tabSidePanel': 81 // case 'directLogins_tabSidePanel':
84 // result = 'directLogins'; 82 // result = 'directLogins';
85 // break; 83 // break;
86 case 'account_tabSidePanel': 84 case 'account_tabSidePanel':
87 result = 'account'; 85 result = 'account';
88 break; 86 break;
89 case 'data_tabSidePanel': 87 case 'data_tabSidePanel':
90 result = 'data'; 88 result = 'data';
91 break; 89 break;
92 case 'tools_tabSidePanel': 90 case 'tools_tabSidePanel':
93 result = 'tools'; 91 result = 'tools';
94 break; 92 break;
95 } 93 }
96 94
97 return result; 95 return result;
98 }, 96 },
99 97
100 'listItemIdForTabNamed': function(aTabName) { 98 'listItemIdForTabNamed': function(aTabName) {
101 var result; 99 var result;
102 100
103 switch (aTabName) { 101 switch (aTabName) {
104 case 'cards': 102 case 'cards':
105 result = 'cardsLI'; 103 result = 'cardsLI';
106 break; 104 break;
107 // case 'directLogins': 105 // case 'directLogins':
108 // result = 'directLoginLI'; 106 // result = 'directLoginLI';
109 // break; 107 // break;
110 case 'account': 108 case 'account':
111 result = 'accountLI'; 109 result = 'accountLI';
112 break; 110 break;
113 case 'data': 111 case 'data':
114 result = 'dataLI'; 112 result = 'dataLI';
115 break; 113 break;
116 case 'tools': 114 case 'tools':
117 result = 'toolsLI'; 115 result = 'toolsLI';
118 break; 116 break;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
index 3dc9ce9..9b1796a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
@@ -1,50 +1,48 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.TextColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.TextColumnManager component";
43 }, 41 },
44 42
45 //----------------------------------------------------- 43 //-----------------------------------------------------
46 44
47 '__syntax_fix__' : 'syntax fix' 45 '__syntax_fix__' : 'syntax fix'
48 46
49}); 47});
50 48
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 0fa369f..034ed91 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
@@ -1,110 +1,108 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) { 26Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments);
32 30
33 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR'; 31 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR';
34 this._tabPanelControllerConfiguration = { 32 this._tabPanelControllerConfiguration = {
35 'PASSWORD_GENERATOR': { 33 'PASSWORD_GENERATOR': {
36 tab:'passwordGeneratorTab', 34 tab:'passwordGeneratorTab',
37 panel:'passwordGeneratorPanel' 35 panel:'passwordGeneratorPanel'
38 }, 36 },
39 'BOOKMARKLET': { 37 'BOOKMARKLET': {
40 tab:'bookmarkletTab', 38 tab:'bookmarkletTab',
41 panel:'bookmarkletPanel' 39 panel:'bookmarkletPanel'
42 }, 40 },
43 'COMPACT_EDITION': { 41 'COMPACT_EDITION': {
44 tab:'compactEditionTab', 42 tab:'compactEditionTab',
45 panel:'compactEditionPanel' 43 panel:'compactEditionPanel'
46 }, 44 },
47 'HTTP_AUTH': { 45 'HTTP_AUTH': {
48 tab:'httpAuthTab', 46 tab:'httpAuthTab',
49 panel:'httpAuthPanel' 47 panel:'httpAuthPanel'
50 } 48 }
51 }; 49 };
52 50
53 return this; 51 return this;
54} 52}
55 53
56//============================================================================= 54//=============================================================================
57 55
58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 56Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'toString': function () { 60 'toString': function () {
63 return "Clipperz.PM.UI.Web.Components.ToolsPanel component"; 61 return "Clipperz.PM.UI.Web.Components.ToolsPanel component";
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'renderSelf': function(/*aContainer, aPosition*/) { 66 'renderSelf': function(/*aContainer, aPosition*/) {
69 this.append(this.element(), [ 67 this.append(this.element(), [
70 {tag:'div', cls:'header', children:[ 68 {tag:'div', cls:'header', children:[
71 {tag:'div', cls:'subPanelTabs', children:[ 69 {tag:'div', cls:'subPanelTabs', children:[
72 {tag:'ul', children:[ 70 {tag:'ul', children:[
73 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'}, 71 {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'}]}, 72 {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'}]}, 73 {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'}]} 74 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]}
77 ]} 75 ]}
78 ]} 76 ]}
79 ]}, 77 ]},
80 {tag:'div', cls:'body', children:[ 78 {tag:'div', cls:'body', children:[
81 {tag:'div', cls:'accountPanel', children:[ 79 {tag:'div', cls:'accountPanel', children:[
82 {tag:'div', cls:'subPanelContent', children:[ 80 {tag:'div', cls:'subPanelContent', children:[
83 {tag:'ul', children:[ 81 {tag:'ul', children:[
84 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[ 82 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[
85 // {tag:'h3', html:"Password generator"} 83 // {tag:'h3', html:"Password generator"}
86 ]}, 84 ]},
87 {tag:'li', id:this.getId('bookmarkletPanel'),children:[ 85 {tag:'li', id:this.getId('bookmarkletPanel'),children:[
88 // {tag:'h3', html:"Bookmarklet"} 86 // {tag:'h3', html:"Bookmarklet"}
89 ]}, 87 ]},
90 {tag:'li', id:this.getId('compactEditionPanel'), children:[ 88 {tag:'li', id:this.getId('compactEditionPanel'), children:[
91 // {tag:'h3', html:"Compact edition"} 89 // {tag:'h3', html:"Compact edition"}
92 ]}, 90 ]},
93 {tag:'li', id:this.getId('httpAuthPanel'), children:[ 91 {tag:'li', id:this.getId('httpAuthPanel'), children:[
94 // {tag:'h3', html:"HTTP Auth"} 92 // {tag:'h3', html:"HTTP Auth"}
95 ]} 93 ]}
96 ]} 94 ]}
97 ]} 95 ]}
98 ]} 96 ]}
99 ]}, 97 ]},
100 {tag:'div', cls:'footer'} 98 {tag:'div', cls:'footer'}
101 ]); 99 ]);
102 100
103 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 101 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
104 }, 102 },
105 103
106 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
107 105
108 106
109 __syntaxFix__: "syntax fix" 107 __syntaxFix__: "syntax fix"
110}); 108});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
index 21ccf2a..fe46729 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
@@ -1,181 +1,178 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) { 26Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._openFromElement = args.openFromElement || null; 31 this._openFromElement = args.openFromElement || null;
34 this._onOkCloseToElement = args.onOkCloseToElement || null; 32 this._onOkCloseToElement = args.onOkCloseToElement || null;
35 this._onCancelCloseToElement = args.onCancelCloseToElement|| null; 33 this._onCancelCloseToElement = args.onCancelCloseToElement|| null;
36 34
37 this._progressBarComponent = null; 35 this._progressBarComponent = null;
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component"; 47 return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'getPassphrase': function () { 52 'getPassphrase': function () {
55 /* var deferredResult; 53 /* var deferredResult;
56 54
57 if (this.passphrase() == null) { 55 if (this.passphrase() == null) {
58 this.deferredShowModal({'openFromElement': this.openFromElement()}); 56 this.deferredShowModal({'openFromElement': this.openFromElement()});
59 deferredResult = this.deferred(); 57 deferredResult = this.deferred();
60 } else { 58 } else {
61 deferredResult = MochiKit.Async.succeed(this.passphrase()); 59 deferredResult = MochiKit.Async.succeed(this.passphrase());
62 } 60 }
63 61
64 return deferredResult; 62 return deferredResult;
65*/ 63*/
66 64
67 this.deferredShowModal({'openFromElement': this.openFromElement()}); 65 this.deferredShowModal({'openFromElement': this.openFromElement()});
68 66
69 return this.deferred(); 67 return this.deferred();
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 'deferredShowModal': function (someParameters) { 72 'deferredShowModal': function (someParameters) {
75 return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [ 73 return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [
76 MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters), 74 MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters),
77 MochiKit.Base.method(this, 'getElement', 'passphrase'), 75 MochiKit.Base.method(this, 'getElement', 'passphrase'),
78 MochiKit.Base.methodcaller('focus') 76 MochiKit.Base.methodcaller('focus')
79 ], {trace:false}) 77 ], {trace:false})
80 }, 78 },
81 79
82 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
83 81
84 'openFromElement': function () { 82 'openFromElement': function () {
85 return this._openFromElement; 83 return this._openFromElement;
86 }, 84 },
87 85
88 'onOkCloseToElement': function () { 86 'onOkCloseToElement': function () {
89 return this._onOkCloseToElement; 87 return this._onOkCloseToElement;
90 }, 88 },
91 89
92 'onCancelCloseToElement': function () { 90 'onCancelCloseToElement': function () {
93 return this._onCancelCloseToElement; 91 return this._onCancelCloseToElement;
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 'renderSelf': function() { 96 'renderSelf': function() {
99 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments); 97 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments);
100 98
101 this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [ 99 this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [
102 // {tag:'form', id:this.getId('passphraseForm'), children:[ 100 // {tag:'form', id:this.getId('passphraseForm'), children:[
103 {tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''} 101 {tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''}
104 // ]} 102 // ]}
105 ]}); 103 ]});
106 104
107 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler'); 105 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler');
108 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler'); 106 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler');
109 107
110 108
111 // MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus')); 109 // MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus'));
112 // this.getElement('passphrase').select(); 110 // this.getElement('passphrase').select();
113 }, 111 },
114 112
115 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
116 114
117 'showProgressBar': function () { 115 'showProgressBar': function () {
118 varprogressBarElement; 116 varprogressBarElement;
119 117
120 this.getElement('container').innerHTML = ''; 118 this.getElement('container').innerHTML = '';
121 119
122 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'}); 120 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
123 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement})); 121 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
124 122
125 this.setButtons([{text:"Cancel", result:'CANCEL'}]); 123 this.setButtons([{text:"Cancel", result:'CANCEL'}]);
126 }, 124 },
127 125
128 //------------------------------------------------------------------------- 126 //-------------------------------------------------------------------------
129 127
130 'showFailure': function () { 128 'showFailure': function () {
131 this.setType('ALERT'); 129 this.setType('ALERT');
132 this.setTitle("Login failed"); 130 this.setTitle("Login failed");
133 this.setText("Wrong passphrase; the unlock has failed."); 131 this.setText("Wrong passphrase; the unlock has failed.");
134 this.getElement('container').innerHTML = ''; 132 this.getElement('container').innerHTML = '';
135 this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]); 133 this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
136 }, 134 },
137 135
138 //------------------------------------------------------------------------- 136 //-------------------------------------------------------------------------
139 137
140 'closeOk': function () { 138 'closeOk': function () {
141 var passphrase; 139 var passphrase;
142 140
143 passphrase = this.getElement('passphrase').value; 141 passphrase = this.getElement('passphrase').value;
144 this.showProgressBar(); 142 this.showProgressBar();
145 // this.deferred().callback(passphrase); 143 // this.deferred().callback(passphrase);
146 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase)); 144 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase));
147 this._deferred = null; 145 this._deferred = null;
148 }, 146 },
149 147
150 'closeCancel': function () { 148 'closeCancel': function () {
151 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()}); 149 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
152 this.deferred().cancel(); 150 this.deferred().cancel();
153 this._deferred = null; 151 this._deferred = null;
154 }, 152 },
155 153
156 //------------------------------------------------------------------------- 154 //-------------------------------------------------------------------------
157 155
158 'userSuccessfullyLoggedInHandler': function (anEvent) { 156 'userSuccessfullyLoggedInHandler': function (anEvent) {
159 this.deferredHideModal({closeToElement:this.onOkCloseToElement()}); 157 this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
160 }, 158 },
161 159
162 'userLoginFailedHandler': function (anEvent) { 160 'userLoginFailedHandler': function (anEvent) {
163//console.log("############### FAILED LOGIN ################");
164 this.showFailure(); 161 this.showFailure();
165 }, 162 },
166 163
167 //------------------------------------------------------------------------- 164 //-------------------------------------------------------------------------
168/* 165/*
169 'deferredShow': function (someArgs, aResult) { 166 'deferredShow': function (someArgs, aResult) {
170 this.deferredShowModal(someArgs); 167 this.deferredShowModal(someArgs);
171 168
172 // this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement }); 169 // this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
173 // this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement })); 170 // this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
174 // this.deferred().addCallback(MochiKit.Async.succeed, aResult); 171 // this.deferred().addCallback(MochiKit.Async.succeed, aResult);
175 172
176 return this.deferred(); 173 return this.deferred();
177 }, 174 },
178*/ 175*/
179 //------------------------------------------------------------------------- 176 //-------------------------------------------------------------------------
180 __syntaxFix__: "syntax fix" 177 __syntaxFix__: "syntax fix"
181}); 178});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
index d699dc6..fbf58e0 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
@@ -1,245 +1,239 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) { 26Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments);
32 30
33 this._slots = {}; 31 this._slots = {};
34 this._isLocked = false; 32 this._isLocked = false;
35 this._lockTooltip = null; 33 this._lockTooltip = null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.UserInfoBox component"; 45 return "Clipperz.PM.UI.Web.Components.UserInfoBox component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'handleLogout': function(anEvent) { 50 'handleLogout': function(anEvent) {
53//Clipperz.log(">>> UserInfoBox.handleLogout"); 51//Clipperz.log(">>> UserInfoBox.handleLogout");
54 anEvent.preventDefault(); 52 anEvent.preventDefault();
55 MochiKit.Signal.signal(this, 'logout'); 53 MochiKit.Signal.signal(this, 'logout');
56//Clipperz.log("<<< UserInfoBox.handleLogout"); 54//Clipperz.log("<<< UserInfoBox.handleLogout");
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'lockTooltip': function () { 59 'lockTooltip': function () {
62 return this._lockTooltip; 60 return this._lockTooltip;
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'isLocked': function () { 65 'isLocked': function () {
68 return this._isLocked; 66 return this._isLocked;
69 }, 67 },
70 68
71 'setIsLocked': function (aValue) { 69 'setIsLocked': function (aValue) {
72 this._isLocked = aValue; 70 this._isLocked = aValue;
73 }, 71 },
74 72
75 'toggleLock': function(anEvent) { 73 'toggleLock': function(anEvent) {
76 var deferredResult; 74 var deferredResult;
77 var shouldLock; 75 var shouldLock;
78 76
79//console.log(">>> UserInfoBox.toggleLock [locked: " + this.isLocked() + "]");
80 anEvent.preventDefault(); 77 anEvent.preventDefault();
81 this.lockTooltip().hide(); 78 this.lockTooltip().hide();
82 79
83 shouldLock = (this.isLocked() == false); 80 shouldLock = (this.isLocked() == false);
84 81
85 if (shouldLock) { 82 if (shouldLock) {
86 var maskElement; 83 var maskElement;
87 84
88 this.setIsLocked(true); 85 this.setIsLocked(true);
89 maskElement = this.getId('modalDialogMask'); 86 maskElement = this.getId('modalDialogMask');
90 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [ 87 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [
91 MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'), 88 MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'),
92 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}), 89 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}),
93 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')), 90 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')),
94 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock') 91 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock')
95 ], {trace:false}); 92 ], {trace:false});
96 } else { 93 } else {
97 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [ 94 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [
98 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock') 95 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock')
99 ], {trace:false}); 96 ], {trace:false});
100 } 97 }
101//console.log("<<< UserInfoBox.toggleLock");
102 98
103 return deferredResult; 99 return deferredResult;
104 }, 100 },
105 101
106 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
107 103
108 'unlock': function () { 104 'unlock': function () {
109 var deferredResult; 105 var deferredResult;
110 var maskElement; 106 var maskElement;
111 107
112 this.setIsLocked(false); 108 this.setIsLocked(false);
113 maskElement = this.getId('modalDialogMask'); 109 maskElement = this.getId('modalDialogMask');
114 110
115 deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [ 111 deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [
116 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}), 112 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
117 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}), 113 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
118 MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked') 114 MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked')
119 ], {trace:false}); 115 ], {trace:false});
120 }, 116 },
121 117
122 //------------------------------------------------------------------------- 118 //-------------------------------------------------------------------------
123 119
124 'askForPassphrase': function () { 120 'askForPassphrase': function () {
125 varunlockPasswordComponent; 121 varunlockPasswordComponent;
126/* 122/*
127 vardeferredResult; 123 vardeferredResult;
128 124
129 deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false}); 125 deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false});
130 deferredResult.addCallback(MochiKit.Async.succeed, 'test'); 126 deferredResult.addCallback(MochiKit.Async.succeed, 'test');
131 127
132 deferredResult.callback(); 128 deferredResult.callback();
133 129
134 return deferredResult; 130 return deferredResult;
135*/ 131*/
136//console.log(">>> UserInfoBox.askForPassphrase");
137 unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ 132 unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
138 'title':"Unlock account", 133 'title':"Unlock account",
139 'text': "Insert the passprase to unlock the account", 134 'text': "Insert the passprase to unlock the account",
140 'type': 'INFO', 135 'type': 'INFO',
141 'buttons': [ 136 'buttons': [
142 {text:"Cancel",result:'CANCEL'}, 137 {text:"Cancel",result:'CANCEL'},
143 {text:"Unlock", result:'OK',isDefault:true} 138 {text:"Unlock", result:'OK',isDefault:true}
144 ], 139 ],
145 'openFromElement': this.getElement('lock'), 140 'openFromElement': this.getElement('lock'),
146 'onOkCloseToElement': null, 141 'onOkCloseToElement': null,
147 'onCancelCloseToElement':this.getId('lock') 142 'onCancelCloseToElement':this.getId('lock')
148 }); 143 });
149//console.log("<<< UserInfoBox.askForPassphrase");
150 144
151 return unlockPasswordComponent.getPassphrase(); 145 return unlockPasswordComponent.getPassphrase();
152 }, 146 },
153 147
154 //========================================================================= 148 //=========================================================================
155 149
156 'renderSelf': function(/*aContainer, aPosition*/) { 150 'renderSelf': function(/*aContainer, aPosition*/) {
157 this.append(this.element(), [ 151 this.append(this.element(), [
158 // {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'}, 152 // {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'},
159 {tag:'div', cls:'header', children:[ 153 {tag:'div', cls:'header', children:[
160 {tag:'h1', html:"Welcome"}, 154 {tag:'h1', html:"Welcome"},
161 {tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:'&nbsp;'} 155 {tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:'&nbsp;'}
162 ]}, 156 ]},
163 {tag:'div', cls:'body', children:[ 157 {tag:'div', cls:'body', children:[
164 {tag:'h3', id:this.getId('username'), html:""}, 158 {tag:'h3', id:this.getId('username'), html:""},
165 {tag:'ul', children:[ 159 {tag:'ul', children:[
166 {tag:'li', id:this.getId('cards'), children:[ 160 {tag:'li', id:this.getId('cards'), children:[
167 {tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"}, 161 {tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"},
168 {tag:'span', id:this.getId('cardsLabel'), html:"cards"} 162 {tag:'span', id:this.getId('cardsLabel'), html:"cards"}
169 ]}, 163 ]},
170 {tag:'li', id:this.getId('directLogins'), children:[ 164 {tag:'li', id:this.getId('directLogins'), children:[
171 {tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"}, 165 {tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"},
172 {tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"} 166 {tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"}
173 ]} 167 ]}
174 ]}, 168 ]},
175 {tag:'a', href:'#', id:this.getId('logout'), html:"logout >"} 169 {tag:'a', href:'#', id:this.getId('logout'), html:"logout >"}
176 ]}, 170 ]},
177 {tag:'div', cls:'footer'} 171 {tag:'div', cls:'footer'}
178 ]); 172 ]);
179 173
180 MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout'); 174 MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout');
181 MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock'); 175 MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock');
182 176
183 this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 177 this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
184 element:this.getElement('lock'), 178 element:this.getElement('lock'),
185 text: "Click here to lock/unlock your account.", 179 text: "Click here to lock/unlock your account.",
186 position:'RIGHT' 180 position:'RIGHT'
187 }); 181 });
188 182
189 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, 183 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
190 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[ 184 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[
191 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'} 185 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'}
192 ]} 186 ]}
193 ); 187 );
194 MochiKit.Style.hideElement(this.getId('modalDialogMask')); 188 MochiKit.Style.hideElement(this.getId('modalDialogMask'));
195 189
196 // this.drawUserInfoBackground(this.getElement('canvas')); 190 // this.drawUserInfoBackground(this.getElement('canvas'));
197 }, 191 },
198 192
199 //------------------------------------------------------------------------- 193 //-------------------------------------------------------------------------
200/* 194/*
201 'drawUserInfoBackground': function (canvas) { 195 'drawUserInfoBackground': function (canvas) {
202 var kMyDrawingFunctionWidth = 188.0; 196 var kMyDrawingFunctionWidth = 188.0;
203 var kMyDrawingFunctionHeight = 154.0; 197 var kMyDrawingFunctionHeight = 154.0;
204 198
205 var context = canvas.getContext("2d"); 199 var context = canvas.getContext("2d");
206 var color; 200 var color;
207 var resolution; 201 var resolution;
208 var alignStroke; 202 var alignStroke;
209 var path; 203 var path;
210 var pointX; 204 var pointX;
211 var pointY; 205 var pointY;
212 var controlPoint1X; 206 var controlPoint1X;
213 var controlPoint1Y; 207 var controlPoint1Y;
214 var controlPoint2X; 208 var controlPoint2X;
215 var controlPoint2Y; 209 var controlPoint2Y;
216 var gradient; 210 var gradient;
217 if (window.devicePixelRatio) 211 if (window.devicePixelRatio)
218 resolution = window.devicePixelRatio; 212 resolution = window.devicePixelRatio;
219 else 213 else
220 resolution = 1.0; 214 resolution = 1.0;
221 resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight); 215 resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight);
222 216
223 context.save(); 217 context.save();
224 context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight); 218 context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight);
225 context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight); 219 context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight);
226 220
227 // Setup for Shadow Effect 221 // Setup for Shadow Effect
228 color = "rgba(0.0%, 0.0%, 0.0%, 0.667)"; 222 color = "rgba(0.0%, 0.0%, 0.0%, 0.667)";
229 context.save(); 223 context.save();
230 context.shadowColor = color; 224 context.shadowColor = color;
231 context.shadowBlur = 3.0; 225 context.shadowBlur = 3.0;
232 context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution; 226 context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution;
233 context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution; 227 context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution;
234 228
235 // Layer 1 229 // Layer 1
236 230
237 alignStroke = 0.0; 231 alignStroke = 0.0;
238 context.beginPath(); 232 context.beginPath();
239 pointX = 169.5; 233 pointX = 169.5;
240 pointY = 141.5; 234 pointY = 141.5;
241 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 235 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
242 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 236 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
243 context.moveTo(pointX, pointY); 237 context.moveTo(pointX, pointY);
244 pointX = 177.5; 238 pointX = 177.5;
245 pointY = 133.5; 239 pointY = 133.5;
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 1ab2e69..3d9d6d3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.AppController = function(args) { 26Clipperz.PM.UI.Web.Controllers.AppController = function(args) {
29 27
30 this._user = null; 28 this._user = null;
31 this._tabSlotNames = { 29 this._tabSlotNames = {
32 //tabName: slotName 30 //tabName: slotName
33 'cards': 'cardGrid', 31 'cards': 'cardGrid',
34 // 'directLogins':'directLoginGrid', 32 // 'directLogins':'directLoginGrid',
35 'account': 'accountPanel', 33 'account': 'accountPanel',
36 'data': 'dataPanel', 34 'data': 'dataPanel',
37 'tools': 'toolsPanel' 35 'tools': 'toolsPanel'
38 }; 36 };
39 37
40 //controllers 38 //controllers
41 this._cardsController= null; 39 this._cardsController= null;
42 //this._directLoginsController = null; 40 //this._directLoginsController = null;
43 this._filterController = null; //new Clipperz.PM.UI.Web.Controllers.FilterController(); 41 this._filterController = null; //new Clipperz.PM.UI.Web.Controllers.FilterController();
44 42
45 //components 43 //components
46 this._appPage = null; 44 this._appPage = null;
47 this._userInfoBox = null; 45 this._userInfoBox = null;
48 this._tabSidePanel = null; 46 this._tabSidePanel = null;
49 47
50 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard'); 48 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard');
51 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard',this, 'handleDeleteCard'); 49 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard',this, 'handleDeleteCard');
52 50
53 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved',this, 'userDataSuccessfullySavedHandler'); 51 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved',this, 'userDataSuccessfullySavedHandler');
54 52
55 return this; 53 return this;
56} 54}
57 55
58MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, { 56MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
59 57
60 'toString': function() { 58 'toString': function() {
61 return "Clipperz.PM.UI.Web.Controllers.AppController"; 59 return "Clipperz.PM.UI.Web.Controllers.AppController";
62 }, 60 },
63 61
64 //----------------------------------------------------------------------------- 62 //-----------------------------------------------------------------------------
65 63
66 'setUser': function(anUser) { 64 'setUser': function(anUser) {
67 this._user = anUser; 65 this._user = anUser;
68 }, 66 },
69 67
70 'user': function() { 68 'user': function() {
71 return this._user; 69 return this._user;
72 }, 70 },
73 71
74 //----------------------------------------------------------------------------- 72 //-----------------------------------------------------------------------------
75 /* 73 /*
76 'tabSlotNames': function() { 74 'tabSlotNames': function() {
77 return this._tabSlotNames; 75 return this._tabSlotNames;
78 }, 76 },
79*/ 77*/
80 'slotNameForTab': function(aTabName) { 78 'slotNameForTab': function(aTabName) {
81 return this._tabSlotNames[aTabName]; 79 return this._tabSlotNames[aTabName];
82 }, 80 },
83 81
84 'hideAllAppPageTabSlots': function() { 82 'hideAllAppPageTabSlots': function() {
85 var aTabName; 83 var aTabName;
86 84
87 for (aTabName in this._tabSlotNames) { 85 for (aTabName in this._tabSlotNames) {
88 this.appPage().hideSlot(this.slotNameForTab(aTabName)); 86 this.appPage().hideSlot(this.slotNameForTab(aTabName));
89 } 87 }
90 }, 88 },
91 89
92 //----------------------------------------------------------------------------- 90 //-----------------------------------------------------------------------------
93 91
94 'appPage': function() { 92 'appPage': function() {
95 if (this._appPage == null) { 93 if (this._appPage == null) {
96 this._appPage = new Clipperz.PM.UI.Web.Components.AppPage(); 94 this._appPage = new Clipperz.PM.UI.Web.Components.AppPage();
97 } 95 }
98 96
99 return this._appPage; 97 return this._appPage;
100 }, 98 },
101 99
102 //----------------------------------------------------------------------------- 100 //-----------------------------------------------------------------------------
103 101
104 'tabSidePanel': function() { 102 'tabSidePanel': function() {
105 if (this._tabSidePanel == null) { 103 if (this._tabSidePanel == null) {
106 this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel(); 104 this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel();
107 } 105 }
108 106
109 return this._tabSidePanel; 107 return this._tabSidePanel;
110 }, 108 },
111 109
112 //----------------------------------------------------------------------------- 110 //-----------------------------------------------------------------------------
113 111
114 'userInfoBox': function() { 112 'userInfoBox': function() {
115 if (this._userInfoBox == null) { 113 if (this._userInfoBox == null) {
116 this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox(); 114 this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox();
117 115
118 MochiKit.Signal.connect(this._userInfoBox, 'logout',this, 'handleLogout'); 116 MochiKit.Signal.connect(this._userInfoBox, 'logout',this, 'handleLogout');
@@ -231,121 +229,120 @@ MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
231 this.hideAllAppPageTabSlots(); 229 this.hideAllAppPageTabSlots();
232 this.appPage().showSlot(this.slotNameForTab('cards')); 230 this.appPage().showSlot(this.slotNameForTab('cards'));
233 231
234 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected', this, 'handleTabSelected'); 232 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected', this, 'handleTabSelected');
235 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard'); 233 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard');
236 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard'); 234 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard');
237 235
238 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy',this, 'handleDownloadOfflineCopy'); 236 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy',this, 'handleDownloadOfflineCopy');
239 237
240 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false}); 238 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false});
241 239
242 deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user}); 240 deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user});
243 // deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user}); 241 // deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user});
244 deferredResult.addMethod(this, 'populateUserInfo'); 242 deferredResult.addMethod(this, 'populateUserInfo');
245 243
246 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0}); 244 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0});
247 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN'); 245 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN');
248 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards'); 246 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards');
249 deferredResult.callback(); 247 deferredResult.callback();
250 }, 248 },
251 249
252 //----------------------------------------------------------------------------- 250 //-----------------------------------------------------------------------------
253 251
254 'handleTabSelected': function (selectedTabName) { 252 'handleTabSelected': function (selectedTabName) {
255 var aTabName; 253 var aTabName;
256 var aSlotName; 254 var aSlotName;
257 255
258//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName); 256//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName);
259 this.hideAllAppPageTabSlots(); 257 this.hideAllAppPageTabSlots();
260 this.appPage().showSlot(this.slotNameForTab(selectedTabName)); 258 this.appPage().showSlot(this.slotNameForTab(selectedTabName));
261 259
262 switch (selectedTabName) { 260 switch (selectedTabName) {
263 case 'cards': 261 case 'cards':
264 this.cardsController().focus(); 262 this.cardsController().focus();
265 break; 263 break;
266 // case 'directLogins': 264 // case 'directLogins':
267 // this.directLoginsController().focus(); 265 // this.directLoginsController().focus();
268 // break; 266 // break;
269 case 'data': 267 case 'data':
270 break; 268 break;
271 case 'account': 269 case 'account':
272 break; 270 break;
273 case 'tools': 271 case 'tools':
274 break; 272 break;
275 } 273 }
276//Clipperz.log("<-- AppController.handleTabSelected", aTabName); 274//Clipperz.log("<-- AppController.handleTabSelected", aTabName);
277 }, 275 },
278 276
279 //============================================================================= 277 //=============================================================================
280 278
281 'handleAddCard': function (aSourceElement) { 279 'handleAddCard': function (aSourceElement) {
282//Clipperz.log("=== AppController.addCard", aSourceElement); 280//Clipperz.log("=== AppController.addCard", aSourceElement);
283 this.cardsController().addCard(aSourceElement); 281 this.cardsController().addCard(aSourceElement);
284 }, 282 },
285 283
286 //============================================================================= 284 //=============================================================================
287 285
288 'userDataSuccessfullySavedHandler': function (anEvent) { 286 'userDataSuccessfullySavedHandler': function (anEvent) {
289 this.populateUserInfo(); 287 this.populateUserInfo();
290 }, 288 },
291 289
292 //============================================================================= 290 //=============================================================================
293 291
294 'handleLogout': function(anEvent) { 292 'handleLogout': function(anEvent) {
295 var deferredResult; 293 var deferredResult;
296 294
297 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false}); 295 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false});
298 deferredResult.addMethod(this.user(), 'logout'); 296 deferredResult.addMethod(this.user(), 'logout');
299 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout'); 297 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout');
300 deferredResult.callback(); 298 deferredResult.callback();
301 299
302 return deferredResult; 300 return deferredResult;
303 }, 301 },
304 302
305 //----------------------------------------------------------------------------- 303 //-----------------------------------------------------------------------------
306 304
307 'handleLock': function (anEvent) { 305 'handleLock': function (anEvent) {
308 return Clipperz.Async.callbacks("AppController.handleLock", [ 306 return Clipperz.Async.callbacks("AppController.handleLock", [
309 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'), 307 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'),
310 MochiKit.Base.method(this.user(), 'lock') 308 MochiKit.Base.method(this.user(), 'lock')
311 ], {trace:false}); 309 ], {trace:false});
312 }, 310 },
313 311
314 //............................................................................. 312 //.............................................................................
315 313
316 'handleUnlock': function (anEvent) { 314 'handleUnlock': function (anEvent) {
317 return Clipperz.Async.callbacks("AppController.handleUnock", [ 315 return Clipperz.Async.callbacks("AppController.handleUnock", [
318 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'), 316 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'),
319 MochiKit.Base.method(this.user(), 'login'), 317 MochiKit.Base.method(this.user(), 'login'),
320 MochiKit.Base.method(this.cardsController(), 'focus'), 318 MochiKit.Base.method(this.cardsController(), 'focus'),
321 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'), 319 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'),
322 MochiKit.Base.method(this.userInfoBox(), 'unlock') 320 MochiKit.Base.method(this.userInfoBox(), 'unlock')
323 ], {trace:false}); 321 ], {trace:false});
324 }, 322 },
325 323
326 'handleDownloadOfflineCopy': function (anEvent) { 324 'handleDownloadOfflineCopy': function (anEvent) {
327console.log("AppController.handleDownloadOfflineCopy");
328 var downloadHref; 325 var downloadHref;
329 326
330 downloadHref = window.location.href.replace(/\/[^\/]*$/,'') + Clipperz_dumpUrl; 327 downloadHref = window.location.href.replace(/\/[^\/]*$/,'') + Clipperz_dumpUrl;
331 328
332 if (Clipperz_IEisBroken == true) { 329 if (Clipperz_IEisBroken == true) {
333 window.open(downloadHref, ""); 330 window.open(downloadHref, "");
334 } else { 331 } else {
335 vardeferredResult; 332 vardeferredResult;
336 var newWindow; 333 var newWindow;
337 334
338 newWindow = window.open("", ""); 335 newWindow = window.open("", "");
339 336
340 deferredResult = new Clipperz.Async.Deferred("AppController.handleDownloadOfflineCopy", {trace:true}); 337 deferredResult = new Clipperz.Async.Deferred("AppController.handleDownloadOfflineCopy", {trace:true});
341 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'echo', {'echo':"echo"}); 338 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'echo', {'echo':"echo"});
342 deferredResult.addCallback(function(aWindow) { 339 deferredResult.addCallback(function(aWindow) {
343 aWindow.location.href = downloadHref; 340 aWindow.location.href = downloadHref;
344 }, newWindow); 341 }, newWindow);
345 deferredResult.callback(); 342 deferredResult.callback();
346 } 343 }
347 }, 344 },
348 345
349 //============================================================================= 346 //=============================================================================
350 __syntaxFix__: "syntax fix" 347 __syntaxFix__: "syntax fix"
351}); 348});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
index effde31..b1ff81f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) { 26Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args); 29 Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args);
32 30
33 this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter');
34 this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter');
35 33
36 this._referenceElement = null; 34 this._referenceElement = null;
37 this._cardDialogComponent = null; 35 this._cardDialogComponent = null;
38 36
39 this._fieldsReferences = {}; 37 this._fieldsReferences = {};
40 this._directLoginReferences = {}; 38 this._directLoginReferences = {};
41 39
42 this._directLoginWizardController = null; 40 this._directLoginWizardController = null;
43 this._directLoginEditingComponent = null; 41 this._directLoginEditingComponent = null;
44 this._isDirectLoginEditingComponentVisible = false; 42 this._isDirectLoginEditingComponentVisible = false;
45 43
46 return this; 44 return this;
47}; 45};
48 46
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, { 47Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, {
50 48
51 'toString': function() { 49 'toString': function() {
52 return "Clipperz.PM.UI.Web.Controllers.CardDialogController"; 50 return "Clipperz.PM.UI.Web.Controllers.CardDialogController";
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'record': function () { 55 'record': function () {
58 return this._record; 56 return this._record;
59 }, 57 },
60 58
61 'delegate': function () { 59 'delegate': function () {
62 return this._delegate; 60 return this._delegate;
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'fieldsReferences': function () { 65 'fieldsReferences': function () {
68 return this._fieldsReferences; 66 return this._fieldsReferences;
69 }, 67 },
70 68
71 'directLoginReferences': function () { 69 'directLoginReferences': function () {
72 return this._directLoginReferences; 70 return this._directLoginReferences;
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'referenceElement': function () { 75 'referenceElement': function () {
78 return this._referenceElement; 76 return this._referenceElement;
79 }, 77 },
80 78
81 'setReferenceElement': function (anElement) { 79 'setReferenceElement': function (anElement) {
82 this._referenceElement = anElement; 80 this._referenceElement = anElement;
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'cardDialogComponent': function () { 85 'cardDialogComponent': function () {
88 if (this._cardDialogComponent == null) { 86 if (this._cardDialogComponent == null) {
89 this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent(); 87 this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent();
90 88
91 MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel'); 89 MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel');
92 MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave'); 90 MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave');
93 91
94 MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField'); 92 MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField');
95 MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue',this, 'handleChangedValue'); 93 MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue',this, 'handleChangedValue');
96 94
97 MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin'); 95 MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin');
98 MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed',this, 'handleCardDialogComponentKeyPressed'); 96 MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed',this, 'handleCardDialogComponentKeyPressed');
99 } 97 }
100 98
101 return this._cardDialogComponent; 99 return this._cardDialogComponent;
102 }, 100 },
103 101
104 //========================================================================= 102 //=========================================================================
105 103
106 'directLoginWizardController': function () { 104 'directLoginWizardController': function () {
107 if (this._directLoginWizardController == null) { 105 if (this._directLoginWizardController == null) {
108 this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({ 106 this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({
109 'cardLabel': this.cardDialogComponent().title(), 107 'cardLabel': this.cardDialogComponent().title(),
110 'directLoginEditingComponent': this.directLoginEditingComponent() 108 'directLoginEditingComponent': this.directLoginEditingComponent()
111 }) 109 })
112 110
113 MochiKit.Signal.connect(this._directLoginWizardController, 'exit',this, 'handleHideDirectLoginEditingComponent'); 111 MochiKit.Signal.connect(this._directLoginWizardController, 'exit',this, 'handleHideDirectLoginEditingComponent');
114 MochiKit.Signal.connect(this._directLoginWizardController, 'done',this, 'handleCompleteDirectLoginEditingComponent'); 112 MochiKit.Signal.connect(this._directLoginWizardController, 'done',this, 'handleCompleteDirectLoginEditingComponent');
115 } 113 }
116 114
117 return this._directLoginWizardController; 115 return this._directLoginWizardController;
118 }, 116 },
@@ -281,193 +279,192 @@ Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object
281 279
282 MochiKit.Base.method(this, 'fieldsReferences'), 280 MochiKit.Base.method(this, 'fieldsReferences'),
283 MochiKit.Base.values, 281 MochiKit.Base.values,
284 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')), 282 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')),
285 283
286 MochiKit.Base.method(this, 'directLoginReferences'), 284 MochiKit.Base.method(this, 'directLoginReferences'),
287 MochiKit.Base.values, 285 MochiKit.Base.values,
288 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')), 286 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')),
289 287
290 MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'), 288 MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'),
291 MochiKit.Base.method(this.record(), 'directLoginWithReference'), 289 MochiKit.Base.method(this.record(), 'directLoginWithReference'),
292 MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'), 290 MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'),
293 291
294 MochiKit.Base.noop 292 MochiKit.Base.noop
295 ], {trace:false}); 293 ], {trace:false});
296 }, 294 },
297 295
298 //------------------------------------------------------------------------- 296 //-------------------------------------------------------------------------
299 297
300 'updateRecordFieldValues': function (aFieldReference) { 298 'updateRecordFieldValues': function (aFieldReference) {
301 var deferredResult; 299 var deferredResult;
302 300
303 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [ 301 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [
304 MochiKit.Base.method(aFieldReference['component'],'label'), 302 MochiKit.Base.method(aFieldReference['component'],'label'),
305 MochiKit.Base.method(aFieldReference['field'], 'setLabel'), 303 MochiKit.Base.method(aFieldReference['field'], 'setLabel'),
306 304
307 MochiKit.Base.method(aFieldReference['component'],'value'), 305 MochiKit.Base.method(aFieldReference['component'],'value'),
308 MochiKit.Base.method(aFieldReference['field'], 'setValue'), 306 MochiKit.Base.method(aFieldReference['field'], 'setValue'),
309 307
310 MochiKit.Base.method(aFieldReference['component'],'isHidden'), 308 MochiKit.Base.method(aFieldReference['component'],'isHidden'),
311 MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'), 309 MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'),
312 310
313 MochiKit.Base.method(aFieldReference['field'], 'actionType'), 311 MochiKit.Base.method(aFieldReference['field'], 'actionType'),
314 MochiKit.Base.method(aFieldReference['component'],'setActionType') 312 MochiKit.Base.method(aFieldReference['component'],'setActionType')
315 ], {trace:false}); 313 ], {trace:false});
316 314
317 return deferredResult; 315 return deferredResult;
318 }, 316 },
319 317
320 //------------------------------------------------------------------------- 318 //-------------------------------------------------------------------------
321 319
322 'updateRecordDirectLoginValues': function (aDirectLoginReference) { 320 'updateRecordDirectLoginValues': function (aDirectLoginReference) {
323 var deferredResult; 321 var deferredResult;
324 322
325 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [ 323 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [
326 MochiKit.Base.method(aDirectLoginReference['component'], 'label'), 324 MochiKit.Base.method(aDirectLoginReference['component'], 'label'),
327 MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel') 325 MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel')
328 ], {trace:false}); 326 ], {trace:false});
329 327
330 return deferredResult; 328 return deferredResult;
331 }, 329 },
332 330
333 //------------------------------------------------------------------------- 331 //-------------------------------------------------------------------------
334 332
335 'updateRecordDirectLoginDetails': function (aDirectLogin) { 333 'updateRecordDirectLoginDetails': function (aDirectLogin) {
336 var result; 334 var result;
337 335
338 if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) { 336 if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) {
339 result = MochiKit.Async.succeed(); 337 result = MochiKit.Async.succeed();
340 } else { 338 } else {
341 result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [ 339 result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [
342 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'), 340 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
343 MochiKit.Base.method(aDirectLogin, 'setLabel'), 341 MochiKit.Base.method(aDirectLogin, 'setLabel'),
344 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'), 342 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
345 MochiKit.Base.method(aDirectLogin, 'setFavicon') 343 MochiKit.Base.method(aDirectLogin, 'setFavicon')
346 ], {trace:false}); 344 ], {trace:false});
347 } 345 }
348 346
349 return result; 347 return result;
350 }, 348 },
351 349
352 //========================================================================= 350 //=========================================================================
353 351
354 'addField': function () { 352 'addField': function () {
355 return this.record().addField({ 353 return this.record().addField({
356 'label':this.cardDialogComponent().newFieldLabel(), 354 'label':this.cardDialogComponent().newFieldLabel(),
357 'value':this.cardDialogComponent().newFieldValue(), 355 'value':this.cardDialogComponent().newFieldValue(),
358 'isHidden':this.cardDialogComponent().newFieldIsHidden() 356 'isHidden':this.cardDialogComponent().newFieldIsHidden()
359 }); 357 });
360 }, 358 },
361 359
362 'handleAddField': function () { 360 'handleAddField': function () {
363 return Clipperz.Async.callbacks("CardDialogController.handleAddField", [ 361 return Clipperz.Async.callbacks("CardDialogController.handleAddField", [
364 MochiKit.Base.method(this, 'addField'), 362 MochiKit.Base.method(this, 'addField'),
365 363
366 MochiKit.Base.method(this, 'addCardDialogComponentWithField'), 364 MochiKit.Base.method(this, 'addCardDialogComponentWithField'),
367 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'), 365 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
368 366
369 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'), 367 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
370 MochiKit.Base.method(this, 'handleChangedValue') 368 MochiKit.Base.method(this, 'handleChangedValue')
371 ], {trace:false}) 369 ], {trace:false})
372 }, 370 },
373 371
374 //------------------------------------------------------------------------- 372 //-------------------------------------------------------------------------
375 373
376 'handlePerformFieldAction': function (aFieldID, aTargetElement) { 374 'handlePerformFieldAction': function (aFieldID, aTargetElement) {
377//console.log("### targetElement", aTargetElement);
378 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [ 375 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
379 MochiKit.Base.method(this.record(), 'fields'), 376 MochiKit.Base.method(this.record(), 'fields'),
380 MochiKit.Base.itemgetter(aFieldID), 377 MochiKit.Base.itemgetter(aFieldID),
381 Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", { 378 Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", {
382 'value':MochiKit.Base.methodcaller('value'), 379 'value':MochiKit.Base.methodcaller('value'),
383 'type': MochiKit.Base.methodcaller('actionType') 380 'type': MochiKit.Base.methodcaller('actionType')
384 }, {trace:false}), 381 }, {trace:false}),
385 MochiKit.Base.bind(function (someValues) { 382 MochiKit.Base.bind(function (someValues) {
386 switch (someValues['type']) { 383 switch (someValues['type']) {
387 case 'NONE': 384 case 'NONE':
388 throw "this event handler should not be triggered for fields with type 'NONE'"; 385 throw "this event handler should not be triggered for fields with type 'NONE'";
389 break; 386 break;
390 case 'URL': 387 case 'URL':
391 var url; 388 var url;
392 389
393 url = someValues['value']; 390 url = someValues['value'];
394 if (/^https?\:\/\//.test(url) == false) { 391 if (/^https?\:\/\//.test(url) == false) {
395 url = 'http://' + url; 392 url = 'http://' + url;
396 } 393 }
397 394
398 window.open(url); 395 window.open(url);
399 break; 396 break;
400 case 'EMAIL': 397 case 'EMAIL':
401 var url; 398 var url;
402 399
403 url = 'mailto:' + someValues['value']; 400 url = 'mailto:' + someValues['value'];
404 401
405 MochiKit.DOM.currentWindow().location = url; 402 MochiKit.DOM.currentWindow().location = url;
406 break; 403 break;
407 case 'PASSWORD': 404 case 'PASSWORD':
408//Clipperz.log("SHOW PASSWORD " + someValues['value']); 405//Clipperz.log("SHOW PASSWORD " + someValues['value']);
409 this.showPasswordTooltip(someValues['value'], aTargetElement); 406 this.showPasswordTooltip(someValues['value'], aTargetElement);
410 break; 407 break;
411 } 408 }
412 }, this) 409 }, this)
413 ], {trace:false}); 410 ], {trace:false});
414 }, 411 },
415 412
416 //------------------------------------------------------------------------- 413 //-------------------------------------------------------------------------
417 414
418 'handleDeleteField': function (aFieldID) { 415 'handleDeleteField': function (aFieldID) {
419 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [ 416 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
420 MochiKit.Base.method(this.record(), 'fields'), 417 MochiKit.Base.method(this.record(), 'fields'),
421 MochiKit.Base.itemgetter(aFieldID), 418 MochiKit.Base.itemgetter(aFieldID),
422 MochiKit.Base.method(this.record(), 'removeField'), 419 MochiKit.Base.method(this.record(), 'removeField'),
423 420
424 MochiKit.Base.method(this, 'fieldsReferences'), 421 MochiKit.Base.method(this, 'fieldsReferences'),
425 MochiKit.Base.itemgetter(aFieldID), 422 MochiKit.Base.itemgetter(aFieldID),
426 MochiKit.Base.itemgetter('component'), 423 MochiKit.Base.itemgetter('component'),
427 424
428 function (aComponent) { 425 function (aComponent) {
429 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField [fade and remove]", [ 426 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField [fade and remove]", [
430 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}), 427 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
431 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}), 428 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
432 MochiKit.Base.method(aComponent, 'remove') 429 MochiKit.Base.method(aComponent, 'remove')
433 ], {trace:false}); 430 ], {trace:false});
434 }, 431 },
435 432
436 MochiKit.Base.bind(function () { 433 MochiKit.Base.bind(function () {
437 delete this.fieldsReferences()[aFieldID]; 434 delete this.fieldsReferences()[aFieldID];
438 }, this), 435 }, this),
439 436
440 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'), 437 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
441 MochiKit.Base.method(this, 'handleChangedValue') 438 MochiKit.Base.method(this, 'handleChangedValue')
442 ], {trace:false}); 439 ], {trace:false});
443 }, 440 },
444 441
445 //========================================================================= 442 //=========================================================================
446 443
447 'handleDeleteDirectLogin': function(aDirectLoginReference) { 444 'handleDeleteDirectLogin': function(aDirectLoginReference) {
448 var cardDialogComponent; 445 var cardDialogComponent;
449 446
450 cardDialogComponent = this.cardDialogComponent(); 447 cardDialogComponent = this.cardDialogComponent();
451 448
452 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin", [ 449 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin", [
453 MochiKit.Base.method(this.record(), 'directLogins'), 450 MochiKit.Base.method(this.record(), 'directLogins'),
454 MochiKit.Base.itemgetter(aDirectLoginReference), 451 MochiKit.Base.itemgetter(aDirectLoginReference),
455 MochiKit.Base.methodcaller('remove'), 452 MochiKit.Base.methodcaller('remove'),
456 453
457 MochiKit.Base.method(this, 'directLoginReferences'), 454 MochiKit.Base.method(this, 'directLoginReferences'),
458 MochiKit.Base.itemgetter(aDirectLoginReference), 455 MochiKit.Base.itemgetter(aDirectLoginReference),
459 MochiKit.Base.itemgetter('component'), 456 MochiKit.Base.itemgetter('component'),
460 457
461 function (aComponent) { 458 function (aComponent) {
462 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin [fade and remove]", [ 459 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin [fade and remove]", [
463 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}), 460 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
464 /// MochiKit.Base.method(aComponent, 'remove') 461 /// MochiKit.Base.method(aComponent, 'remove')
465 MochiKit.Base.method(cardDialogComponent, 'removeDirectLoginComponent', aComponent) 462 MochiKit.Base.method(cardDialogComponent, 'removeDirectLoginComponent', aComponent)
466 ], {trace:false}); 463 ], {trace:false});
467 }, 464 },
468 465
469 MochiKit.Base.bind(function () { 466 MochiKit.Base.bind(function () {
470 delete this.directLoginReferences()[aDirectLoginReference]; 467 delete this.directLoginReferences()[aDirectLoginReference];
471 }, this), 468 }, this),
472 469
473 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'), 470 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
index f58f0b8..68b5b9f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.CardsController = function() { 26Clipperz.PM.UI.Web.Controllers.CardsController = function() {
29 Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments); 27 Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments);
30 28
31 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard'); 29 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard');
32 30
33 return this; 31 return this;
34} 32}
35 33
36Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, { 34Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, {
37 35
38 'toString': function() { 36 'toString': function() {
39 return "Clipperz.PM.UI.Web.Controllers.CardsController"; 37 return "Clipperz.PM.UI.Web.Controllers.CardsController";
40 }, 38 },
41 39
42 'createGrid': function () { 40 'createGrid': function () {
43 var grid; 41 var grid;
44 42
45 grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [ 43 grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
46 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({ 44 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
47 'name': 'Cards.favicon', 45 'name': 'Cards.favicon',
48 'selector': MochiKit.Base.methodcaller('favicon'), 46 'selector': MochiKit.Base.methodcaller('favicon'),
49 'cssClass': 'favicon' 47 'cssClass': 'favicon'
50 }), 48 }),
51 new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 49 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
52 'name': 'Cards.title', 50 'name': 'Cards.title',
53 'selector': MochiKit.Base.methodcaller('label'), 51 'selector': MochiKit.Base.methodcaller('label'),
54 'label': 'title', 52 'label': 'title',
55 'cssClass': 'title', 53 'cssClass': 'title',
56 'comparator': Clipperz.Base.caseInsensitiveCompare, 54 'comparator': Clipperz.Base.caseInsensitiveCompare,
57 'sortable': true, 55 'sortable': true,
58 'sorted': 'ASCENDING', 56 'sorted': 'ASCENDING',
59 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})} 57 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})}
60 'actionMethod': MochiKit.Base.method(this, 'handleShowCard') 58 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
61 }), 59 }),
62 new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({ 60 new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({
63 'name': 'Cards.directLogins', 61 'name': 'Cards.directLogins',
64 'selector': MochiKit.Base.methodcaller('directLoginReferences'), 62 'selector': MochiKit.Base.methodcaller('directLoginReferences'),
65 'label': 'direct logins', 63 'label': 'direct logins',
66 'cssClass': 'directLogin' 64 'cssClass': 'directLogin'
67 }), 65 }),
68 new Clipperz.PM.UI.Web.Components.DateColumnManager({ 66 new Clipperz.PM.UI.Web.Components.DateColumnManager({
69 'name': 'Cards.latestUpdate', 67 'name': 'Cards.latestUpdate',
70 'selector': MochiKit.Base.methodcaller('updateDate'), 68 'selector': MochiKit.Base.methodcaller('updateDate'),
71 'label': 'latest update', 69 'label': 'latest update',
72 'cssClass': 'latestUpdate', 70 'cssClass': 'latestUpdate',
73 'format': 'd-m-Y', 71 'format': 'd-m-Y',
74 'comparator': MochiKit.Base.compare, 72 'comparator': MochiKit.Base.compare,
75 'sortable': true, 73 'sortable': true,
76 'sorted': 'UNSORTED' 74 'sorted': 'UNSORTED'
77 }), 75 }),
78 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({ 76 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
79 'name': 'Cards.delete', 77 'name': 'Cards.delete',
80 'selector': MochiKit.Base.noop, 78 'selector': MochiKit.Base.noop,
81 'cssClass': 'delete', 79 'cssClass': 'delete',
82 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})} 80 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})}
83 'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard') 81 'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard')
84 }) 82 })
85 ]}); 83 ]});
86 84
87 grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot'); 85 grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot');
88 86
89 return grid; 87 return grid;
90 }, 88 },
91 89
92 //----------------------------------------------------------------------------- 90 //-----------------------------------------------------------------------------
93 91
94 'getRows': function () { 92 'getRows': function () {
95 //TODO relying on user() in GridController, bad code smell :| 93 //TODO relying on user() in GridController, bad code smell :|
96 return this.user().getRecords(); 94 return this.user().getRecords();
97 }, 95 },
98 96
99 //============================================================================= 97 //=============================================================================
100 98
101 'displayEmptyContent': function () { 99 'displayEmptyContent': function () {
102 varemptyGridComponent; 100 varemptyGridComponent;
103 101
104 emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent(); 102 emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent();
105 103
106 return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [ 104 return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [
107 MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent), 105 MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent),
108 MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this) 106 MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this)
109 ], {trace:false}); 107 ], {trace:false});
110 }, 108 },
111 109
112 'displaySelectedRows': function (aFilter) { 110 'displaySelectedRows': function (aFilter) {
113 this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup(); 111 this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup();
114 112
115 return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments); 113 return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments);
116 }, 114 },
117 115
118 //============================================================================= 116 //=============================================================================
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
index c025a51..92ed6e3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
@@ -1,262 +1,259 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) { 26Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) {
29 this._directLoginEditingComponent = args.directLoginEditingComponent|| Clipperz.Base.exception.raise('MandatoryParameter'); 27 this._directLoginEditingComponent = args.directLoginEditingComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
30 this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter'); 28 this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter');
31 29
32 MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue'); 30 MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue');
33 MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward',this, 'handleMoveForward'); 31 MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward',this, 'handleMoveForward');
34 MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed'); 32 MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed');
35 33
36 this._directLogin = null; 34 this._directLogin = null;
37 this._directLoginHasJustBeenAdded = false; 35 this._directLoginHasJustBeenAdded = false;
38 36
39 this._rulerComponent = null; 37 this._rulerComponent = null;
40 38
41 this._steps = null; 39 this._steps = null;
42 this._currentStepIndex = 0; 40 this._currentStepIndex = 0;
43 this._isNextEnabled = false; 41 this._isNextEnabled = false;
44 42
45 this._recordFields = null; 43 this._recordFields = null;
46 this._originalBindings = null; 44 this._originalBindings = null;
47 45
48 this._bindingComponents = []; 46 this._bindingComponents = [];
49 this._formValueComponents = []; 47 this._formValueComponents = [];
50 48
51 return this; 49 return this;
52} 50}
53 51
54MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, { 52MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, {
55 53
56 'toString': function() { 54 'toString': function() {
57 return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController"; 55 return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController";
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'directLogin': function () { 60 'directLogin': function () {
63 return this._directLogin; 61 return this._directLogin;
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'directLoginHasJustBeenAdded': function () { 66 'directLoginHasJustBeenAdded': function () {
69 return this._directLoginHasJustBeenAdded; 67 return this._directLoginHasJustBeenAdded;
70 }, 68 },
71 69
72 'setDirectLoginHasJustBeenAdded': function (aValue) { 70 'setDirectLoginHasJustBeenAdded': function (aValue) {
73 this._directLoginHasJustBeenAdded = aValue; 71 this._directLoginHasJustBeenAdded = aValue;
74 }, 72 },
75 73
76 //------------------------------------------------------------------------- 74 //-------------------------------------------------------------------------
77 75
78 'directLoginEditingComponent': function () { 76 'directLoginEditingComponent': function () {
79 return this._directLoginEditingComponent; 77 return this._directLoginEditingComponent;
80 }, 78 },
81 79
82 //============================================================================= 80 //=============================================================================
83 81
84 'cardLabel': function () { 82 'cardLabel': function () {
85 return this._cardLabel; 83 return this._cardLabel;
86 }, 84 },
87 85
88 //============================================================================= 86 //=============================================================================
89 87
90 'resetCurrentStepIndex': function () { 88 'resetCurrentStepIndex': function () {
91 this._currentStepIndex = 0; 89 this._currentStepIndex = 0;
92 this.rulerComponent().resetStatus(); 90 this.rulerComponent().resetStatus();
93 }, 91 },
94 92
95 //----------------------------------------------------------------------------- 93 //-----------------------------------------------------------------------------
96 94
97 'enableNext': function (aValue) { 95 'enableNext': function (aValue) {
98 this.rulerComponent().enableNext(aValue); 96 this.rulerComponent().enableNext(aValue);
99 this._isNextEnabled = aValue; 97 this._isNextEnabled = aValue;
100 }, 98 },
101 99
102 'isNextEnabled': function () { 100 'isNextEnabled': function () {
103 return this._isNextEnabled; 101 return this._isNextEnabled;
104 }, 102 },
105 103
106 //----------------------------------------------------------------------------- 104 //-----------------------------------------------------------------------------
107 105
108 'enablePrevious': function (aValue) { 106 'enablePrevious': function (aValue) {
109 this.rulerComponent().enablePrevious(aValue); 107 this.rulerComponent().enablePrevious(aValue);
110 }, 108 },
111 109
112 //============================================================================= 110 //=============================================================================
113 111
114 'bindingComponents': function () { 112 'bindingComponents': function () {
115 return this._bindingComponents; 113 return this._bindingComponents;
116 }, 114 },
117 115
118 'resetBindingComponents': function () { 116 'resetBindingComponents': function () {
119 this.directLoginEditingComponent().clearAllBindingsComponents(); 117 this.directLoginEditingComponent().clearAllBindingsComponents();
120 this._bindingComponents = []; 118 this._bindingComponents = [];
121 }, 119 },
122 120
123 //============================================================================= 121 //=============================================================================
124 122
125 'formValueComponents': function () { 123 'formValueComponents': function () {
126 return this._formValueComponents; 124 return this._formValueComponents;
127 }, 125 },
128 126
129 'resetFormValueComponents': function () { 127 'resetFormValueComponents': function () {
130 this.directLoginEditingComponent().clearAllFormValueComponents(); 128 this.directLoginEditingComponent().clearAllFormValueComponents();
131 this._formValueComponents = []; 129 this._formValueComponents = [];
132 }, 130 },
133 131
134 //============================================================================= 132 //=============================================================================
135 133
136 'recordFields': function () { 134 'recordFields': function () {
137 return this._recordFields; 135 return this._recordFields;
138 }, 136 },
139 137
140 'setRecordFields': function (aValue) { 138 'setRecordFields': function (aValue) {
141 this._recordFields = aValue; 139 this._recordFields = aValue;
142 }, 140 },
143 141
144 'recordFieldWithReference': function (aReference) { 142 'recordFieldWithReference': function (aReference) {
145 var matchingValues; 143 var matchingValues;
146 var result; 144 var result;
147 145
148 matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields()); 146 matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields());
149 147
150 if (matchingValues.length == 0) { 148 if (matchingValues.length == 0) {
151 result = null; 149 result = null;
152 } else { 150 } else {
153 result = matchingValues[0]; 151 result = matchingValues[0];
154 } 152 }
155 153
156 return result; 154 return result;
157 }, 155 },
158 156
159 //----------------------------------------------------------------------------- 157 //-----------------------------------------------------------------------------
160 158
161 'originalBindings': function () { 159 'originalBindings': function () {
162 return this._originalBindings; 160 return this._originalBindings;
163 }, 161 },
164 162
165 'setOriginalBindings': function (aValue) { 163 'setOriginalBindings': function (aValue) {
166//console.log("BINDINGS", aValue);
167 this._originalBindings = aValue; 164 this._originalBindings = aValue;
168 }, 165 },
169 166
170 //============================================================================= 167 //=============================================================================
171 168
172 'rulerComponent': function () { 169 'rulerComponent': function () {
173 if (this._rulerComponent == null) { 170 if (this._rulerComponent == null) {
174 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({ 171 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
175 translationContext:'Wizards.DirectLoginWizard' 172 translationContext:'Wizards.DirectLoginWizard'
176 }); 173 });
177 this._rulerComponent.render(); 174 this._rulerComponent.render();
178 175
179 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit'); 176 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
180 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done'); 177 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
181 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward'); 178 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
182 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward'); 179 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
183 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved'); 180 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
184 } 181 }
185 182
186 return this._rulerComponent; 183 return this._rulerComponent;
187 }, 184 },
188 185
189 //----------------------------------------------------------------------------- 186 //-----------------------------------------------------------------------------
190 187
191 'showRuler': function (someSteps) { 188 'showRuler': function (someSteps) {
192 var rulerElement; 189 var rulerElement;
193 190
194 this.setSteps(someSteps); 191 this.setSteps(someSteps);
195 192
196 rulerElement = this.rulerComponent().element(); 193 rulerElement = this.rulerComponent().element();
197 this.directLoginEditingComponent().disableAllPanels(); 194 this.directLoginEditingComponent().disableAllPanels();
198 195
199 MochiKit.Style.showElement(rulerElement); 196 MochiKit.Style.showElement(rulerElement);
200 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()}); 197 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()});
201 new MochiKit.Visual.Move(rulerElement, { 198 new MochiKit.Visual.Move(rulerElement, {
202 x:0, y:this.directLoginEditingComponent().bottomMargin(), 199 x:0, y:this.directLoginEditingComponent().bottomMargin(),
203 mode:'absolute', 200 mode:'absolute',
204 duration:1, 201 duration:1,
205 afterFinish:MochiKit.Base.method(this, 'handleCursorMoved') 202 afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
206 }); 203 });
207 }, 204 },
208 205
209 'fixRulerRendering': function (aValue) { 206 'fixRulerRendering': function (aValue) {
210 this.rulerComponent().setDisplayMode(aValue); 207 this.rulerComponent().setDisplayMode(aValue);
211 }, 208 },
212 209
213 //----------------------------------------------------------------------------- 210 //-----------------------------------------------------------------------------
214 211
215 'hideRuler': function () { 212 'hideRuler': function () {
216 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1}); 213 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1});
217 }, 214 },
218 215
219 'doneWithRuler': function () { 216 'doneWithRuler': function () {
220 var rulerComponentElement; 217 var rulerComponentElement;
221 218
222 rulerComponentElement = this.rulerComponent().element(); 219 rulerComponentElement = this.rulerComponent().element();
223 new MochiKit.Visual.Move(this.rulerComponent().element(), { 220 new MochiKit.Visual.Move(this.rulerComponent().element(), {
224 x:1000, 221 x:1000,
225 mode:'relative', 222 mode:'relative',
226 duration:1, 223 duration:1,
227 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement) 224 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
228 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); } 225 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
229 }); 226 });
230 }, 227 },
231 228
232 //============================================================================= 229 //=============================================================================
233 230
234 'addNewDirectLoginRulerSteps': function () { 231 'addNewDirectLoginRulerSteps': function () {
235 return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps()); 232 return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps());
236 233
237 }, 234 },
238 235
239 'editDirectLoginRulerSteps': function () { 236 'editDirectLoginRulerSteps': function () {
240 return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE']; 237 return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE'];
241 }, 238 },
242 239
243 //------------------------------------------------------------------------- 240 //-------------------------------------------------------------------------
244 241
245 'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) { 242 'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) {
246 this._directLogin = aDirectLogin; 243 this._directLogin = aDirectLogin;
247 this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded); 244 this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded);
248 245
249 return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [ 246 return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [
250 MochiKit.Base.method(aDirectLogin, 'label'), 247 MochiKit.Base.method(aDirectLogin, 'label'),
251 MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'), 248 MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'),
252 249
253 MochiKit.Base.method(aDirectLogin, 'favicon'), 250 MochiKit.Base.method(aDirectLogin, 'favicon'),
254 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'), 251 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
255 252
256 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), 253 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
257 MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'), 254 MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'),
258 255
259 MochiKit.Base.method(aDirectLogin, 'bindings'), 256 MochiKit.Base.method(aDirectLogin, 'bindings'),
260 MochiKit.Base.method(this, 'setOriginalBindings'), 257 MochiKit.Base.method(this, 'setOriginalBindings'),
261 258
262 MochiKit.Base.method(aDirectLogin, 'record'), 259 MochiKit.Base.method(aDirectLogin, 'record'),
@@ -314,194 +311,192 @@ MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.
314 if (enableNext == true) { 311 if (enableNext == true) {
315 try { 312 try {
316 Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration()); 313 Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration());
317 this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError(); 314 this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError();
318 } catch (e) { 315 } catch (e) {
319 this.directLoginEditingComponent().highlightConfigurationSyntaxError(); 316 this.directLoginEditingComponent().highlightConfigurationSyntaxError();
320 enableNext = false; 317 enableNext = false;
321 } 318 }
322 } 319 }
323 break; 320 break;
324 case 'BINDINGS': 321 case 'BINDINGS':
325 enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; }) 322 enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; })
326 this.directLoginEditingComponent().enableBindingFields(); 323 this.directLoginEditingComponent().enableBindingFields();
327 break; 324 break;
328 case 'FAVICON': 325 case 'FAVICON':
329 enableNext = true; 326 enableNext = true;
330 this.directLoginEditingComponent().enableFaviconField(); 327 this.directLoginEditingComponent().enableFaviconField();
331 break; 328 break;
332 case 'DONE': 329 case 'DONE':
333 enableNext = true; 330 enableNext = true;
334 this.directLoginEditingComponent().enableDonePanel(); 331 this.directLoginEditingComponent().enableDonePanel();
335 break; 332 break;
336 } 333 }
337 334
338 if (this.currentStepIndex() > 0) { 335 if (this.currentStepIndex() > 0) {
339 this.enablePrevious(enablePrevious); 336 this.enablePrevious(enablePrevious);
340 } else { 337 } else {
341 this.enablePrevious(false); 338 this.enablePrevious(false);
342 } 339 }
343 this.enableNext(enableNext); 340 this.enableNext(enableNext);
344 }, 341 },
345 342
346 //----------------------------------------------------------------------------- 343 //-----------------------------------------------------------------------------
347 344
348 'setFocus': function () { 345 'setFocus': function () {
349 switch(this.currentStep()) { 346 switch(this.currentStep()) {
350 case 'LABEL': 347 case 'LABEL':
351 this.directLoginEditingComponent().focusOnLabelElement(); 348 this.directLoginEditingComponent().focusOnLabelElement();
352 break; 349 break;
353 case 'TYPE': 350 case 'TYPE':
354 break; 351 break;
355 case 'CONFIGURATION': 352 case 'CONFIGURATION':
356 this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement(); 353 this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement();
357 break; 354 break;
358 case 'BINDINGS': 355 case 'BINDINGS':
359 // this.directLoginEditingComponent().getElement('???').focus(); 356 // this.directLoginEditingComponent().getElement('???').focus();
360 break; 357 break;
361 case 'FAVICON': 358 case 'FAVICON':
362 this.directLoginEditingComponent().focusOnFaviconElement(); 359 this.directLoginEditingComponent().focusOnFaviconElement();
363 break; 360 break;
364 case 'DONE': 361 case 'DONE':
365 break; 362 break;
366 } 363 }
367 }, 364 },
368 365
369 //============================================================================= 366 //=============================================================================
370 367
371 'steps': function () { 368 'steps': function () {
372 return this._steps; 369 return this._steps;
373 }, 370 },
374 371
375 'setSteps': function (aValue) { 372 'setSteps': function (aValue) {
376 this._steps = aValue; 373 this._steps = aValue;
377 374
378 this.rulerComponent().setSteps(aValue); 375 this.rulerComponent().setSteps(aValue);
379 this.resetCurrentStepIndex(); 376 this.resetCurrentStepIndex();
380 }, 377 },
381 378
382 'currentStepIndex': function () { 379 'currentStepIndex': function () {
383 return this._currentStepIndex; 380 return this._currentStepIndex;
384 }, 381 },
385 382
386 'currentStep': function () { 383 'currentStep': function () {
387 return this.steps()[this.currentStepIndex()]; 384 return this.steps()[this.currentStepIndex()];
388 }, 385 },
389 386
390 //============================================================================= 387 //=============================================================================
391 388
392 'handleExit': function () { 389 'handleExit': function () {
393 MochiKit.Signal.signal(this, 'exit'); 390 MochiKit.Signal.signal(this, 'exit');
394 }, 391 },
395 392
396 'done': function () { 393 'done': function () {
397 this.doneWithRuler(); 394 this.doneWithRuler();
398 395
399 Clipperz.Async.callbacks("DirectLoginWizardController.done", [ 396 Clipperz.Async.callbacks("DirectLoginWizardController.done", [
400 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'), 397 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
401 MochiKit.Base.method(this.directLogin(), 'setLabel'), 398 MochiKit.Base.method(this.directLogin(), 'setLabel'),
402 399
403 MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'), 400 MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'),
404 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'), 401 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'),
405 402
406 //Bindings 403 //Bindings
407 MochiKit.Base.method(this.directLoginEditingComponent(), 'bindingComponents'), 404 MochiKit.Base.method(this.directLoginEditingComponent(), 'bindingComponents'),
408 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.bind(function (aBindingComponent) { 405 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.bind(function (aBindingComponent) {
409 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBindingComponent) { 406 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBindingComponent) {
410//console.log("aBindingComponent", aBindingComponent);
411 // this.directLogin().
412 return Clipperz.Async.callbacks("DirectLoginWizardController.done - update directLogin bindings", [ 407 return Clipperz.Async.callbacks("DirectLoginWizardController.done - update directLogin bindings", [
413 MochiKit.Base.method(this.directLogin(), 'bindings'), 408 MochiKit.Base.method(this.directLogin(), 'bindings'),
414 MochiKit.Base.itemgetter(aBindingComponent.formFieldName()), 409 MochiKit.Base.itemgetter(aBindingComponent.formFieldName()),
415 MochiKit.Base.methodcaller('setFieldKey', aBindingComponent.selectedValue()) 410 MochiKit.Base.methodcaller('setFieldKey', aBindingComponent.selectedValue())
416 ], {trace:false}); 411 ], {trace:false});
417 }, this)), 412 }, this)),
418 413
419 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'), 414 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
420 MochiKit.Base.method(this.directLogin(), 'setFavicon'), 415 MochiKit.Base.method(this.directLogin(), 'setFavicon'),
421 416
422 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'done', { 417 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'done', {
423 'directLogin': this.directLogin(), 418 'directLogin': this.directLogin(),
424 'hasJustBeenAdded':this.directLoginHasJustBeenAdded() 419 'hasJustBeenAdded':this.directLoginHasJustBeenAdded()
425 }) 420 })
426 ], {trace:false}); 421 ], {trace:false});
427 }, 422 },
428 423
429 //============================================================================= 424 //=============================================================================
430 425
431 'handleMoveBackward': function () { 426 'handleMoveBackward': function () {
432 if (this._currentStepIndex > 0) { 427 if (this._currentStepIndex > 0) {
433 varafterMoveAction; 428 varafterMoveAction;
434 429
435 this._currentStepIndex --; 430 this._currentStepIndex --;
436 afterMoveAction = MochiKit.Base.noop; 431 afterMoveAction = MochiKit.Base.noop;
437 432
438 switch(this.currentStep()) { 433 switch(this.currentStep()) {
439 case 'LABEL': 434 case 'LABEL':
440 break; 435 break;
441 case 'TYPE': 436 case 'TYPE':
442 break; 437 break;
443 case 'CONFIGURATION': 438 case 'CONFIGURATION':
444 break; 439 break;
445 case 'BINDINGS': 440 case 'BINDINGS':
446 break; 441 break;
447 case 'FAVICON': 442 case 'FAVICON':
448 break; 443 break;
449 case 'DONE': 444 case 'DONE':
450 break; 445 break;
451 }; 446 };
452 447
453 this.rulerComponent().moveBackward(afterMoveAction); 448 this.rulerComponent().moveBackward(afterMoveAction);
454 } 449 }
455 450
456 if (this._currentStepIndex == 0) { 451 if (this._currentStepIndex == 0) {
457 this.enablePrevious(false); 452 this.enablePrevious(false);
458 } 453 }
459 }, 454 },
460 455
461 'handleMoveForward': function () { 456 'handleMoveForward': function () {
462 if (this.isNextEnabled()) { 457 if (this.isNextEnabled()) {
463 varafterMoveAction; 458 varafterMoveAction;
464 459
465 this._currentStepIndex ++; 460 this._currentStepIndex ++;
466 afterMoveAction = MochiKit.Base.noop; 461 afterMoveAction = MochiKit.Base.noop;
467 462
468 switch(this.currentStep()) { 463 switch(this.currentStep()) {
469 case 'LABEL': 464 case 'LABEL':
470 break; 465 break;
471 case 'TYPE': 466 case 'TYPE':
472 break; 467 break;
473 case 'CONFIGURATION': 468 case 'CONFIGURATION':
474 break; 469 break;
475 case 'BINDINGS': 470 case 'BINDINGS':
476 this.resetBindingComponents(); 471 this.resetBindingComponents();
477 this.resetFormValueComponents(); 472 this.resetFormValueComponents();
478 473
479 afterMoveAction = MochiKit.Base.partial(Clipperz.Async.callbacks, "DirectLoginWizardController.handleMoveForward - BINDINGS", [ 474 afterMoveAction = MochiKit.Base.partial(Clipperz.Async.callbacks, "DirectLoginWizardController.handleMoveForward - BINDINGS", [
480 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration', this.directLoginEditingComponent().bookmarkletConfiguration()), 475 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration', this.directLoginEditingComponent().bookmarkletConfiguration()),
481 476
482 MochiKit.Base.method(this.directLogin(), 'favicon'), 477 MochiKit.Base.method(this.directLogin(), 'favicon'),
483 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'), 478 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
484 479
485 MochiKit.Base.method(this.directLogin(), 'bindings'), 480 MochiKit.Base.method(this.directLogin(), 'bindings'),
486 MochiKit.Base.values, 481 MochiKit.Base.values,
487 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBinding) { 482 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBinding) {
488 var bindingComponent; 483 var bindingComponent;
489 484
490 bindingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent({ 485 bindingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent({
491 formFieldName: aBinding.key(), 486 formFieldName: aBinding.key(),
492 fields: this.recordFields(), 487 fields: this.recordFields(),
493 selectedFieldKey: aBinding.fieldKey() 488 selectedFieldKey: aBinding.fieldKey()
494 }); 489 });
495 490
496 this.bindingComponents().push(bindingComponent); 491 this.bindingComponents().push(bindingComponent);
497 492
498 MochiKit.Signal.connect(bindingComponent, 'bindChange', this, 'handleBindChange', bindingComponent); 493 MochiKit.Signal.connect(bindingComponent, 'bindChange', this, 'handleBindChange', bindingComponent);
499 this.directLoginEditingComponent().addBindingComponent(bindingComponent); 494 this.directLoginEditingComponent().addBindingComponent(bindingComponent);
500 495
501 }, this)), 496 }, this)),
502 497
503 MochiKit.Base.method(this.directLogin(), 'formValues'), 498 MochiKit.Base.method(this.directLogin(), 'formValues'),
504 MochiKit.Base.values, 499 MochiKit.Base.values,
505 Clipperz.Async.forEach(MochiKit.Base.bind(function (aFormValue) { 500 Clipperz.Async.forEach(MochiKit.Base.bind(function (aFormValue) {
506 var formValueComponent; 501 var formValueComponent;
507 502
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
index 6ca3be4..7ab512a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* 24/*
27Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 25Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
28 26
29Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() { 27Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() {
30 Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments); 28 Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments);
31 29
32 return this; 30 return this;
33}; 31};
34 32
35Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, { 33Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, {
36 34
37 'createGrid': function () { 35 'createGrid': function () {
38 return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [ 36 return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
39 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({ 37 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
40 'name': 'DirectLogins.favicon', 38 'name': 'DirectLogins.favicon',
41 'selector': MochiKit.Base.methodcaller('favicon'), 39 'selector': MochiKit.Base.methodcaller('favicon'),
42 'cssClass': 'favicon' 40 'cssClass': 'favicon'
43 }), 41 }),
44 // new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 42 // new Clipperz.PM.UI.Web.Components.LinkColumnManager({
45 new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({ 43 new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({
46 'name': 'DirectLogins.title', 44 'name': 'DirectLogins.title',
47 'selector': MochiKit.Base.methodcaller('label'), 45 'selector': MochiKit.Base.methodcaller('label'),
48 'label': 'title', 46 'label': 'title',
49 'cssClass': 'title', 47 'cssClass': 'title',
50 'comparator': Clipperz.Base.caseInsensitiveCompare, 48 'comparator': Clipperz.Base.caseInsensitiveCompare,
51 'sortable': true, 49 'sortable': true,
52 'sorted': 'ASCENDING', 50 'sorted': 'ASCENDING',
53 'actionMethod': MochiKit.Base.methodcaller('runDirectLogin') 51 'actionMethod': MochiKit.Base.methodcaller('runDirectLogin')
54 }), 52 }),
55 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager 53 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
56 // 'label':'strength', 54 // 'label':'strength',
57 // 'cssClass':'title', 55 // 'cssClass':'title',
58 // 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function 56 // 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function
59 // }), 57 // }),
60 new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 58 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
61 'name': 'DirectLogins.cardTitle', 59 'name': 'DirectLogins.cardTitle',
62 'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')), 60 'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')),
63 'label': 'card', 61 'label': 'card',
64 'cssClass': 'cardTitle', 62 'cssClass': 'cardTitle',
65 'comparator': Clipperz.Base.caseInsensitiveCompare, 63 'comparator': Clipperz.Base.caseInsensitiveCompare,
66 'sortable': true, 64 'sortable': true,
67 'sorted': 'UNSORTED', 65 'sorted': 'UNSORTED',
68 'actionMethod': MochiKit.Base.method(this, 'handleShowCard') 66 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
69 }), 67 }),
70 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager 68 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
71 // 'label':'last access', 69 // 'label':'last access',
72 // 'cssClass':'title', 70 // 'cssClass':'title',
73 // 'selector': MochiKit.Base.methodcaller('label') 71 // 'selector': MochiKit.Base.methodcaller('label')
74 // // 'sortable': true, 72 // // 'sortable': true,
75 // // 'sorted': 'UNSORTED' 73 // // 'sorted': 'UNSORTED'
76 // }), 74 // }),
77 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ 75 // new Clipperz.PM.UI.Web.Components.TextColumnManager({
78 // 'label':'commands', 76 // 'label':'commands',
79 // 'cssClass':'title', 77 // 'cssClass':'title',
80 // 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display 78 // 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display
81 // }), 79 // }),
82 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({ 80 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
83 'name': 'DirectLogins.delete', 81 'name': 'DirectLogins.delete',
84 'selector': MochiKit.Base.noop, 82 'selector': MochiKit.Base.noop,
85 'cssClass': 'delete', 83 'cssClass': 'delete',
86 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})} 84 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})}
87 'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin') 85 'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin')
88 }) 86 })
89 ]}); 87 ]});
90 88
91 }, 89 },
92 90
93 //----------------------------------------------------------------------------- 91 //-----------------------------------------------------------------------------
94 92
95 'getRows': function () { 93 'getRows': function () {
96 //TODO: relying on user() in GridController, bad code smell :| 94 //TODO: relying on user() in GridController, bad code smell :|
97 return this.user().getDirectLogins(); 95 return this.user().getDirectLogins();
98 }, 96 },
99 97
100 //----------------------------------------------------------------------------- 98 //-----------------------------------------------------------------------------
101 99
102 'handleShowCard': function (anObject, anEvent) { 100 'handleShowCard': function (anObject, anEvent) {
103 var cardDialogController; 101 var cardDialogController;
104 102
105 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()}) 103 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()})
106 cardDialogController.run(anEvent.src()); 104 cardDialogController.run(anEvent.src());
107 }, 105 },
108 106
109 //----------------------------------------------------------------------------- 107 //-----------------------------------------------------------------------------
110 108
111 'handleDeleteDirectLogin': function (anObject, anEvent) { 109 'handleDeleteDirectLogin': function (anObject, anEvent) {
112 var deferredResult; 110 var deferredResult;
113 var confirmationDialog; 111 var confirmationDialog;
114 112
115 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 113 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
116 title:"Delete DirectLogin", 114 title:"Delete DirectLogin",
117 text:"Do you want to delete …", 115 text:"Do you want to delete …",
118 type:'ALERT', 116 type:'ALERT',
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
index bfc093a..de59ec3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.FilterController = function(args) { 26Clipperz.PM.UI.Web.Controllers.FilterController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args); 29 Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args);
32 30
33 this._filterElements = []; 31 this._filterElements = [];
34 this._filter = ""; 32 this._filter = "";
35 33
36 this._pendingSearchClicks = 0; 34 this._pendingSearchClicks = 0;
37 35
38 return this; 36 return this;
39}; 37};
40 38
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, {
43 41
44 //----------------------------------------------------------------------------- 42 //-----------------------------------------------------------------------------
45 43
46 'getFilter': function () { 44 'getFilter': function () {
47 return this._filter; 45 return this._filter;
48 }, 46 },
49 47
50 '_setFilter': function (aFilterElement, aFilter) { 48 '_setFilter': function (aFilterElement, aFilter) {
51 if (aFilter != this._filter) { 49 if (aFilter != this._filter) {
52 this._filter = aFilter; 50 this._filter = aFilter;
53 MochiKit.Signal.signal(this, 'filterUpdated', aFilter); 51 MochiKit.Signal.signal(this, 'filterUpdated', aFilter);
54 this.updateFilterElements(aFilterElement, aFilter); 52 this.updateFilterElements(aFilterElement, aFilter);
55 } 53 }
56 }, 54 },
57 55
58 'setFilter': function (aFilter) { 56 'setFilter': function (aFilter) {
59 this._setFilter(null, aFilter); 57 this._setFilter(null, aFilter);
60 }, 58 },
61 59
62 //----------------------------------------------------------------------------- 60 //-----------------------------------------------------------------------------
63 61
64 'filterElements': function () { 62 'filterElements': function () {
65 return this._filterElements; 63 return this._filterElements;
66 }, 64 },
67 65
68 'registerFilterElement': function (aFilterElement) { 66 'registerFilterElement': function (aFilterElement) {
69//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement); 67//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement);
70 this._filterElements.push(aFilterElement); 68 this._filterElements.push(aFilterElement);
71 MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler'); 69 MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler');
72 MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler'); 70 MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler');
73 }, 71 },
74 72
75 'removeFilterElement': function (aFilterElement) { 73 'removeFilterElement': function (aFilterElement) {
76 var i; 74 var i;
77 var filterElements; 75 var filterElements;
78 for (i=0; i < filterElements; i++) { 76 for (i=0; i < filterElements; i++) {
79 if (filterElements[i] == aFilterElement); 77 if (filterElements[i] == aFilterElement);
80 filterElements.splice(i, 1); 78 filterElements.splice(i, 1);
81 // TODO unregister/disconnect filterElement ??MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter'); 79 // TODO unregister/disconnect filterElement ??MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter');
82 } 80 }
83 }, 81 },
84 82
85 'updateFilterElements': function (aSourceElement, aFilterString) { 83 'updateFilterElements': function (aSourceElement, aFilterString) {
86 MochiKit.Iter.forEach(this.filterElements(), 84 MochiKit.Iter.forEach(this.filterElements(),
87 function (aFilterElement) { 85 function (aFilterElement) {
88 if (aFilterElement != aSourceElement) { 86 if (aFilterElement != aSourceElement) {
89 aFilterElement.value = aFilterString; 87 aFilterElement.value = aFilterString;
90 } 88 }
91 } 89 }
92 ); 90 );
93 91
94 if (aSourceElement != null) { 92 if (aSourceElement != null) {
95 aSourceElement.focus(); 93 aSourceElement.focus();
96 } 94 }
97 }, 95 },
98 96
99 //----------------------------------------------------------------------------- 97 //-----------------------------------------------------------------------------
100 98
101 'run': function () { 99 'run': function () {
102//Clipperz.log("=== FilterController.run"); 100//Clipperz.log("=== FilterController.run");
103 }, 101 },
104 102
105 //----------------------------------------------------------------------------- 103 //-----------------------------------------------------------------------------
106 104
107 'pendingSearchClicks': function () { 105 'pendingSearchClicks': function () {
108 return this._pendingSearchClicks; 106 return this._pendingSearchClicks;
109 }, 107 },
110 108
111 'incrementPendingSearchClicks': function () { 109 'incrementPendingSearchClicks': function () {
112 this._pendingSearchClicks++; 110 this._pendingSearchClicks++;
113 }, 111 },
114 112
115 'decrementPendingSearchClicks': function () { 113 'decrementPendingSearchClicks': function () {
116 this._pendingSearchClicks--; 114 this._pendingSearchClicks--;
117 }, 115 },
118 116
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
index 8bb3016..44fbdef 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.GridController = function(args) { 26Clipperz.PM.UI.Web.Controllers.GridController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args); 29 Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args);
32 30
33 this._grid = null; 31 this._grid = null;
34 this._user = null; 32 this._user = null;
35 this._sortedColumnManager = null; 33 this._sortedColumnManager = null;
36 this._cachedObjects = null; 34 this._cachedObjects = null;
37 this._filterController = args.filterController || null; 35 this._filterController = args.filterController || null;
38 36
39 this._deferredDisplaySelectedRowsInvocation = null; 37 this._deferredDisplaySelectedRowsInvocation = null;
40 38
41 return this; 39 return this;
42}; 40};
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, {
45 43
46 'toString': function() { 44 'toString': function() {
47 return "Clipperz.PM.UI.Web.Controllers.GridController"; 45 return "Clipperz.PM.UI.Web.Controllers.GridController";
48 }, 46 },
49 47
50 //----------------------------------------------------------------------------- 48 //-----------------------------------------------------------------------------
51 49
52 'createGrid': function () { 50 'createGrid': function () {
53 throw Clipperz.Base.exception.AbstractMethod; 51 throw Clipperz.Base.exception.AbstractMethod;
54 }, 52 },
55 53
56 'setupWithGrid': function (aGrid) { 54 'setupWithGrid': function (aGrid) {
57 this._grid = aGrid; 55 this._grid = aGrid;
58 56
59 if (this._grid != null) { 57 if (this._grid != null) {
60 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 58 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
61 if (aColumnManager.isSortable()) { 59 if (aColumnManager.isSortable()) {
62 if (aColumnManager.isSorted()) { 60 if (aColumnManager.isSorted()) {
63 this.setSortedColumnManager(aColumnManager); 61 this.setSortedColumnManager(aColumnManager);
64 } 62 }
65 MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort'); 63 MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort');
66 } 64 }
67 MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow'); 65 MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow');
68 MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow'); 66 MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow');
69 }, this); 67 }, this);
70 } 68 }
71 }, 69 },
72 70
73 'grid': function() { 71 'grid': function() {
74 if (this._grid == null) { 72 if (this._grid == null) {
75 this.setupWithGrid(this.createGrid()); 73 this.setupWithGrid(this.createGrid());
76 } 74 }
77 75
78 return this._grid; 76 return this._grid;
79 }, 77 },
80 78
81 'filterController': function () { 79 'filterController': function () {
82//Clipperz.log('GridController.filterController >>>', this._filterController); 80//Clipperz.log('GridController.filterController >>>', this._filterController);
83 if (this._filterController == null) { 81 if (this._filterController == null) {
84 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController(); 82 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
85 } 83 }
86//Clipperz.log('GridController.filterController <<<', this._filterController); 84//Clipperz.log('GridController.filterController <<<', this._filterController);
87 return this._filterController; 85 return this._filterController;
88 }, 86 },
89 87
90 //----------------------------------------------------------------------------- 88 //-----------------------------------------------------------------------------
91 89
92 'columnsManagers': function () { 90 'columnsManagers': function () {
93 return this.grid().columnsManagers(); 91 return this.grid().columnsManagers();
94 }, 92 },
95 93
96 'columnManagerWithName': function (aName) { 94 'columnManagerWithName': function (aName) {
97 varmanagers; 95 varmanagers;
98 var result; 96 var result;
99 97
100 managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers()); 98 managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers());
101 99
102 if (managers.length == 1) { 100 if (managers.length == 1) {
103 result = managers[0]; 101 result = managers[0];
104 } else if (managers.length == 0) { 102 } else if (managers.length == 0) {
105 result = null; 103 result = null;
106 } else { 104 } else {
107 throw "WTF!!!"; 105 throw "WTF!!!";
108 } 106 }
109 107
110 return result; 108 return result;
111 }, 109 },
112 110
113 'sortedColumnManager': function () { 111 'sortedColumnManager': function () {
114 return this._sortedColumnManager; 112 return this._sortedColumnManager;
115 }, 113 },
116 114
117 'setSortedColumnManager': function(aValue) { 115 'setSortedColumnManager': function(aValue) {
118 if (aValue.sorted() != 'UNSORTED') { 116 if (aValue.sorted() != 'UNSORTED') {
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
index a57152d..ac85d36 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
@@ -1,250 +1,246 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.LoginController = function(args) { 26Clipperz.PM.UI.Web.Controllers.LoginController = function(args) {
29 this._args = args || {}; 27 this._args = args || {};
30 28
31 this._loginPage = null; 29 this._loginPage = null;
32 30
33 this._newUserWizardController = null; 31 this._newUserWizardController = null;
34 this._newUserCreationComponent = null; 32 this._newUserCreationComponent = null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, { 37MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, {
40 38
41 'toString': function() { 39 'toString': function() {
42 return "Clipperz.PM.UI.Web.Controllers.LoginController"; 40 return "Clipperz.PM.UI.Web.Controllers.LoginController";
43 }, 41 },
44 42
45 'args': function () { 43 'args': function () {
46 return this._args; 44 return this._args;
47 }, 45 },
48 46
49 //----------------------------------------------------------------------------- 47 //-----------------------------------------------------------------------------
50 48
51 'loginPage': function() { 49 'loginPage': function() {
52 if (this._loginPage == null) { 50 if (this._loginPage == null) {
53 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage(); 51 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage();
54 52
55 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick') 53 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick')
56 } 54 }
57 55
58 return this._loginPage; 56 return this._loginPage;
59 }, 57 },
60 58
61 //----------------------------------------------------------------------------- 59 //-----------------------------------------------------------------------------
62 60
63 'run': function(args) { 61 'run': function(args) {
64 varslot; 62 varslot;
65 varloginPage; 63 varloginPage;
66 varloginForm; 64 varloginForm;
67 65
68 slot = args.slot; 66 slot = args.slot;
69 67
70 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']}); 68 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']});
71 69
72 slot.setContent(this.loginPage()); 70 slot.setContent(this.loginPage());
73 this.loginPage().slotNamed('loginForm').setContent(loginForm); 71 this.loginPage().slotNamed('loginForm').setContent(loginForm);
74 72
75 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 73 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
76 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 74 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
77 }, 75 },
78 76
79 //----------------------------------------------------------------------------- 77 //-----------------------------------------------------------------------------
80 78
81 'doLogin': function(aLoginForm, anEvent) { 79 'doLogin': function(aLoginForm, anEvent) {
82 var deferredResult; 80 var deferredResult;
83 varparameters; 81 varparameters;
84 var loginProgress; 82 var loginProgress;
85 varuser; 83 varuser;
86 var getPassphraseDelegate; 84 var getPassphraseDelegate;
87 85
88 parameters = anEvent; 86 parameters = anEvent;
89 87
90 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase); 88 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
91 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')}); 89 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')});
92 90
93 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress(); 91 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress();
94 92
95 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false}); 93 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false});
96 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4}); 94 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
97 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate); 95 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate);
98 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()}); 96 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()});
99 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); 97 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
100 deferredResult.addMethod(user, 'login'); 98 deferredResult.addMethod(user, 'login');
101 deferredResult.addCallback(function(aLoginProgress, res) { 99 deferredResult.addCallback(function(aLoginProgress, res) {
102 aLoginProgress.disableCancel(); 100 aLoginProgress.disableCancel();
103 return res; 101 return res;
104 }, loginProgress); 102 }, loginProgress);
105 deferredResult.addCallback(function () { 103 deferredResult.addCallback(function () {
106 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body})); 104 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body}));
107 }) 105 })
108 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm); 106 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm);
109 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress)); 107 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress));
110 108
111 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()})); 109 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()}));
112 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField')); 110 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField'));
113 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate)); 111 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate));
114 deferredResult.callback(); 112 deferredResult.callback();
115 113
116 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel'); 114 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel');
117 115
118 return deferredResult; 116 return deferredResult;
119 }, 117 },
120 118
121 //----------------------------------------------------------------------------- 119 //-----------------------------------------------------------------------------
122 120
123 'userLoggedIn': function(aUser) { 121 'userLoggedIn': function(aUser) {
124//Clipperz.log(">>> LoginController.userLoggedIn"); 122//Clipperz.log(">>> LoginController.userLoggedIn");
125 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser}); 123 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser});
126//Clipperz.log("<<< LoginController.userLoggedIn"); 124//Clipperz.log("<<< LoginController.userLoggedIn");
127 }, 125 },
128 126
129 //========================================================================= 127 //=========================================================================
130 128
131 'handleCreateNewAccountClick': function (aComponent) { 129 'handleCreateNewAccountClick': function (aComponent) {
132 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user"); 130 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user");
133 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [ 131 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [
134 //' MochiKit.Base.method(this, 'newUserCreationComponent'), 132 //' MochiKit.Base.method(this, 'newUserCreationComponent'),
135 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}), 133 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}),
136 // MochiKit.Base.method(this.newUserWizardController(), 'run') 134 // MochiKit.Base.method(this.newUserWizardController(), 'run')
137 135
138 136
139 MochiKit.Base.method(this, 'newUserCreationComponent'), 137 MochiKit.Base.method(this, 'newUserCreationComponent'),
140 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [ 138 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [
141 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}), 139 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}),
142 MochiKit.Base.method(this.newUserWizardController(), 'run') 140 MochiKit.Base.method(this.newUserWizardController(), 'run')
143 ], {trace:false}), 141 ], {trace:false}),
144 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField') 142 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField')
145 ], {trace:false}); 143 ], {trace:false});
146 }, 144 },
147 145
148 //----------------------------------------------------------------------------- 146 //-----------------------------------------------------------------------------
149 147
150 'newUserWizardController': function () { 148 'newUserWizardController': function () {
151 if (this._newUserWizardController == null) { 149 if (this._newUserWizardController == null) {
152 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({ 150 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({
153 'newUserCreationComponent': this.newUserCreationComponent() 151 'newUserCreationComponent': this.newUserCreationComponent()
154 }) 152 })
155 153
156 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent'); 154 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent');
157 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent'); 155 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent');
158 } 156 }
159 157
160 return this._newUserWizardController; 158 return this._newUserWizardController;
161 }, 159 },
162 160
163 //------------------------------------------------------------------------- 161 //-------------------------------------------------------------------------
164 162
165 'newUserCreationComponent': function () { 163 'newUserCreationComponent': function () {
166 if (this._newUserCreationComponent == null) { 164 if (this._newUserCreationComponent == null) {
167 this._newUserCreationComponent = new Clipperz.PM.UI.Web.Components.NewUserCreationComponent(); 165 this._newUserCreationComponent = new Clipperz.PM.UI.Web.Components.NewUserCreationComponent();
168 } 166 }
169 167
170 return this._newUserCreationComponent; 168 return this._newUserCreationComponent;
171 }, 169 },
172 170
173 'clearNewUserCreationComponent': function () { 171 'clearNewUserCreationComponent': function () {
174 if (this._newUserCreationComponent != null) { 172 if (this._newUserCreationComponent != null) {
175 this._newUserCreationComponent.clear(); 173 this._newUserCreationComponent.clear();
176 } 174 }
177 this._newUserCreationComponent = null; 175 this._newUserCreationComponent = null;
178 }, 176 },
179 177
180 //------------------------------------------------------------------------- 178 //-------------------------------------------------------------------------
181 179
182 'handleHideNewUserCreationComponent': function () { 180 'handleHideNewUserCreationComponent': function () {
183 this.clearNewUserCreationComponent(); 181 this.clearNewUserCreationComponent();
184 }, 182 },
185 183
186 'handleCompleteNewUserCreationComponent': function (someParameters) { 184 'handleCompleteNewUserCreationComponent': function (someParameters) {
187 vardeferredResult; 185 vardeferredResult;
188 varuser; 186 varuser;
189 varnewUserCreationComponent; 187 varnewUserCreationComponent;
190 188
191 user = someParameters.user; 189 user = someParameters.user;
192 newUserCreationComponent = this.newUserCreationComponent(); 190 newUserCreationComponent = this.newUserCreationComponent();
193 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(newUserCreationComponent, 'deferredHideModal', {closeToElement:MochiKit.DOM.currentDocument().body})), 191 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(newUserCreationComponent, 'deferredHideModal', {closeToElement:MochiKit.DOM.currentDocument().body})),
194 192
195 deferredResult = new Clipperz.Async.Deferred("LoginController.handleCompleteNewUserCreationComponent", {trace:false}); 193 deferredResult = new Clipperz.Async.Deferred("LoginController.handleCompleteNewUserCreationComponent", {trace:false});
196 194
197 deferredResult.addCallbackList([ 195 deferredResult.addCallbackList([
198 MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'), 196 MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'),
199 MochiKit.Base.method(user, 'login'), 197 MochiKit.Base.method(user, 'login'),
200 MochiKit.Base.method(this, 'userLoggedIn', user), 198 MochiKit.Base.method(this, 'userLoggedIn', user),
201 MochiKit.Base.method(this, 'clearNewUserCreationComponent') 199 MochiKit.Base.method(this, 'clearNewUserCreationComponent')
202 ]); 200 ]);
203 deferredResult.addErrback(function (aValue) { Clipperz.log("WTF!! Error doing the login after creating a new user" + aValue)}); 201 deferredResult.addErrback(function (aValue) { Clipperz.log("WTF!! Error doing the login after creating a new user" + aValue)});
204 deferredResult.callback(); 202 deferredResult.callback();
205 203
206 return deferredResult; 204 return deferredResult;
207 }, 205 },
208 206
209 207
210 //========================================================================= 208 //=========================================================================
211 209
212 'handleFailedLogin': function(aLoginProgress, anError) { 210 'handleFailedLogin': function(aLoginProgress, anError) {
213 var result; 211 var result;
214 212
215//console.log("anError", anError);
216 if (anError instanceof MochiKit.Async.CancelledError) { 213 if (anError instanceof MochiKit.Async.CancelledError) {
217 result = anError; 214 result = anError;
218 } else { 215 } else {
219 var deferredResult; 216 var deferredResult;
220 217
221MochiKit.Logging.logError("## MainController - FAILED LOGIN: " + anError); 218Clipperz.logError("## MainController - FAILED LOGIN: " + anError);
222 deferredResult = new MochiKit.Async.Deferred(); 219 deferredResult = new MochiKit.Async.Deferred();
223 220
224 aLoginProgress.showErrorMessage("failed login"); 221 aLoginProgress.showErrorMessage("failed login");
225 // Clipperz.NotificationCenter.register(loginProgress, 'cancelEvent', deferredResult, 'callback'); 222 // Clipperz.NotificationCenter.register(loginProgress, 'cancelEvent', deferredResult, 'callback');
226 MochiKit.Signal.connect(aLoginProgress, 'cancelEvent', deferredResult, 'callback'); 223 MochiKit.Signal.connect(aLoginProgress, 'cancelEvent', deferredResult, 'callback');
227 deferredResult.addCallback(MochiKit.Async.fail, anError) 224 deferredResult.addCallback(MochiKit.Async.fail, anError)
228 result = deferredResult; 225 result = deferredResult;
229 } 226 }
230 227
231 return result; 228 return result;
232 }, 229 },
233 230
234 'handleGenericError': function(anError) { 231 'handleGenericError': function(anError) {
235 var result; 232 var result;
236 233
237 if (anError instanceof MochiKit.Async.CancelledError) { 234 if (anError instanceof MochiKit.Async.CancelledError) {
238 result = anError; 235 result = anError;
239 } else { 236 } else {
240MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 237Clipperz.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
241//console.log(anError);
242 result = new MochiKit.Async.CancelledError(anError); 238 result = new MochiKit.Async.CancelledError(anError);
243 } 239 }
244 240
245 return result; 241 return result;
246 }, 242 },
247 243
248 //----------------------------------------------------------------------------- 244 //-----------------------------------------------------------------------------
249 __syntaxFix__: "syntax fix" 245 __syntaxFix__: "syntax fix"
250}); 246});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
index c83e3c0..9194125 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
@@ -1,215 +1,207 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.MainController = function(args) { 26Clipperz.PM.UI.Web.Controllers.MainController = function(args) {
29 this._args = args; 27 this._args = args;
30 28
31 //controllers 29 //controllers
32 this._loginController =null; 30 this._loginController =null;
33 this._appController =null; 31 this._appController =null;
34 32
35 //components 33 //components
36 this._headerComponent = null; 34 this._headerComponent = null;
37 this._pageComponent =null; 35 this._pageComponent =null;
38 this._footerComponent = null; 36 this._footerComponent = null;
39 37
40 this._passphraseDelegateLock = new MochiKit.Async.DeferredLock(); 38 this._passphraseDelegateLock = new MochiKit.Async.DeferredLock();
41 this._passphraseDelegateLock.acquire(); 39 this._passphraseDelegateLock.acquire();
42//Clipperz.log('MainController init _passphraseDelegateLock', this._passphraseDelegateLock); 40//Clipperz.log('MainController init _passphraseDelegateLock', this._passphraseDelegateLock);
43 this._passphraseDelegate = null; 41 this._passphraseDelegate = null;
44 42
45 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestSent', this, 'handleRemoteRequestSent'); 43 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestSent', this, 'handleRemoteRequestSent');
46 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived',this, 'handleRemoteRequestReceived'); 44 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived',this, 'handleRemoteRequestReceived');
47 45
48 return this; 46 return this;
49} 47}
50 48
51MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.MainController.prototype, { 49MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.MainController.prototype, {
52 50
53 'toString': function() { 51 'toString': function() {
54 return "Clipperz.PM.UI.Web.Controllers.MainController"; 52 return "Clipperz.PM.UI.Web.Controllers.MainController";
55 }, 53 },
56 54
57 'args': function () { 55 'args': function () {
58 return this._args; 56 return this._args;
59 }, 57 },
60 58
61 //----------------------------------------------------------------------------- 59 //-----------------------------------------------------------------------------
62 60
63 'headerComponent': function() { 61 'headerComponent': function() {
64 if (this._headerComponent == null) { 62 if (this._headerComponent == null) {
65 this._headerComponent = new Clipperz.PM.UI.Web.Components.PageHeader(); 63 this._headerComponent = new Clipperz.PM.UI.Web.Components.PageHeader();
66 } 64 }
67 65
68 return this._headerComponent; 66 return this._headerComponent;
69 }, 67 },
70 68
71 'footerComponent': function() { 69 'footerComponent': function() {
72 if (this._footerComponent == null) { 70 if (this._footerComponent == null) {
73 this._footerComponent = new Clipperz.PM.UI.Web.Components.PageFooter(); 71 this._footerComponent = new Clipperz.PM.UI.Web.Components.PageFooter();
74 } 72 }
75 73
76 return this._footerComponent; 74 return this._footerComponent;
77 }, 75 },
78 76
79 //----------------------------------------------------------------------------- 77 //-----------------------------------------------------------------------------
80 78
81 'pageComponent': function() { 79 'pageComponent': function() {
82 if (this._pageComponent == null) { 80 if (this._pageComponent == null) {
83 this._pageComponent = new Clipperz.PM.UI.Web.Components.Page({element:MochiKit.DOM.getElement('mainDiv')}); 81 this._pageComponent = new Clipperz.PM.UI.Web.Components.Page({element:MochiKit.DOM.getElement('mainDiv')});
84 } 82 }
85 83
86 return this._pageComponent; 84 return this._pageComponent;
87 }, 85 },
88 86
89 //----------------------------------------------------------------------------- 87 //-----------------------------------------------------------------------------
90 88
91 'loginController': function() { 89 'loginController': function() {
92 if (this._loginController == null) { 90 if (this._loginController == null) {
93 this._loginController = new Clipperz.PM.UI.Web.Controllers.LoginController(this.args()); 91 this._loginController = new Clipperz.PM.UI.Web.Controllers.LoginController(this.args());
94 92
95 MochiKit.Signal.connect(this._loginController, 'userLoggedIn', this, 'loginControllerUserLoggedInCallback'); 93 MochiKit.Signal.connect(this._loginController, 'userLoggedIn', this, 'loginControllerUserLoggedInCallback');
96 } 94 }
97 95
98 return this._loginController; 96 return this._loginController;
99 }, 97 },
100 98
101 'appController': function() { 99 'appController': function() {
102 if (this._appController == null) { 100 if (this._appController == null) {
103 this._appController = new Clipperz.PM.UI.Web.Controllers.AppController(); 101 this._appController = new Clipperz.PM.UI.Web.Controllers.AppController();
104 102
105 MochiKit.Signal.connect(this._appController, 'logout', this, 'handleLogout'); 103 MochiKit.Signal.connect(this._appController, 'logout', this, 'handleLogout');
106 } 104 }
107 105
108 return this._appController; 106 return this._appController;
109 }, 107 },
110 108
111 //----------------------------------------------------------------------------- 109 //-----------------------------------------------------------------------------
112 110
113 'run': function(shoudShowRegistrationForm) { 111 'run': function(shoudShowRegistrationForm) {
114 this.pageComponent().slotNamed('header').setContent(this.headerComponent()); 112 this.pageComponent().slotNamed('header').setContent(this.headerComponent());
115 this.pageComponent().slotNamed('footer').setContent(this.footerComponent()); 113 this.pageComponent().slotNamed('footer').setContent(this.footerComponent());
116 114
117 this.pageComponent().render(); 115 this.pageComponent().render();
118 116
119 this.loginController().run({slot:this.pageComponent().slotNamed('body')}); 117 this.loginController().run({slot:this.pageComponent().slotNamed('body')});
120 118
121 if (shoudShowRegistrationForm) { 119 if (shoudShowRegistrationForm) {
122 MochiKit.Signal.signal(this.loginController().loginPage(), 'createNewAccountClick'); 120 MochiKit.Signal.signal(this.loginController().loginPage(), 'createNewAccountClick');
123 // this.loginController().handleCreateNewAccountClick(); 121 // this.loginController().handleCreateNewAccountClick();
124 } 122 }
125 }, 123 },
126 124
127 //----------------------------------------------------------------------------- 125 //-----------------------------------------------------------------------------
128 126
129 'getPassphrase': function () { 127 'getPassphrase': function () {
130 var deferredResult; 128 var deferredResult;
131 129
132 deferredResult = new Clipperz.Async.Deferred("MainController.getPassphrase", {trace:false}); 130 deferredResult = new Clipperz.Async.Deferred("MainController.getPassphrase", {trace:false});
133 131
134 deferredResult.acquireLock(this._passphraseDelegateLock); 132 deferredResult.acquireLock(this._passphraseDelegateLock);
135 deferredResult.addMethod(this, 'invokePassphraseDelegate'); 133 deferredResult.addMethod(this, 'invokePassphraseDelegate');
136 deferredResult.releaseLock(this._passphraseDelegateLock); 134 deferredResult.releaseLock(this._passphraseDelegateLock);
137 deferredResult.callback(); 135 deferredResult.callback();
138 136
139 return deferredResult; 137 return deferredResult;
140 }, 138 },
141 139
142 //......................................................................... 140 //.........................................................................
143 141
144 'invokePassphraseDelegate': function () { 142 'invokePassphraseDelegate': function () {
145 return this._passphraseDelegate(); 143 return this._passphraseDelegate();
146 }, 144 },
147 145
148 'passphraseDelegateLock': function () { 146 'passphraseDelegateLock': function () {
149 return this._passphraseDelegateLock; 147 return this._passphraseDelegateLock;
150 }, 148 },
151 149
152 //......................................................................... 150 //.........................................................................
153 151
154 'setPassphraseDelegate': function (aDelegate) { 152 'setPassphraseDelegate': function (aDelegate) {
155 var shouldReleaseLock; 153 var shouldReleaseLock;
156 154
157 shouldReleaseLock = (this._passphraseDelegate == null); 155 shouldReleaseLock = (this._passphraseDelegate == null);
158 156
159 this._passphraseDelegate = aDelegate; 157 this._passphraseDelegate = aDelegate;
160 158
161 if (shouldReleaseLock) { 159 if (shouldReleaseLock) {
162 this._passphraseDelegateLock.release(); 160 this._passphraseDelegateLock.release();
163 } 161 }
164 }, 162 },
165 163
166 //......................................................................... 164 //.........................................................................
167 165
168 'removePassphraseDelegate': function (aDelegate) { 166 'removePassphraseDelegate': function (aDelegate) {
169 if (this._passphraseDelegate == aDelegate) { 167 if (this._passphraseDelegate == aDelegate) {
170 this._passphraseDelegate = null; 168 this._passphraseDelegate = null;
171 this._passphraseDelegateLock.acquire(); 169 this._passphraseDelegateLock.acquire();
172 } 170 }
173 }, 171 },
174 172
175 //------------------------------------------------------------------------- 173 //-------------------------------------------------------------------------
176 174
177 'loginControllerUserLoggedInCallback': function(anEvent) { 175 'loginControllerUserLoggedInCallback': function(anEvent) {
178//Clipperz.log(">>> loginControllerUserLoggedInCallback", anEvent);
179 // this.setUser(anEvent.parameters()['user']);
180//console.log("--- loginControllerUserLoggedInCallback - 1");
181
182//console.log("--- loginControllerUserLoggedInCallback - 2");
183 this.headerComponent().switchToLoggedMode(); 176 this.headerComponent().switchToLoggedMode();
184 this.appController().run({slot:this.pageComponent().slotNamed('body'), user:anEvent['user']}); 177 this.appController().run({slot:this.pageComponent().slotNamed('body'), user:anEvent['user']});
185//Clipperz.log("<<< loginControllerUserLoggedInCallback");
186 }, 178 },
187 179
188 //----------------------------------------------------------------------------- 180 //-----------------------------------------------------------------------------
189 181
190 'handleRemoteRequestSent': function () { 182 'handleRemoteRequestSent': function () {
191//Clipperz.log("REMOTE REQUEST sent >>>"); 183//Clipperz.log("REMOTE REQUEST sent >>>");
192 }, 184 },
193 185
194 'handleRemoteRequestReceived': function () { 186 'handleRemoteRequestReceived': function () {
195//Clipperz.log("REMOTE REQUEST received <<<"); 187//Clipperz.log("REMOTE REQUEST received <<<");
196 }, 188 },
197 189
198 //----------------------------------------------------------------------------- 190 //-----------------------------------------------------------------------------
199 191
200 'handleLogout': function(anEvent) { 192 'handleLogout': function(anEvent) {
201 this.exit('logout.html'); 193 this.exit('logout.html');
202 }, 194 },
203 195
204 //----------------------------------------------------------------------------- 196 //-----------------------------------------------------------------------------
205 197
206 'exit': function(aPageName) { 198 'exit': function(aPageName) {
207//Clipperz.log("### exit " + aPageName); 199//Clipperz.log("### exit " + aPageName);
208 MochiKit.Async.wait(0).addCallback(function() { 200 MochiKit.Async.wait(0).addCallback(function() {
209 window.location.href = "./" + aPageName + "?ln=" + Clipperz.PM.Strings.selectedLanguage; 201 window.location.href = "./" + aPageName + "?ln=" + Clipperz.PM.Strings.selectedLanguage;
210 }); 202 });
211 }, 203 },
212 204
213 //----------------------------------------------------------------------------- 205 //-----------------------------------------------------------------------------
214 __syntaxFix__: "syntax fix" 206 __syntaxFix__: "syntax fix"
215}); 207});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
index 7db6888..b70aa17 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
@@ -1,466 +1,458 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.NewUserWizardController = function(args) { 26Clipperz.PM.UI.Web.Controllers.NewUserWizardController = function(args) {
29 this._newUserCreationComponent = args.newUserCreationComponent|| Clipperz.Base.exception.raise('MandatoryParameter'); 27 this._newUserCreationComponent = args.newUserCreationComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
30 28
31 MochiKit.Signal.connect(this._newUserCreationComponent, 'changedValue',this, 'handleChangedValue'); 29 MochiKit.Signal.connect(this._newUserCreationComponent, 'changedValue',this, 'handleChangedValue');
32 MochiKit.Signal.connect(this._newUserCreationComponent, 'moveForward',this, 'handleMoveForward'); 30 MochiKit.Signal.connect(this._newUserCreationComponent, 'moveForward',this, 'handleMoveForward');
33 MochiKit.Signal.connect(this._newUserCreationComponent, 'keyPressed',this, 'handleNewUserCreationComponentKeyPressed'); 31 MochiKit.Signal.connect(this._newUserCreationComponent, 'keyPressed',this, 'handleNewUserCreationComponentKeyPressed');
34 32
35 this._rulerComponent = null; 33 this._rulerComponent = null;
36 34
37 this._steps = null; 35 this._steps = null;
38 this._currentStepIndex = 0; 36 this._currentStepIndex = 0;
39 this._isNextEnabled = false; 37 this._isNextEnabled = false;
40 38
41 this._userCreationState = 'IDLE'; //'IN PROGRESS', 'DONE', 'FAILED' 39 this._userCreationState = 'IDLE'; //'IN PROGRESS', 'DONE', 'FAILED'
42 this._user = null; 40 this._user = null;
43 return this; 41 return this;
44} 42}
45 43
46MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.NewUserWizardController.prototype, { 44MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.NewUserWizardController.prototype, {
47 45
48 'toString': function() { 46 'toString': function() {
49 return "Clipperz.PM.UI.Web.Controllers.NewUserWizardController"; 47 return "Clipperz.PM.UI.Web.Controllers.NewUserWizardController";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'newUserCreationComponent': function () { 52 'newUserCreationComponent': function () {
55 return this._newUserCreationComponent; 53 return this._newUserCreationComponent;
56 }, 54 },
57 55
58 //============================================================================= 56 //=============================================================================
59 57
60 'user': function () { 58 'user': function () {
61 return this._user; 59 return this._user;
62 }, 60 },
63 61
64 'setUser': function (aValue) { 62 'setUser': function (aValue) {
65 this._user = aValue; 63 this._user = aValue;
66 }, 64 },
67 65
68 //----------------------------------------------------------------------------- 66 //-----------------------------------------------------------------------------
69 67
70 'userCreationState': function () { 68 'userCreationState': function () {
71 return this._userCreationState; 69 return this._userCreationState;
72 }, 70 },
73 71
74 'setUserCreationState': function (aValue) { 72 'setUserCreationState': function (aValue) {
75//console.log("+++ NewUserWizardController.setUserCreationState", aValue);
76 this._userCreationState = aValue; 73 this._userCreationState = aValue;
77 this.checkState(); 74 this.checkState();
78 }, 75 },
79 76
80 //============================================================================= 77 //=============================================================================
81 78
82 'resetCurrentStepIndex': function () { 79 'resetCurrentStepIndex': function () {
83 this._currentStepIndex = 0; 80 this._currentStepIndex = 0;
84 this.rulerComponent().resetStatus({animateTransition:true}); 81 this.rulerComponent().resetStatus({animateTransition:true});
85 }, 82 },
86 83
87 //----------------------------------------------------------------------------- 84 //-----------------------------------------------------------------------------
88 85
89 'enableNext': function (aValue) { 86 'enableNext': function (aValue) {
90 this.rulerComponent().enableNext(aValue); 87 this.rulerComponent().enableNext(aValue);
91 this._isNextEnabled = aValue; 88 this._isNextEnabled = aValue;
92 }, 89 },
93 90
94 'isNextEnabled': function () { 91 'isNextEnabled': function () {
95 return this._isNextEnabled; 92 return this._isNextEnabled;
96 }, 93 },
97 94
98 //----------------------------------------------------------------------------- 95 //-----------------------------------------------------------------------------
99 96
100 'enablePrevious': function (aValue) { 97 'enablePrevious': function (aValue) {
101 this.rulerComponent().enablePrevious(aValue); 98 this.rulerComponent().enablePrevious(aValue);
102 }, 99 },
103 100
104 //============================================================================= 101 //=============================================================================
105 102
106 'rulerComponent': function () { 103 'rulerComponent': function () {
107 if (this._rulerComponent == null) { 104 if (this._rulerComponent == null) {
108 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({ 105 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
109 translationContext:'Wizards.NewUserWizard' 106 translationContext:'Wizards.NewUserWizard'
110 }); 107 });
111 this._rulerComponent.render(); 108 this._rulerComponent.render();
112 109
113 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit'); 110 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
114 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done'); 111 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
115 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward'); 112 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
116 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward'); 113 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
117 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved'); 114 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
118 } 115 }
119 116
120 return this._rulerComponent; 117 return this._rulerComponent;
121 }, 118 },
122 119
123 'resetRuler': function () { 120 'resetRuler': function () {
124 // if (this._rulerComponent != null) { 121 // if (this._rulerComponent != null) {
125 // this._rulerComponent.clear(); 122 // this._rulerComponent.clear();
126 // } 123 // }
127 // this._rulerComponent = null; 124 // this._rulerComponent = null;
128 }, 125 },
129 126
130 //----------------------------------------------------------------------------- 127 //-----------------------------------------------------------------------------
131 128
132 'showRuler': function (someSteps) { 129 'showRuler': function (someSteps) {
133 var rulerElement; 130 var rulerElement;
134 131
135 this.setSteps(someSteps); 132 this.setSteps(someSteps);
136 133
137 rulerElement = this.rulerComponent().element(); 134 rulerElement = this.rulerComponent().element();
138 this.newUserCreationComponent().disableAllPanels(); 135 this.newUserCreationComponent().disableAllPanels();
139 136
140 MochiKit.Style.showElement(rulerElement); 137 MochiKit.Style.showElement(rulerElement);
141 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.newUserCreationComponent().bottomMargin()}); 138 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.newUserCreationComponent().bottomMargin()});
142 new MochiKit.Visual.Move(rulerElement, { 139 new MochiKit.Visual.Move(rulerElement, {
143 x:0, y:this.newUserCreationComponent().bottomMargin(), 140 x:0, y:this.newUserCreationComponent().bottomMargin(),
144 mode:'absolute', 141 mode:'absolute',
145 duration:0.5, 142 duration:0.5,
146 // afterFinish:MochiKit.Base.method(this, 'handleCursorMoved') 143 // afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
147 afterFinish:MochiKit.Base.method(this, 'handleRulerShowed') 144 afterFinish:MochiKit.Base.method(this, 'handleRulerShowed')
148 }); 145 });
149 }, 146 },
150 147
151 //----------------------------------------------------------------------------- 148 //-----------------------------------------------------------------------------
152 149
153 'handleRulerShowed':function () { 150 'handleRulerShowed':function () {
154 return Clipperz.Async.callbacks("NewUserWizardController.handlerRulerShowed", [ 151 return Clipperz.Async.callbacks("NewUserWizardController.handlerRulerShowed", [
155 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'), 152 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
156 MochiKit.Base.method(this, 'handleCursorMoved') 153 MochiKit.Base.method(this, 'handleCursorMoved')
157 ], {trace:false}); 154 ], {trace:false});
158 }, 155 },
159 156
160 //----------------------------------------------------------------------------- 157 //-----------------------------------------------------------------------------
161 158
162 'hideRuler': function () { 159 'hideRuler': function () {
163 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:0.5}); 160 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:0.5});
164 }, 161 },
165 162
166 'doneWithRuler': function () { 163 'doneWithRuler': function () {
167 var rulerComponentElement; 164 var rulerComponentElement;
168 165
169 rulerComponentElement = this.rulerComponent().element(); 166 rulerComponentElement = this.rulerComponent().element();
170 new MochiKit.Visual.Move(this.rulerComponent().element(), { 167 new MochiKit.Visual.Move(this.rulerComponent().element(), {
171 x:1000, 168 x:1000,
172 mode:'relative', 169 mode:'relative',
173 duration:1, 170 duration:1,
174 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement) 171 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
175 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); } 172 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
176 }); 173 });
177 }, 174 },
178 175
179 //============================================================================= 176 //=============================================================================
180 177
181 'createNewUserRulerSteps': function () { 178 'createNewUserRulerSteps': function () {
182 return [ 'CREDENTIALS', 'CHECK_CREDENTIALS', 'TERMS_OF_SERVICE', 'CREATE_USER'/*, 'LOGIN' */]; 179 return [ 'CREDENTIALS', 'CHECK_CREDENTIALS', 'TERMS_OF_SERVICE', 'CREATE_USER'/*, 'LOGIN' */];
183 }, 180 },
184 181
185 //------------------------------------------------------------------------- 182 //-------------------------------------------------------------------------
186 183
187 'run': function () { 184 'run': function () {
188 return Clipperz.Async.callbacks("NewUserWizardController.run", [ 185 return Clipperz.Async.callbacks("NewUserWizardController.run", [
189 MochiKit.Base.method(this, 'createNewUserRulerSteps'), 186 MochiKit.Base.method(this, 'createNewUserRulerSteps'),
190 MochiKit.Base.method(this, 'showRuler') 187 MochiKit.Base.method(this, 'showRuler')
191 ], {trace:false}); 188 ], {trace:false});
192 }, 189 },
193 190
194 //----------------------------------------------------------------------------- 191 //-----------------------------------------------------------------------------
195 192
196 'checkState': function () { 193 'checkState': function () {
197 var enablePrevious; 194 var enablePrevious;
198 var enableNext; 195 var enableNext;
199 196
200 enablePrevious = true; 197 enablePrevious = true;
201 enableNext = false; 198 enableNext = false;
202 199
203 this.newUserCreationComponent().disableAllPanels(); 200 this.newUserCreationComponent().disableAllPanels();
204 201
205 switch(this.currentStep()) { 202 switch(this.currentStep()) {
206 case 'CREDENTIALS': 203 case 'CREDENTIALS':
207 this.newUserCreationComponent().enableCredentialsPanel(); 204 this.newUserCreationComponent().enableCredentialsPanel();
208 205
209 enableNext = ( 206 enableNext = (
210 (this.newUserCreationComponent().username() != '') 207 (this.newUserCreationComponent().username() != '')
211 && 208 &&
212 (this.newUserCreationComponent().passphrase() != '') 209 (this.newUserCreationComponent().passphrase() != '')
213 ); 210 );
214 // enablePrevious = false; 211 // enablePrevious = false;
215 break; 212 break;
216 case 'CHECK_CREDENTIALS': 213 case 'CHECK_CREDENTIALS':
217 this.newUserCreationComponent().enableCheckCredentialsPanel(); 214 this.newUserCreationComponent().enableCheckCredentialsPanel();
218 215
219 enableNext = (this.newUserCreationComponent().passphrase() == this.newUserCreationComponent().rePassphrase()); 216 enableNext = (this.newUserCreationComponent().passphrase() == this.newUserCreationComponent().rePassphrase());
220 // enablePrevious = true; 217 // enablePrevious = true;
221 break 218 break
222 case 'TERMS_OF_SERVICE': 219 case 'TERMS_OF_SERVICE':
223 this.newUserCreationComponent().enableTermsOfServicePanel(); 220 this.newUserCreationComponent().enableTermsOfServicePanel();
224 221
225//console.log("awareOfUnrecoverablePassphrase", this.newUserCreationComponent().awareOfUnrecoverablePassphrase());
226//console.log("readTermsOfService", this.newUserCreationComponent().readTermsOfService());
227 enableNext = ( 222 enableNext = (
228 (this.newUserCreationComponent().awareOfUnrecoverablePassphrase() == 'on') 223 (this.newUserCreationComponent().awareOfUnrecoverablePassphrase() == 'on')
229 && 224 &&
230 (this.newUserCreationComponent().readTermsOfService() == 'on') 225 (this.newUserCreationComponent().readTermsOfService() == 'on')
231 ) 226 )
232 break; 227 break;
233 case 'CREATE_USER': 228 case 'CREATE_USER':
234//console.log(">>> CREATE_USER", this.userCreationState());
235 this.newUserCreationComponent().enableCreateUserPanel(); 229 this.newUserCreationComponent().enableCreateUserPanel();
236 230
237 switch (this.userCreationState()) { 231 switch (this.userCreationState()) {
238 case 'IDLE': 232 case 'IDLE':
239 this.setUserCreationState('IN PROGRESS'); 233 this.setUserCreationState('IN PROGRESS');
240 this.preformActualUserRegistration(); 234 this.preformActualUserRegistration();
241 235
242 enablePrevious = false; 236 enablePrevious = false;
243 enableNext = false; 237 enableNext = false;
244 break; 238 break;
245 case 'IN PROGRESS': 239 case 'IN PROGRESS':
246 enablePrevious = false; 240 enablePrevious = false;
247 enableNext = false; 241 enableNext = false;
248 break; 242 break;
249 case 'DONE': 243 case 'DONE':
250 enablePrevious = false; 244 enablePrevious = false;
251 enableNext = true; 245 enableNext = true;
252 break; 246 break;
253 case 'FAILED': 247 case 'FAILED':
254 enablePrevious = true; 248 enablePrevious = true;
255 enableNext = false; 249 enableNext = false;
256 break; 250 break;
257 }; 251 };
258 break; 252 break;
259 // case 'LOGIN': 253 // case 'LOGIN':
260 // this.newUserCreationComponent().enableLoginPanel(); 254 // this.newUserCreationComponent().enableLoginPanel();
261 // break; 255 // break;
262 } 256 }
263 257
264 if (this.currentStepIndex() > 0) { 258 if (this.currentStepIndex() > 0) {
265 this.enablePrevious(enablePrevious); 259 this.enablePrevious(enablePrevious);
266 } else { 260 } else {
267 this.enablePrevious(false); 261 this.enablePrevious(false);
268 } 262 }
269 this.enableNext(enableNext); 263 this.enableNext(enableNext);
270 }, 264 },
271 265
272 //----------------------------------------------------------------------------- 266 //-----------------------------------------------------------------------------
273 267
274 'setFocus': function () { 268 'setFocus': function () {
275 switch(this.currentStep()) { 269 switch(this.currentStep()) {
276 case 'CREDENTIALS': 270 case 'CREDENTIALS':
277 this.newUserCreationComponent().focusOnUsernameElement(); 271 this.newUserCreationComponent().focusOnUsernameElement();
278 break; 272 break;
279 case 'CHECK_CREDENTIALS': 273 case 'CHECK_CREDENTIALS':
280 this.newUserCreationComponent().focusOnRePassphraseElement(); 274 this.newUserCreationComponent().focusOnRePassphraseElement();
281 break 275 break
282 case 'TERMS_OF_SERVICE': 276 case 'TERMS_OF_SERVICE':
283 break; 277 break;
284 case 'CREATE_USER': 278 case 'CREATE_USER':
285 break; 279 break;
286 // case 'LOGIN': 280 // case 'LOGIN':
287 // break; 281 // break;
288 } 282 }
289 }, 283 },
290 284
291 //============================================================================= 285 //=============================================================================
292 286
293 'steps': function () { 287 'steps': function () {
294 return this._steps; 288 return this._steps;
295 }, 289 },
296 290
297 'setSteps': function (aValue) { 291 'setSteps': function (aValue) {
298 this._steps = aValue; 292 this._steps = aValue;
299 293
300 this.rulerComponent().setSteps(aValue); 294 this.rulerComponent().setSteps(aValue);
301 this.resetCurrentStepIndex(); 295 this.resetCurrentStepIndex();
302 }, 296 },
303 297
304 'currentStepIndex': function () { 298 'currentStepIndex': function () {
305 return this._currentStepIndex; 299 return this._currentStepIndex;
306 }, 300 },
307 301
308 'currentStep': function () { 302 'currentStep': function () {
309 return this.steps()[this.currentStepIndex()]; 303 return this.steps()[this.currentStepIndex()];
310 }, 304 },
311 305
312 //============================================================================= 306 //=============================================================================
313 307
314 'handleExit': function () { 308 'handleExit': function () {
315 return Clipperz.Async.callbacks("NewUserWizardController.handleExit", [ 309 return Clipperz.Async.callbacks("NewUserWizardController.handleExit", [
316 // MochiKit.Base.method(this.newUserCreationComponent(), 'resetContent'), 310 // MochiKit.Base.method(this.newUserCreationComponent(), 'resetContent'),
317 Clipperz.Async.forkAndJoin("NewUserWizardController.handleExit - fork and join", [ 311 Clipperz.Async.forkAndJoin("NewUserWizardController.handleExit - fork and join", [
318 MochiKit.Base.method(this, 'hideRuler'), 312 MochiKit.Base.method(this, 'hideRuler'),
319 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredHideModal') 313 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredHideModal')
320 ], {trace:false}), 314 ], {trace:false}),
321 MochiKit.Base.method(this, 'resetRuler'), 315 MochiKit.Base.method(this, 'resetRuler'),
322 // MochiKit.Base.method(this.newUserCreationComponent(), 'reset'), 316 // MochiKit.Base.method(this.newUserCreationComponent(), 'reset'),
323 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'exit') 317 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'exit')
324 ], {trace:false}) 318 ], {trace:false})
325 }, 319 },
326 320
327 'done': function () { 321 'done': function () {
328 this.doneWithRuler(); 322 this.doneWithRuler();
329 MochiKit.Signal.signal(this, 'done', {'user': this.user()}); 323 MochiKit.Signal.signal(this, 'done', {'user': this.user()});
330 }, 324 },
331 325
332 //============================================================================= 326 //=============================================================================
333 327
334 'handleMoveBackward': function () { 328 'handleMoveBackward': function () {
335 if (this._currentStepIndex > 0) { 329 if (this._currentStepIndex > 0) {
336 varafterMoveAction; 330 varafterMoveAction;
337 331
338 afterMoveAction = MochiKit.Base.noop; 332 afterMoveAction = MochiKit.Base.noop;
339 333
340//console.log("<-- backward", this.currentStep());
341 switch(this.currentStep()) { 334 switch(this.currentStep()) {
342 case 'CREDENTIALS': 335 case 'CREDENTIALS':
343 case 'CHECK_CREDENTIALS': 336 case 'CHECK_CREDENTIALS':
344 case 'TERMS_OF_SERVICE': 337 case 'TERMS_OF_SERVICE':
345 this._currentStepIndex --; 338 this._currentStepIndex --;
346 this.rulerComponent().moveBackward(afterMoveAction); 339 this.rulerComponent().moveBackward(afterMoveAction);
347 break; 340 break;
348 case 'CREATE_USER': 341 case 'CREATE_USER':
349 this.setUser(null); 342 this.setUser(null);
350 this.newUserCreationComponent().hideAllProgeressStates(); 343 this.newUserCreationComponent().hideAllProgeressStates();
351 this.resetCurrentStepIndex(); 344 this.resetCurrentStepIndex();
352 this.setUserCreationState('IDLE'); 345 this.setUserCreationState('IDLE');
353 break; 346 break;
354 // case 'LOGIN': 347 // case 'LOGIN':
355 // break; 348 // break;
356 }; 349 };
357 350
358 } 351 }
359 352
360 if (this._currentStepIndex == 0) { 353 if (this._currentStepIndex == 0) {
361 this.enablePrevious(false); 354 this.enablePrevious(false);
362 } 355 }
363 }, 356 },
364 357
365 'handleMoveForward': function () { 358 'handleMoveForward': function () {
366 if (this.isNextEnabled()) { 359 if (this.isNextEnabled()) {
367 varafterMoveAction; 360 varafterMoveAction;
368 361
369 this._currentStepIndex ++; 362 this._currentStepIndex ++;
370 afterMoveAction = MochiKit.Base.noop; 363 afterMoveAction = MochiKit.Base.noop;
371 364
372 switch(this.currentStep()) { 365 switch(this.currentStep()) {
373 case 'CREDENTIALS': 366 case 'CREDENTIALS':
374 break; 367 break;
375 case 'CHECK_CREDENTIALS': 368 case 'CHECK_CREDENTIALS':
376 break 369 break
377 case 'TERMS_OF_SERVICE': 370 case 'TERMS_OF_SERVICE':
378 break; 371 break;
379 case 'CREATE_USER': 372 case 'CREATE_USER':
380 break; 373 break;
381 // case 'LOGIN': 374 // case 'LOGIN':
382 // break; 375 // break;
383 }; 376 };
384 377
385 this.rulerComponent().moveForward(afterMoveAction); 378 this.rulerComponent().moveForward(afterMoveAction);
386 }; 379 };
387 }, 380 },
388 381
389 'handleCursorMoved': function () { 382 'handleCursorMoved': function () {
390 // this.checkState(); 383 // this.checkState();
391 // this.setFocus(); 384 // this.setFocus();
392 385
393 return Clipperz.Async.callbacks("NewUserWizardController.handleCursorMoved", [ 386 return Clipperz.Async.callbacks("NewUserWizardController.handleCursorMoved", [
394 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'), 387 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
395 MochiKit.Base.method(this, 'checkState'), 388 MochiKit.Base.method(this, 'checkState'),
396 MochiKit.Base.method(this, 'setFocus') 389 MochiKit.Base.method(this, 'setFocus')
397 ], {trace:false}); 390 ], {trace:false});
398 }, 391 },
399 392
400 //------------------------------------------------------------------------- 393 //-------------------------------------------------------------------------
401 394
402 'handleChangedValue': function (anEvent) { 395 'handleChangedValue': function (anEvent) {
403 this.checkState(); 396 this.checkState();
404 }, 397 },
405 398
406 //------------------------------------------------------------------------- 399 //-------------------------------------------------------------------------
407 400
408 'handleNewUserCreationComponentKeyPressed': function (anEvent) { 401 'handleNewUserCreationComponentKeyPressed': function (anEvent) {
409//console.log(">>> handleNewUserCreationComponentKeyPressed", anEvent.key().string);
410 if (anEvent.key().string == 'KEY_ENTER') { 402 if (anEvent.key().string == 'KEY_ENTER') {
411 if (anEvent.target().nodeName != 'TEXTAREA') { 403 if (anEvent.target().nodeName != 'TEXTAREA') {
412 anEvent.preventDefault(); 404 anEvent.preventDefault();
413 this.handleMoveForward(); 405 this.handleMoveForward();
414 } 406 }
415 } else if (anEvent.key().string == 'KEY_TAB') { 407 } else if (anEvent.key().string == 'KEY_TAB') {
416 if (anEvent.target() == this.newUserCreationComponent().usernameElement()) { 408 if (anEvent.target() == this.newUserCreationComponent().usernameElement()) {
417 } else { 409 } else {
418 this.handleMoveForward(); 410 this.handleMoveForward();
419 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) { 411 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
420 anEvent.preventDefault(); 412 anEvent.preventDefault();
421 } 413 }
422 } 414 }
423 } else if ((anEvent.key().string == 'KEY_ARROW_RIGHT') && (anEvent.modifier().meta == true)) { 415 } else if ((anEvent.key().string == 'KEY_ARROW_RIGHT') && (anEvent.modifier().meta == true)) {
424 this.handleMoveForward(); 416 this.handleMoveForward();
425 } else if ((anEvent.key().string == 'KEY_ARROW_LEFT') && (anEvent.modifier().meta == true)) { 417 } else if ((anEvent.key().string == 'KEY_ARROW_LEFT') && (anEvent.modifier().meta == true)) {
426 this.handleMoveBackward(); 418 this.handleMoveBackward();
427 } else if (anEvent.key().string == 'KEY_ESCAPE') { 419 } else if (anEvent.key().string == 'KEY_ESCAPE') {
428 anEvent.stop(); 420 anEvent.stop();
429 this.handleExit(); 421 this.handleExit();
430 } else { 422 } else {
431 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'checkState')); 423 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'checkState'));
432 } 424 }
433 }, 425 },
434 426
435 //============================================================================= 427 //=============================================================================
436 428
437 'preformActualUserRegistration': function () { 429 'preformActualUserRegistration': function () {
438 vardeferredResult; 430 vardeferredResult;
439 431
440 deferredResult = new Clipperz.Async.Deferred("NewUSerWizardController.preformActualUserRegistration", {trace:false}); 432 deferredResult = new Clipperz.Async.Deferred("NewUSerWizardController.preformActualUserRegistration", {trace:false});
441 deferredResult.addMethod(this.newUserCreationComponent(), 'showProgressOnUserCreation'); 433 deferredResult.addMethod(this.newUserCreationComponent(), 'showProgressOnUserCreation');
442 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this.newUserCreationComponent(), 'passphrase')); 434 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this.newUserCreationComponent(), 'passphrase'));
443 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, 435 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount,
444 this.newUserCreationComponent().username(), 436 this.newUserCreationComponent().username(),
445 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase') 437 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')
446 ); 438 );
447 deferredResult.addMethod(this, 'setUser'); 439 deferredResult.addMethod(this, 'setUser');
448 deferredResult.addMethod(this.newUserCreationComponent(), 'showUserCreationDone'); 440 deferredResult.addMethod(this.newUserCreationComponent(), 'showUserCreationDone');
449 deferredResult.addMethod(this, 'setUserCreationState', 'DONE'); 441 deferredResult.addMethod(this, 'setUserCreationState', 'DONE');
450 442
451 // deferredResult.addErrback(MochiKit.Base.method(this.newUserCreationComponent(), 'showUserCreationFailed')); 443 // deferredResult.addErrback(MochiKit.Base.method(this.newUserCreationComponent(), 'showUserCreationFailed'));
452 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUser', null)); 444 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUser', null));
453 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUserCreationState', 'FAILED')); 445 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUserCreationState', 'FAILED'));
454 deferredResult.addErrback(MochiKit.Base.bind(function (aValue) { 446 deferredResult.addErrback(MochiKit.Base.bind(function (aValue) {
455 this.newUserCreationComponent().showUserCreationFailed(); 447 this.newUserCreationComponent().showUserCreationFailed();
456 this.setUser(null); 448 this.setUser(null);
457 this.setUserCreationState('FAILED'); 449 this.setUserCreationState('FAILED');
458 }, this)); 450 }, this));
459 deferredResult.callback(); 451 deferredResult.callback();
460 452
461 return deferredResult; 453 return deferredResult;
462 }, 454 },
463 455
464 //============================================================================= 456 //=============================================================================
465 __syntaxFix__: "syntax fix" 457 __syntaxFix__: "syntax fix"
466}); 458});