Diffstat (limited to 'frontend/delta/js/Clipperz/PM/UI/MainController.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/delta/js/Clipperz/PM/UI/MainController.js | 130 |
1 files changed, 111 insertions, 19 deletions
diff --git a/frontend/delta/js/Clipperz/PM/UI/MainController.js b/frontend/delta/js/Clipperz/PM/UI/MainController.js index da7540e..20ff041 100644 --- a/frontend/delta/js/Clipperz/PM/UI/MainController.js +++ b/frontend/delta/js/Clipperz/PM/UI/MainController.js | |||
@@ -1,255 +1,315 @@ | |||
1 | /* | 1 | /* |
2 | 2 | ||
3 | Copyright 2008-2013 Clipperz Srl | 3 | Copyright 2008-2013 Clipperz Srl |
4 | 4 | ||
5 | This file is part of Clipperz, the online password manager. | 5 | This file is part of Clipperz, the online password manager. |
6 | For further information about its features and functionalities please | 6 | For further information about its features and functionalities please |
7 | refer to http://www.clipperz.com. | 7 | refer to http://www.clipperz.com. |
8 | 8 | ||
9 | * Clipperz is free software: you can redistribute it and/or modify it | 9 | * Clipperz is free software: you can redistribute it and/or modify it |
10 | under the terms of the GNU Affero General Public License as published | 10 | under the terms of the GNU Affero General Public License as published |
11 | by the Free Software Foundation, either version 3 of the License, or | 11 | by the Free Software Foundation, either version 3 of the License, or |
12 | (at your option) any later version. | 12 | (at your option) any later version. |
13 | 13 | ||
14 | * Clipperz is distributed in the hope that it will be useful, but | 14 | * Clipperz is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of | 15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. | 17 | See the GNU Affero General Public License for more details. |
18 | 18 | ||
19 | * 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 |
20 | License along with Clipperz. If not, see http://www.gnu.org/licenses/. | 20 | License along with Clipperz. If not, see http://www.gnu.org/licenses/. |
21 | 21 | ||
22 | */ | 22 | */ |
23 | 23 | ||
24 | Clipperz.Base.module('Clipperz.PM.UI'); | 24 | Clipperz.Base.module('Clipperz.PM.UI'); |
25 | 25 | ||
26 | Clipperz.PM.UI.MainController = function() { | 26 | Clipperz.PM.UI.MainController = function() { |
27 | var pages; | 27 | var pages; |
28 | 28 | ||
29 | this._proxy = null; | 29 | // this._proxy = null; |
30 | this._user = null; | 30 | this._user = null; |
31 | this._filter= ''; | 31 | this._filter= ''; |
32 | 32 | ||
33 | //this._currentPage = 'loadingPage'; | 33 | //this._currentPage = 'loadingPage'; |
34 | 34 | ||
35 | this._pageStack = ['loadingPage']; | 35 | this._pageStack = ['loadingPage']; |
36 | this._overlay = new Clipperz.PM.UI.Components.Overlay(); | 36 | this._overlay = new Clipperz.PM.UI.Components.Overlay(); |
37 | pages = { | 37 | pages = { |
38 | 'loginPage': new Clipperz.PM.UI.Components.LoginForm(), | 38 | 'loginPage': new Clipperz.PM.UI.Components.LoginForm(), |
39 | 'registrationPage':new Clipperz.PM.UI.Components.RegistrationWizard(), | 39 | 'registrationPage':new Clipperz.PM.UI.Components.RegistrationWizard(), |
40 | 'cardListPage': new Clipperz.PM.UI.Components.CardList(), | 40 | 'cardListPage': new Clipperz.PM.UI.Components.CardList(), |
41 | 'cardDetailPage':new Clipperz.PM.UI.Components.CardDetail({card: {}}), | 41 | 'cardDetailPage':new Clipperz.PM.UI.Components.CardDetail({card: {}}), |
42 | 'preferencePage':new Clipperz.PM.UI.Components.PreferencePage(), | ||
42 | 'errorPage': new Clipperz.PM.UI.Components.ErrorPage({message:''}) | 43 | 'errorPage': new Clipperz.PM.UI.Components.ErrorPage({message:''}) |
43 | }; | 44 | }; |
44 | 45 | ||
45 | MochiKit.Base.map(function (anId) {React.renderComponent(pages[anId], MochiKit.DOM.getElement(anId))}, MochiKit.Base.keys(pages)); | 46 | MochiKit.Base.map(function (anId) {React.renderComponent(pages[anId], MochiKit.DOM.getElement(anId))}, MochiKit.Base.keys(pages)); |
46 | this._pages = pages; | 47 | this._pages = pages; |
47 | this.registerForNotificationCenterEvents(); | 48 | this.registerForNotificationCenterEvents(); |
49 | MochiKit.Signal.connect(MochiKit.DOM.currentDocument(), 'onselectionchange', this, 'selectionChangeHandler'); | ||
48 | 50 | ||
49 | return this; | 51 | return this; |
50 | } | 52 | } |
51 | 53 | ||
52 | MochiKit.Base.update(Clipperz.PM.UI.MainController.prototype, { | 54 | MochiKit.Base.update(Clipperz.PM.UI.MainController.prototype, { |
53 | 55 | ||
54 | toString: function () { | 56 | toString: function () { |
55 | return "Clipperz.PM.UI.MainController"; | 57 | return "Clipperz.PM.UI.MainController"; |
56 | }, | 58 | }, |
57 | 59 | ||
58 | //========================================================================= | 60 | //========================================================================= |
59 | 61 | ||
60 | overlay: function () { | 62 | overlay: function () { |
61 | return this._overlay; | 63 | return this._overlay; |
62 | }, | 64 | }, |
63 | 65 | ||
64 | loginForm: function () { | 66 | loginForm: function () { |
65 | return this._loginForm; | 67 | return this._loginForm; |
66 | }, | 68 | }, |
67 | 69 | ||
68 | registrationWizard: function () { | 70 | registrationWizard: function () { |
69 | return this._registrationWizard; | 71 | return this._registrationWizard; |
70 | }, | 72 | }, |
71 | 73 | ||
72 | //========================================================================= | 74 | //========================================================================= |
73 | 75 | ||
74 | isOnline: function() { | 76 | isOnline: function() { |
75 | return navigator.onLine; | 77 | return navigator.onLine; |
78 | // return false; | ||
76 | }, | 79 | }, |
77 | 80 | ||
78 | hasLocalData: function() { | 81 | hasLocalData: function() { |
79 | return false; | 82 | // return false; |
83 | return (Clipperz.PM.DataModel.devicePreferences.accountData() != null); | ||
80 | }, | 84 | }, |
81 | 85 | ||
82 | loginMode: function () { | 86 | loginMode: function () { |
83 | //PIN is set using this command: | 87 | //PIN is set using this command: |
84 | //Clipperz.PM.PIN.setCredentialsWithPIN('1234', {'username':'joe', 'passphrase':'clipperz'}); | 88 | //Clipperz.PM.PIN.setCredentialsWithPIN('1234', {'username':'joe', 'passphrase':'clipperz'}); |
85 | 89 | ||
86 | return Clipperz.PM.PIN.isSet() ? 'PIN' : 'CREDENTIALS'; | 90 | return Clipperz.PM.PIN.isSet() ? 'PIN' : 'CREDENTIALS'; |
87 | }, | 91 | }, |
88 | 92 | ||
89 | //========================================================================= | 93 | //========================================================================= |
90 | 94 | ||
91 | pages: function () { | 95 | pages: function () { |
92 | return this._pages; | 96 | return this._pages; |
93 | }, | 97 | }, |
94 | 98 | ||
95 | pageStack: function () { | 99 | pageStack: function () { |
96 | return this._pageStack; | 100 | return this._pageStack; |
97 | }, | 101 | }, |
98 | 102 | ||
99 | //========================================================================= | 103 | //========================================================================= |
100 | 104 | ||
105 | showOfflineError: function () { | ||
106 | console.log("THE BROWSER IS OFFLINE"); | ||
107 | }, | ||
108 | |||
101 | selectInitialProxy: function () { | 109 | selectInitialProxy: function () { |
102 | if (this.isOnline()) { | 110 | if (this.isOnline()) { |
103 | this._proxy = Clipperz.PM.Proxy.defaultProxy; | 111 | // this._proxy = Clipperz.PM.Proxy.defaultProxy; |
104 | } else { | 112 | } else { |
105 | if (this.hasLocalData()) { | 113 | if (this.hasLocalData()) { |
106 | this._proxy = new Clipperz.PM.Proxy.Offline({dataStore: new Clipperz.PM.Proxy.Offline.LocalStorageDataStore(), shouldPayTolls:false}); | 114 | // this._proxy = new Clipperz.PM.Proxy.Offline({dataStore: new Clipperz.PM.Proxy.Offline.LocalStorageDataStore(), shouldPayTolls:false}); |
115 | Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.Offline({dataStore: new Clipperz.PM.Proxy.Offline.LocalStorageDataStore(), shouldPayTolls:false}); | ||
107 | } else { | 116 | } else { |
108 | this.showOfflineError(); | 117 | this.showOfflineError(); |
109 | } | 118 | } |
110 | } | 119 | } |
111 | }, | 120 | }, |
112 | 121 | ||
113 | proxy: function () { | 122 | //proxy: function () { |
114 | return this._proxy; | 123 | // return this._proxy; |
115 | }, | 124 | //}, |
116 | 125 | ||
117 | //========================================================================= | 126 | //========================================================================= |
118 | 127 | ||
119 | registerForNotificationCenterEvents: function () { | 128 | registerForNotificationCenterEvents: function () { |
120 | var events= ['doLogin', 'registerNewUser', 'showRegistrationForm', 'goBack', 'showRecord', 'searchCards', 'runDirectLogin']; | 129 | var events= [ |
130 | 'doLogin', | ||
131 | 'registerNewUser', | ||
132 | 'showRegistrationForm', | ||
133 | 'goBack', | ||
134 | 'showRecord', | ||
135 | 'searchCards', | ||
136 | 'showPreferences', | ||
137 | 'runDirectLogin', | ||
138 | 'synchronizeLocalData' | ||
139 | ]; | ||
121 | var self= this; | 140 | var self= this; |
122 | 141 | ||
123 | MochiKit.Base.map(function (anEvent) { | 142 | MochiKit.Base.map(function (anEvent) { |
124 | MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, anEvent, MochiKit.Base.method(self, anEvent)); | 143 | MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, anEvent, MochiKit.Base.method(self, anEvent)); |
125 | }, events); | 144 | }, events); |
126 | 145 | ||
127 | // MochiKit.Signal.connect(window, 'onpopstate', MochiKit.Base.method(this, 'historyGoBack')); | 146 | // MochiKit.Signal.connect(window, 'onpopstate', MochiKit.Base.method(this, 'historyGoBack')); |
128 | MochiKit.Signal.connect(window, 'onbeforeunload',MochiKit.Base.method(this, 'shouldExitApp')); | 147 | MochiKit.Signal.connect(window, 'onbeforeunload',MochiKit.Base.method(this, 'shouldExitApp')); |
129 | }, | 148 | }, |
130 | 149 | ||
131 | //------------------------------------------------------------------------- | 150 | //------------------------------------------------------------------------- |
132 | 151 | ||
152 | selectionChangeHandler: function (anEvent) { | ||
153 | varselection; | ||
154 | varselectionRange; | ||
155 | varselectionNode; | ||
156 | varvalueElement; | ||
157 | //other hints: http://www.bearpanther.com/2013/05/27/easy-text-selection-in-mobile-safari/ | ||
158 | //SELECTION: https://developer.mozilla.org/en-US/docs/Web/API/Selection | ||
159 | //RANGE: https://developer.mozilla.org/en-US/docs/Web/API/Range | ||
160 | //NODE TYPES: https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType | ||
161 | |||
162 | selection = MochiKit.DOM.currentWindow().getSelection(); | ||
163 | //console.log("-- selection", selection); | ||
164 | selectionRange = selection.getRangeAt(0); | ||
165 | selectionNode = selectionRange.startContainer.childNodes[selectionRange.startOffset]; | ||
166 | //console.log("-- selectionNode", selectionNode); | ||
167 | |||
168 | if (selectionNode != undefined) { | ||
169 | valueElement = MochiKit.DOM.getFirstElementByTagAndClassName('*', 'value', selectionNode); | ||
170 | //console.log("-- valueElement", valueElement); | ||
171 | } | ||
172 | |||
173 | if ((valueElement != null) && (valueElement != selectionNode)) { | ||
174 | var range; | ||
175 | range = MochiKit.DOM.currentDocument().createRange(); | ||
176 | range.selectNodeContents(valueElement); | ||
177 | selection.removeAllRanges(); | ||
178 | selection.addRange(range); | ||
179 | |||
180 | anEvent.preventDefault(); | ||
181 | anEvent.stopPropagation(); | ||
182 | |||
183 | //console.log("updated selection", MochiKit.DOM.currentWindow().getSelection()); | ||
184 | } | ||
185 | //console.log("-----------"); | ||
186 | }, | ||
187 | |||
188 | //------------------------------------------------------------------------- | ||
189 | |||
133 | run: function (parameters) { | 190 | run: function (parameters) { |
134 | var shouldShowRegistrationForm; | 191 | var shouldShowRegistrationForm; |
192 | varcanRegisterNewUsers; | ||
193 | |||
194 | canRegisterNewUsers = Clipperz.PM.Proxy.defaultProxy.canRegisterNewUsers(); | ||
135 | 195 | ||
136 | this.selectInitialProxy(); | 196 | this.selectInitialProxy(); |
137 | shouldShowRegistrationForm = parameters['shouldShowRegistrationForm'] && this.proxy().canRegisterNewUsers(); | 197 | shouldShowRegistrationForm = parameters['shouldShowRegistrationForm'] && canRegisterNewUsers; |
138 | this.pages()['loginPage'].setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable': this.proxy().canRegisterNewUsers()}); | 198 | this.pages()['loginPage'].setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable':canRegisterNewUsers}); |
139 | 199 | ||
140 | if (shouldShowRegistrationForm) { | 200 | if (shouldShowRegistrationForm) { |
141 | this.showRegistrationForm(); | 201 | this.showRegistrationForm(); |
142 | } else { | 202 | } else { |
143 | this.showLoginForm(); | 203 | this.showLoginForm(); |
144 | } | 204 | } |
145 | this.overlay().done("", 0.5); | 205 | this.overlay().done("", 0.5); |
146 | }, | 206 | }, |
147 | 207 | ||
148 | //------------------------------------------------------------------------- | 208 | //------------------------------------------------------------------------- |
149 | 209 | ||
150 | showLoginForm: function () { | 210 | showLoginForm: function () { |
151 | varloginFormPage; | 211 | varloginFormPage; |
152 | 212 | ||
153 | loginFormPage = this.pages()['loginPage']; | 213 | loginFormPage = this.pages()['loginPage']; |
154 | loginFormPage.setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable': this.proxy().canRegisterNewUsers()}); | 214 | loginFormPage.setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable':Clipperz.PM.Proxy.defaultProxy.canRegisterNewUsers()}); |
155 | this.moveInPage(this.currentPage(), 'loginPage'); | 215 | this.moveInPage(this.currentPage(), 'loginPage'); |
156 | MochiKit.Async.callLater(0.5, MochiKit.Base.method(loginFormPage, 'setInitialFocus')); | 216 | MochiKit.Async.callLater(0.5, MochiKit.Base.method(loginFormPage, 'setInitialFocus')); |
157 | }, | 217 | }, |
158 | 218 | ||
159 | showRegistrationForm: function () { | 219 | showRegistrationForm: function () { |
160 | var currentPage; | 220 | var currentPage; |
161 | varregistrationPage; | 221 | varregistrationPage; |
162 | 222 | ||
163 | currentPage = this.currentPage(); | 223 | currentPage = this.currentPage(); |
164 | registrationPage = this.pages()['registrationPage']; | 224 | registrationPage = this.pages()['registrationPage']; |
165 | this.setCurrentPage('loginPage'); | 225 | this.setCurrentPage('loginPage'); |
166 | registrationPage.setProps({}); | 226 | registrationPage.setProps({}); |
167 | this.moveInPage(currentPage, 'registrationPage'); | 227 | this.moveInPage(currentPage, 'registrationPage'); |
168 | MochiKit.Async.callLater(0.5, MochiKit.Base.method(registrationPage, 'setInitialFocus')); | 228 | MochiKit.Async.callLater(0.5, MochiKit.Base.method(registrationPage, 'setInitialFocus')); |
169 | }, | 229 | }, |
170 | 230 | ||
171 | //========================================================================= | 231 | //========================================================================= |
172 | 232 | ||
173 | doLogin: function (event) { | 233 | doLogin: function (event) { |
174 | varcredentials; | 234 | varcredentials; |
175 | var getPassphraseDelegate; | 235 | var getPassphraseDelegate; |
176 | varuser; | 236 | varuser; |
177 | 237 | ||
178 | user = null; | 238 | user = null; |
179 | 239 | ||
180 | this.overlay().show("logging in"); | 240 | this.overlay().show("logging in"); |
181 | this.pages()['loginPage'].setProps({disabled:true}); | 241 | this.pages()['loginPage'].setProps({disabled:true}); |
182 | 242 | ||
183 | if ('pin' in event) { | 243 | if ('pin' in event) { |
184 | credentials = Clipperz.PM.PIN.credentialsWithPIN(event['pin']); | 244 | credentials = Clipperz.PM.PIN.credentialsWithPIN(event['pin']); |
185 | } else { | 245 | } else { |
186 | credentials = event; | 246 | credentials = event; |
187 | } | 247 | } |
188 | getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, credentials.passphrase); | 248 | getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, credentials.passphrase); |
189 | user = new Clipperz.PM.DataModel.User({'username':credentials.username, 'getPassphraseFunction':getPassphraseDelegate}); | 249 | user = new Clipperz.PM.DataModel.User({'username':credentials.username, 'getPassphraseFunction':getPassphraseDelegate}); |
190 | 250 | ||
191 | deferredResult = new Clipperz.Async.Deferred('MainController.doLogin', {trace:false}); | 251 | deferredResult = new Clipperz.Async.Deferred('MainController.doLogin', {trace:false}); |
192 | deferredResult.addCallback(MochiKit.Async.wait, 0.1); | 252 | deferredResult.addCallback(MochiKit.Async.wait, 0.1); |
193 | deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); | 253 | deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); |
194 | deferredResult.addMethod(user, 'login'); | 254 | deferredResult.addMethod(user, 'login'); |
195 | deferredResult.addMethod(Clipperz.PM.PIN, 'resetFailedAttemptCount'); | 255 | deferredResult.addMethod(Clipperz.PM.PIN, 'resetFailedAttemptCount'); |
196 | deferredResult.addMethod(this, 'setUser', user); | 256 | deferredResult.addMethod(this, 'setUser', user); |
197 | 257 | ||
198 | // deferredResult.addMethod(this, 'setupApplication'); | 258 | // deferredResult.addMethod(this, 'setupApplication'); |
199 | deferredResult.addMethod(this, 'runApplication'); | 259 | deferredResult.addMethod(this, 'runApplication'); |
200 | deferredResult.addMethod(this.overlay(), 'done', "", 1); | 260 | deferredResult.addMethod(this.overlay(), 'done', "", 1); |
201 | deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event)); | 261 | deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event)); |
202 | deferredResult.addErrback(MochiKit.Base.bind(function (anEvent, anError) { | 262 | deferredResult.addErrback(MochiKit.Base.bind(function (anEvent, anError) { |
203 | if (anError['isPermanent'] != true) { | 263 | if (anError['isPermanent'] != true) { |
204 | this.pages()['loginPage'].setProps({disabled:false, 'mode':this.loginMode()}); | 264 | this.pages()['loginPage'].setProps({disabled:false, 'mode':this.loginMode()}); |
205 | this.pages()['loginPage'].setInitialFocus(); | 265 | this.pages()['loginPage'].setInitialFocus(); |
206 | } | 266 | } |
207 | return anError; | 267 | return anError; |
208 | }, this, event)) | 268 | }, this, event)) |
209 | deferredResult.callback(); | 269 | deferredResult.callback(); |
210 | 270 | ||
211 | return deferredResult; | 271 | return deferredResult; |
212 | }, | 272 | }, |
213 | 273 | ||
214 | //------------------------------------------------------------------------- | 274 | //------------------------------------------------------------------------- |
215 | 275 | ||
216 | registerNewUser: function (credentials) { | 276 | registerNewUser: function (credentials) { |
217 | vardeferredResult; | 277 | vardeferredResult; |
218 | 278 | ||
219 | this.overlay().show("creating user"); | 279 | this.overlay().show("creating user"); |
220 | 280 | ||
221 | this.pages()['registrationPage'].setProps({disabled:true}); | 281 | this.pages()['registrationPage'].setProps({disabled:true}); |
222 | deferredResult = new Clipperz.Async.Deferred('MainController.registerNewUser', {trace:false}); | 282 | deferredResult = new Clipperz.Async.Deferred('MainController.registerNewUser', {trace:false}); |
223 | deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, | 283 | deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, |
224 | credentials['username'], | 284 | credentials['username'], |
225 | MochiKit.Base.partial(MochiKit.Async.succeed, credentials['passphrase']) | 285 | MochiKit.Base.partial(MochiKit.Async.succeed, credentials['passphrase']) |
226 | ); | 286 | ); |
227 | deferredResult.addMethod(this, 'doLogin', credentials); | 287 | deferredResult.addMethod(this, 'doLogin', credentials); |
228 | deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event)); | 288 | deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event)); |
229 | deferredResult.addErrback(MochiKit.Base.bind(function (anError) { | 289 | deferredResult.addErrback(MochiKit.Base.bind(function (anError) { |
230 | if (anError['isPermanent'] != true) { | 290 | if (anError['isPermanent'] != true) { |
231 | this.pages()['registrationPage'].setProps({disabled:false}); | 291 | this.pages()['registrationPage'].setProps({disabled:false}); |
232 | this.pages()['registrationPage'].setInitialFocus(); | 292 | this.pages()['registrationPage'].setInitialFocus(); |
233 | } | 293 | } |
234 | return anError; | 294 | return anError; |
235 | }, this)); | 295 | }, this)); |
236 | 296 | ||
237 | deferredResult.callback(); | 297 | deferredResult.callback(); |
238 | 298 | ||
239 | return deferredResult; | 299 | return deferredResult; |
240 | 300 | ||
241 | }, | 301 | }, |
242 | 302 | ||
243 | //------------------------------------------------------------------------- | 303 | //------------------------------------------------------------------------- |
244 | 304 | ||
245 | user: function () { | 305 | user: function () { |
246 | return this._user; | 306 | return this._user; |
247 | }, | 307 | }, |
248 | 308 | ||
249 | setUser: function (aUser) { | 309 | setUser: function (aUser) { |
250 | this._user = aUser; | 310 | this._user = aUser; |
251 | return this._user; | 311 | return this._user; |
252 | }, | 312 | }, |
253 | 313 | ||
254 | //========================================================================= | 314 | //========================================================================= |
255 | 315 | ||
@@ -278,143 +338,156 @@ MochiKit.Base.update(Clipperz.PM.UI.MainController.prototype, { | |||
278 | var filter; | 338 | var filter; |
279 | varfilterRegExp; | 339 | varfilterRegExp; |
280 | varresult; | 340 | varresult; |
281 | 341 | ||
282 | filter = this.filter().replace(/[^A-Za-z0-9]/g, "\\$&"); | 342 | filter = this.filter().replace(/[^A-Za-z0-9]/g, "\\$&"); |
283 | filterRegExp = new RegExp(filter, "i"); | 343 | filterRegExp = new RegExp(filter, "i"); |
284 | result = MochiKit.Base.filter(function (aCardInfo) { return filterRegExp.test(aCardInfo['_searchableContent'])}, someCardInfo); | 344 | result = MochiKit.Base.filter(function (aCardInfo) { return filterRegExp.test(aCardInfo['_searchableContent'])}, someCardInfo); |
285 | 345 | ||
286 | return result; | 346 | return result; |
287 | }, | 347 | }, |
288 | 348 | ||
289 | sortCards: function (someCardInfo) { | 349 | sortCards: function (someCardInfo) { |
290 | return someCardInfo.sort(Clipperz.Base.caseInsensitiveKeyComparator('label')); | 350 | return someCardInfo.sort(Clipperz.Base.caseInsensitiveKeyComparator('label')); |
291 | }, | 351 | }, |
292 | 352 | ||
293 | showRecordList: function () { | 353 | showRecordList: function () { |
294 | var deferredResult; | 354 | var deferredResult; |
295 | 355 | ||
296 | deferredResult = new Clipperz.Async.Deferred('MainController.showRecordList', {trace:false}); | 356 | deferredResult = new Clipperz.Async.Deferred('MainController.showRecordList', {trace:false}); |
297 | deferredResult.addMethod(this, 'allCardInfo'); | 357 | deferredResult.addMethod(this, 'allCardInfo'); |
298 | deferredResult.addMethod(this, 'filterCards'); | 358 | deferredResult.addMethod(this, 'filterCards'); |
299 | deferredResult.addMethod(this, 'sortCards'); | 359 | deferredResult.addMethod(this, 'sortCards'); |
300 | deferredResult.addCallback(MochiKit.Base.bind(function (someRecordInfo) { | 360 | deferredResult.addCallback(MochiKit.Base.bind(function (someRecordInfo) { |
301 | this.pages()['cardListPage'].setProps({cardList: someRecordInfo}); | 361 | this.pages()['cardListPage'].setProps({cardList: someRecordInfo}); |
302 | }, this)); | 362 | }, this)); |
303 | deferredResult.callback(); | 363 | deferredResult.callback(); |
304 | 364 | ||
305 | return deferredResult; | 365 | return deferredResult; |
306 | }, | 366 | }, |
307 | 367 | ||
308 | filter: function (){ | 368 | filter: function (){ |
309 | return this._filter; | 369 | return this._filter; |
310 | }, | 370 | }, |
311 | 371 | ||
312 | setFilter: function (aValue) { | 372 | setFilter: function (aValue) { |
313 | this._filter = aValue; | 373 | this._filter = aValue; |
314 | }, | 374 | }, |
315 | 375 | ||
316 | searchCards: function (someParameters) { | 376 | searchCards: function (someParameters) { |
317 | //console.log("SEARCH CARDS", someParameters); | 377 | //console.log("SEARCH CARDS", someParameters); |
318 | this.setFilter(someParameters); | 378 | this.setFilter(someParameters); |
319 | this.showRecordList(); | 379 | this.showRecordList(); |
320 | }, | 380 | }, |
321 | 381 | ||
322 | //========================================================================= | 382 | //========================================================================= |
323 | 383 | ||
324 | runApplication: function () { | 384 | runApplication: function () { |
325 | MochiKit.Signal.connect(window, 'onpopstate',MochiKit.Base.method(this, 'historyGoBack')); | 385 | MochiKit.Signal.connect(window, 'onpopstate',MochiKit.Base.method(this, 'historyGoBack')); |
386 | /// TODO: remove this TEST HACK | ||
326 | this.moveInPage(this.currentPage(), 'cardListPage'); | 387 | this.moveInPage(this.currentPage(), 'cardListPage'); |
327 | return this.showRecordList(); | 388 | return this.showRecordList(); |
389 | |||
390 | // this.moveInPage(this.currentPage(), 'preferencePage'); | ||
328 | }, | 391 | }, |
329 | 392 | ||
330 | showRecord: function (aRecordReference) { | 393 | showRecord: function (aRecordReference) { |
331 | //console.log("Show Record", aRecordReference); | 394 | //console.log("Show Record", aRecordReference); |
332 | vardeferredResult; | 395 | vardeferredResult; |
333 | 396 | ||
334 | this.pages()['cardListPage'].setProps({selectedCard:aRecordReference}); | 397 | this.pages()['cardListPage'].setProps({selectedCard:aRecordReference}); |
335 | deferredResult = new Clipperz.Async.Deferred('MainController.runApplication', {trace:false}); | 398 | deferredResult = new Clipperz.Async.Deferred('MainController.runApplication', {trace:false}); |
336 | // deferredResult.addMethod(this.user(), 'getRecord', aRecordReference['_reference']); | ||
337 | deferredResult.addMethod(this.user(), 'getRecord', aRecordReference); | 399 | deferredResult.addMethod(this.user(), 'getRecord', aRecordReference); |
338 | deferredResult.addMethodcaller('content'); | 400 | deferredResult.addMethodcaller('content'); |
339 | deferredResult.addCallback(MochiKit.Base.bind(function (aCard) { | 401 | deferredResult.addCallback(MochiKit.Base.bind(function (aCard) { |
340 | //console.log("CARD DETAILS", aCard); | 402 | //console.log("CARD DETAILS", aCard); |
341 | this.pages()['cardDetailPage'].setProps({card: aCard}); | 403 | this.pages()['cardDetailPage'].setProps({card: aCard}); |
342 | this.pages()['cardListPage'].setProps({selectedCard: null}); | 404 | this.pages()['cardListPage'].setProps({selectedCard: null}); |
343 | }, this)); | 405 | }, this)); |
344 | deferredResult.addMethod(this, 'moveInPage', this.currentPage(), 'cardDetailPage', true); | 406 | deferredResult.addMethod(this, 'moveInPage', this.currentPage(), 'cardDetailPage', true); |
345 | deferredResult.callback(); | 407 | deferredResult.callback(); |
346 | 408 | ||
347 | return deferredResult; | 409 | return deferredResult; |
348 | }, | 410 | }, |
349 | 411 | ||
350 | runDirectLogin: function (someParameters) { | 412 | runDirectLogin: function (someParameters) { |
351 | console.log("RUN DIRECT LOGIN", someParameters); | 413 | //console.log("RUN DIRECT LOGIN", someParameters); |
352 | vardeferredResult; | 414 | vardeferredResult; |
353 | 415 | ||
354 | // this.pages()['cardListPage'].setProps({selectedCard:aRecordReference}); | ||
355 | deferredResult = new Clipperz.Async.Deferred('MainController.runDirectLogin', {trace:false}); | 416 | deferredResult = new Clipperz.Async.Deferred('MainController.runDirectLogin', {trace:false}); |
356 | // deferredResult.addMethod(this.user(), 'getRecord', aRecordReference['_reference']); | ||
357 | deferredResult.addMethod(this.user(), 'getRecord', someParameters['record']); | 417 | deferredResult.addMethod(this.user(), 'getRecord', someParameters['record']); |
358 | deferredResult.addMethodcaller('directLoginWithReference', someParameters['directLogin']); | 418 | deferredResult.addMethodcaller('directLoginWithReference', someParameters['directLogin']); |
359 | deferredResult.addCallback(Clipperz.PM.UI.DirectLoginRunner.openDirectLogin); | 419 | deferredResult.addCallback(Clipperz.PM.UI.DirectLoginRunner.openDirectLogin); |
360 | deferredResult.callback(); | 420 | deferredResult.callback(); |
361 | 421 | ||
362 | return deferredResult; | 422 | return deferredResult; |
363 | }, | 423 | }, |
364 | 424 | ||
365 | shouldExitApp: function (anEvent) { | 425 | shouldExitApp: function (anEvent) { |
366 | console.log("SHOULD EXIT APP"); | 426 | //console.log("SHOULD EXIT APP"); |
367 | anEvent.preventDefault(); | 427 | anEvent.preventDefault(); |
368 | anEvent.stopPropagation(); | 428 | anEvent.stopPropagation(); |
369 | }, | 429 | }, |
370 | 430 | ||
371 | //========================================================================= | 431 | //========================================================================= |
372 | 432 | ||
433 | showPreferences: function (anEvent) { | ||
434 | vardeferredResult; | ||
435 | |||
436 | this.pages()['preferencePage'].setProps({}); | ||
437 | deferredResult = new Clipperz.Async.Deferred('MainController.showPreferences', {trace:false}); | ||
438 | deferredResult.addMethod(this, 'moveInPage', this.currentPage(), 'preferencePage', true); | ||
439 | deferredResult.callback(); | ||
440 | |||
441 | return deferredResult; | ||
442 | }, | ||
443 | |||
444 | //========================================================================= | ||
445 | |||
373 | genericErrorHandler: function (anEvent, anError) { | 446 | genericErrorHandler: function (anEvent, anError) { |
374 | var errorMessage; | 447 | var errorMessage; |
375 | varresult; | 448 | varresult; |
376 | 449 | ||
377 | result = anError; | 450 | result = anError; |
378 | errorMessage = "login failed"; | 451 | errorMessage = "login failed"; |
379 | 452 | ||
380 | if (anError['isPermanent'] === true) { | 453 | if (anError['isPermanent'] === true) { |
381 | this.pages()['errorPage'].setProps({message:anError.message}); | 454 | this.pages()['errorPage'].setProps({message:anError.message}); |
382 | this.moveInPage(this.currentPage(), 'errorPage'); | 455 | this.moveInPage(this.currentPage(), 'errorPage'); |
383 | errorMessage = "failure"; | 456 | errorMessage = "failure"; |
384 | } else { | 457 | } else { |
385 | if ('pin' in anEvent) { | 458 | if ('pin' in anEvent) { |
386 | errorCount = Clipperz.PM.PIN.recordFailedAttempt(); | 459 | errorCount = Clipperz.PM.PIN.recordFailedAttempt(); |
387 | if (errorCount == -1) { | 460 | if (errorCount == -1) { |
388 | errorMessage = "PIN resetted"; | 461 | errorMessage = "PIN resetted"; |
389 | } | 462 | } |
390 | } | 463 | } |
391 | } | 464 | } |
392 | this.overlay().failed(errorMessage, 1); | 465 | this.overlay().failed(errorMessage, 1); |
393 | 466 | ||
394 | return result; | 467 | return result; |
395 | }, | 468 | }, |
396 | 469 | ||
397 | //========================================================================= | 470 | //========================================================================= |
398 | 471 | ||
399 | slidePage: function (fromPage, toPage, direction) { | 472 | slidePage: function (fromPage, toPage, direction) { |
400 | varfromPosition; | 473 | varfromPosition; |
401 | var toPosition; | 474 | var toPosition; |
402 | 475 | ||
403 | if (direction == "LEFT") { | 476 | if (direction == "LEFT") { |
404 | fromPosition = 'right'; | 477 | fromPosition = 'right'; |
405 | toPosition = 'left' | 478 | toPosition = 'left' |
406 | } else { | 479 | } else { |
407 | fromPosition = 'left'; | 480 | fromPosition = 'left'; |
408 | toPosition = 'right' | 481 | toPosition = 'right' |
409 | } | 482 | } |
410 | 483 | ||
411 | MochiKit.DOM.addElementClass(fromPage, toPosition + ' transition'); | 484 | MochiKit.DOM.addElementClass(fromPage, toPosition + ' transition'); |
412 | 485 | ||
413 | MochiKit.DOM.addElementClass(toPage, fromPosition); | 486 | MochiKit.DOM.addElementClass(toPage, fromPosition); |
414 | MochiKit.DOM.removeElementClass(toPage, toPosition); | 487 | MochiKit.DOM.removeElementClass(toPage, toPosition); |
415 | MochiKit.DOM.addElementClass(toPage, 'transition'); | 488 | MochiKit.DOM.addElementClass(toPage, 'transition'); |
416 | MochiKit.Async.callLater(0.1, function () { | 489 | MochiKit.Async.callLater(0.1, function () { |
417 | MochiKit.DOM.removeElementClass(toPage, fromPosition); | 490 | MochiKit.DOM.removeElementClass(toPage, fromPosition); |
418 | }) | 491 | }) |
419 | 492 | ||
420 | MochiKit.Async.callLater(0.5, function () { | 493 | MochiKit.Async.callLater(0.5, function () { |
@@ -435,57 +508,76 @@ console.log("SHOULD EXIT APP"); | |||
435 | var toPage; | 508 | var toPage; |
436 | 509 | ||
437 | fromPage = this.pageStack().shift(); | 510 | fromPage = this.pageStack().shift(); |
438 | toPage = this.currentPage(); | 511 | toPage = this.currentPage(); |
439 | this.pages()[toPage].setProps({}); | 512 | this.pages()[toPage].setProps({}); |
440 | this.moveOutPage(fromPage, toPage); | 513 | this.moveOutPage(fromPage, toPage); |
441 | }, | 514 | }, |
442 | 515 | ||
443 | historyGoBack: function (anEvent) { | 516 | historyGoBack: function (anEvent) { |
444 | anEvent.preventDefault(); | 517 | anEvent.preventDefault(); |
445 | anEvent.stopPropagation(); | 518 | anEvent.stopPropagation(); |
446 | this.goBack(); | 519 | this.goBack(); |
447 | }, | 520 | }, |
448 | 521 | ||
449 | currentPage: function () { | 522 | currentPage: function () { |
450 | return this.pageStack()[0]; | 523 | return this.pageStack()[0]; |
451 | }, | 524 | }, |
452 | 525 | ||
453 | setCurrentPage: function (aPage) { | 526 | setCurrentPage: function (aPage) { |
454 | this.pageStack().unshift(aPage); | 527 | this.pageStack().unshift(aPage); |
455 | }, | 528 | }, |
456 | 529 | ||
457 | moveInPage: function (fromPage, toPage, addToHistory) { | 530 | moveInPage: function (fromPage, toPage, addToHistory) { |
458 | varshouldAddItemToHistory; | 531 | varshouldAddItemToHistory; |
459 | 532 | ||
460 | shouldAddItemToHistory = typeof(addToHistory) == 'undefined' ? false : addToHistory; | 533 | shouldAddItemToHistory = typeof(addToHistory) == 'undefined' ? false : addToHistory; |
461 | 534 | ||
462 | this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'LEFT'); | 535 | this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'LEFT'); |
463 | this.setCurrentPage(toPage); | 536 | this.setCurrentPage(toPage); |
464 | 537 | ||
465 | if (shouldAddItemToHistory) { | 538 | if (shouldAddItemToHistory) { |
466 | //console.log("ADD ITEM TO HISTORY"); | 539 | //console.log("ADD ITEM TO HISTORY"); |
467 | //console.log("ADD ITEM TO HISTORY - window", window); | 540 | //console.log("ADD ITEM TO HISTORY - window", window); |
468 | //console.log("ADD ITEM TO HISTORY - window.history", window.history); | 541 | //console.log("ADD ITEM TO HISTORY - window.history", window.history); |
469 | window.history.pushState({'fromPage': fromPage, 'toPage': toPage}); | 542 | window.history.pushState({'fromPage': fromPage, 'toPage': toPage}); |
470 | //# window.history.pushState(); | 543 | //# window.history.pushState(); |
471 | //console.log("ADDED ITEM TO HISTORY"); | 544 | //console.log("ADDED ITEM TO HISTORY"); |
472 | } else { | 545 | } else { |
473 | //console.log("Skip HISTORY"); | 546 | //console.log("Skip HISTORY"); |
474 | } | 547 | } |
475 | }, | 548 | }, |
476 | 549 | ||
477 | moveOutPage: function (fromPage, toPage) { | 550 | moveOutPage: function (fromPage, toPage) { |
478 | this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'RIGHT'); | 551 | this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'RIGHT'); |
479 | this.setCurrentPage(toPage); | 552 | this.setCurrentPage(toPage); |
480 | }, | 553 | }, |
481 | 554 | ||
482 | //========================================================================= | 555 | //========================================================================= |
556 | |||
557 | synchronizeLocalData: function (anEvent) { | ||
558 | vardeferredResult; | ||
559 | |||
560 | deferredResult = new Clipperz.Async.Deferred('MainController.synchronizeLocalData', {trace:true}); | ||
561 | // deferredResult.addMethod(this.proxy(), 'message', 'downloadAccountData', {}); | ||
562 | deferredResult.addMethod(this.user().connection(), 'message', 'downloadAccountData', {}); | ||
563 | deferredResult.addCallback(function (aResult) { | ||
564 | Clipperz.PM.DataModel.devicePreferences.setAccountDataWityResponse(aResult); | ||
565 | // localStorage.setItem('clipperz_dump_data', aResult['data']); | ||
566 | // localStorage.setItem('clipperz_dump_version', aResult['version']); | ||
567 | // localStorage.setItem('clipperz_dump_date', new Date()); | ||
568 | }) | ||
569 | deferredResult.callback(); | ||
570 | |||
571 | return deferredResult; | ||
572 | }, | ||
573 | |||
574 | //========================================================================= | ||
483 | /* | 575 | /* |
484 | wrongAppVersion: function (anError) { | 576 | wrongAppVersion: function (anError) { |
485 | // this.pages()['errorPage'].setProps({message:anError.message}); | 577 | // this.pages()['errorPage'].setProps({message:anError.message}); |
486 | // this.moveInPage('errorPage', this.currentPage()); | 578 | // this.moveInPage('errorPage', this.currentPage()); |
487 | }, | 579 | }, |
488 | */ | 580 | */ |
489 | //========================================================================= | 581 | //========================================================================= |
490 | __syntaxFix__: "syntax fix" | 582 | __syntaxFix__: "syntax fix" |
491 | }); | 583 | }); |