summaryrefslogtreecommitdiff
path: root/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
Unidiff
Diffstat (limited to 'frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js39
1 files changed, 11 insertions, 28 deletions
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
index f77ea80..5681f70 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
@@ -1,512 +1,496 @@
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
26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!"; 25 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!";
28} 26}
29 27
30if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 28if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
31 29
32Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) { 30Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) {
33 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments);
34 32
35//console.log("NEW Clipperz.PM.DataModel.User.Header.RecordIndex", args);
36 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 33 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
37 'name':'recordsData', 34 'name':'recordsData',
38 'retrieveKeyFunction': args.retrieveKeyFunction, 35 'retrieveKeyFunction': args.retrieveKeyFunction,
39 'remoteData': { 36 'remoteData': {
40 'data': args.recordsData['data'], 37 'data': args.recordsData['data'],
41 'version': args.encryptedDataVersion, 38 'version': args.encryptedDataVersion,
42 'recordsStats': args.recordsStats 39 'recordsStats': args.recordsStats
43 }//, 40 }//,
44 // 'encryptedDataKeypath': 'data', 41 // 'encryptedDataKeypath': 'data',
45 // 'encryptedVersionKeypath': 'version' 42 // 'encryptedVersionKeypath': 'version'
46 }); 43 });
47 44
48 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 45 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
49 'name':'directLoginsData', 46 'name':'directLoginsData',
50 'retrieveKeyFunction': args.retrieveKeyFunction, 47 'retrieveKeyFunction': args.retrieveKeyFunction,
51 'remoteData': { 48 'remoteData': {
52 'data': args.directLoginsData['data'], 49 'data': args.directLoginsData['data'],
53 'version': args.encryptedDataVersion 50 'version': args.encryptedDataVersion
54 }//, 51 }//,
55 // 'encryptedDataKeypath': 'data', 52 // 'encryptedDataKeypath': 'data',
56 // 'encryptedVersionKeypath': 'version' 53 // 'encryptedVersionKeypath': 'version'
57 }); 54 });
58 55
59 this._lock = new MochiKit.Async.DeferredLock(); 56 this._lock = new MochiKit.Async.DeferredLock();
60 this._transientState = null; 57 this._transientState = null;
61 58
62 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter'); 59 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
63 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter'); 60 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter');
64 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter'); 61 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter');
65 62
66 this._records = null; 63 this._records = null;
67 64
68 return this; 65 return this;
69} 66}
70 67
71 68
72Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, { 69Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, {
73 70
74 'toString': function() { 71 'toString': function() {
75 return "Clipperz.PM.DataModel.User.Header.RecordIndex"; 72 return "Clipperz.PM.DataModel.User.Header.RecordIndex";
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'retrieveRecordDetailFunction': function () { 77 'retrieveRecordDetailFunction': function () {
81 return this._retrieveRecordDetailFunction; 78 return this._retrieveRecordDetailFunction;
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'recordsIndex': function () { 83 'recordsIndex': function () {
87 return this._recordsIndex; 84 return this._recordsIndex;
88 }, 85 },
89 86
90 'recordsData': function () { 87 'recordsData': function () {
91 return this._recordsData; 88 return this._recordsData;
92 }, 89 },
93 90
94 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
95 92
96 'directLoginsIndex': function () { 93 'directLoginsIndex': function () {
97 return this._directLoginsIndex; 94 return this._directLoginsIndex;
98 }, 95 },
99 96
100 'directLoginsData': function () { 97 'directLoginsData': function () {
101 return this._directLoginsData; 98 return this._directLoginsData;
102 }, 99 },
103 100
104 //------------------------------------------------------------------------- 101 //-------------------------------------------------------------------------
105 102
106 'lock': function () { 103 'lock': function () {
107 return this._lock; 104 return this._lock;
108 }, 105 },
109 106
110 //------------------------------------------------------------------------- 107 //-------------------------------------------------------------------------
111 108
112 'transientState': function () { 109 'transientState': function () {
113 if (this._transientState == null) { 110 if (this._transientState == null) {
114 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/); 111 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/);
115 } 112 }
116 113
117 return this._transientState; 114 return this._transientState;
118 }, 115 },
119 116
120 'resetTransientState': function (isCommitting) { 117 'resetTransientState': function (isCommitting) {
121//console.log("######## UserHeaderRecordIndex - resetTransientState", Clipperz.Base.deepClone(this._transientState));
122 if (this._transientState != null) { 118 if (this._transientState != null) {
123 this._transientState.removeAllData(); 119 this._transientState.removeAllData();
124 } 120 }
125 121
126 this._transientState = null; 122 this._transientState = null;
127 }, 123 },
128 124
129 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
130 126
131 'getRecordKey': function (aRecordReference) { 127 'getRecordKey': function (aRecordReference) {
132 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [ 128 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [
133 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference), 129 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference),
134 MochiKit.Base.itemgetter('key') 130 MochiKit.Base.itemgetter('key')
135 ], {trace:false}); 131 ], {trace:false});
136 }, 132 },
137 133
138 'setRecordKey': function (aRecordReference, aValue) { 134 'setRecordKey': function (aRecordReference, aValue) {
139 return this.updateRecordIndexData(aRecordReference, 'key', aValue); 135 return this.updateRecordIndexData(aRecordReference, 'key', aValue);
140 }, 136 },
141 137
142 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
143 139
144 'getRecordIndexData': function (aRecordReference) { 140 'getRecordIndexData': function (aRecordReference) {
145 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]); 141 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]);
146 }, 142 },
147 143
148 //......................................................................... 144 //.........................................................................
149 145
150 'updateRecordIndexData': function (aRecordReference, aKey, aValue) { 146 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
151 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue); 147 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue);
152 }, 148 },
153 149
154 //------------------------------------------------------------------------- 150 //-------------------------------------------------------------------------
155 151
156 'getDirectLoginIndexData': function (aDirectLoginReference) { 152 'getDirectLoginIndexData': function (aDirectLoginReference) {
157 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]); 153 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]);
158 }, 154 },
159 155
160 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) { 156 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
161//console.log("UserHeaderRecordIndex.setDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference], aKey);
162//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) { 157//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) {
163 //throw "PIPPO"; 158 //throw "PIPPO";
164//} 159//}
165 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue); 160 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue);
166 }, 161 },
167 162
168 'addDirectLoginIndexData': function (aDirectLoginReference) { 163 'addDirectLoginIndexData': function (aDirectLoginReference) {
169//console.log("UserHeaderRecordIndex.addDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference]);
170 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {}); 164 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {});
171 }, 165 },
172 166
173 'removeDirectLoginIndexData': function (aDirectLoginReference) { 167 'removeDirectLoginIndexData': function (aDirectLoginReference) {
174 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference]) 168 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference])
175 }, 169 },
176 170
177 //------------------------------------------------------------------------- 171 //-------------------------------------------------------------------------
178 172
179 'records': function () { 173 'records': function () {
180 vardeferredResult; 174 vardeferredResult;
181 175
182 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false}); 176 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false});
183 deferredResult.acquireLock(this.lock()); 177 deferredResult.acquireLock(this.lock());
184 deferredResult.addCallback(MochiKit.Base.bind(function () { 178 deferredResult.addCallback(MochiKit.Base.bind(function () {
185 var innerDeferredResult; 179 var innerDeferredResult;
186 180
187 if (this._records == null) { 181 if (this._records == null) {
188 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false}); 182 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false});
189 innerDeferredResult.collectResults({ 183 innerDeferredResult.collectResults({
190 'records': [ 184 'records': [
191 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'), 185 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'),
192 // MochiKit.Base.methodcaller('values') 186 // MochiKit.Base.methodcaller('values')
193 MochiKit.Base.method(this.recordsData(), 'values') 187 MochiKit.Base.method(this.recordsData(), 'values')
194 ], 188 ],
195 'recordsStats': [ 189 'recordsStats': [
196 MochiKit.Base.method(this.recordsData(), 'getRemoteData'), 190 MochiKit.Base.method(this.recordsData(), 'getRemoteData'),
197 MochiKit.Base.itemgetter('recordsStats') 191 MochiKit.Base.itemgetter('recordsStats')
198 ], 192 ],
199 'directLogins': [ 193 'directLogins': [
200 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'), 194 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'),
201 // MochiKit.Base.methodcaller('values') 195 // MochiKit.Base.methodcaller('values')
202 MochiKit.Base.method(this.directLoginsData(), 'values') 196 MochiKit.Base.method(this.directLoginsData(), 'values')
203 ] 197 ]
204 }) 198 })
205 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) { 199 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) {
206 var indexReference; 200 var indexReference;
207 var recordsInvertedIndex; 201 var recordsInvertedIndex;
208 var directLoginsInvertedIndex; 202 var directLoginsInvertedIndex;
209 203
210 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex()); 204 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex());
211 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex()); 205 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex());
212 206
213 this._records = {}; 207 this._records = {};
214 208
215 for (indexReference in someData['records']) { 209 for (indexReference in someData['records']) {
216 varrecord; 210 varrecord;
217 var reference; 211 var reference;
218 var updateDate; 212 var updateDate;
219 213
220 reference = recordsInvertedIndex[indexReference]; 214 reference = recordsInvertedIndex[indexReference];
221 215
222 if (typeof(someData['recordsStats'][reference]) != 'undefined') { 216 if (typeof(someData['recordsStats'][reference]) != 'undefined') {
223 updateDate = someData['recordsStats'][reference]['updateDate']; 217 updateDate = someData['recordsStats'][reference]['updateDate'];
224 218
225 record = new Clipperz.PM.DataModel.Record({ 219 record = new Clipperz.PM.DataModel.Record({
226 'reference': reference, 220 'reference': reference,
227 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), 221 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
228 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(), 222 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
229 223
230 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'), 224 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
231 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), 225 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
232 'updateDate': updateDate, 226 'updateDate': updateDate,
233 227
234 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 228 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
235 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 229 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
236 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'), 230 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
237 231
238 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') 232 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
239 }); 233 });
240 234
241 this._records[reference] = record; 235 this._records[reference] = record;
242 } else { 236 } else {
243Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference])); 237Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference]));
244 //# skip the record, as it seems it is not present in the DB 238 //# skip the record, as it seems it is not present in the DB
245 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 239 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
246 } 240 }
247 } 241 }
248 242
249 for (indexReference in someData['directLogins']) { 243 for (indexReference in someData['directLogins']) {
250 // vardirectLogin; 244 // vardirectLogin;
251 var reference; 245 var reference;
252 var record; 246 var record;
253 247
254 reference = directLoginsInvertedIndex[indexReference]; 248 reference = directLoginsInvertedIndex[indexReference];
255 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]]; 249 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]];
256 250
257 if (record != null) { 251 if (record != null) {
258 // directLogin = new Clipperz.PM.DataModel.DirectLogin({ 252 // directLogin = new Clipperz.PM.DataModel.DirectLogin({
259 new Clipperz.PM.DataModel.DirectLogin({ 253 new Clipperz.PM.DataModel.DirectLogin({
260 'reference': reference, 254 'reference': reference,
261 'record': record 255 'record': record
262 }); 256 });
263 } else { 257 } else {
264Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!"); 258 Clipperz.logWarning("WARNING: DIRECT LOGIN without a matching RECORD!!");
265//console.log("direct login data", someData['directLogins']);
266//console.log("current direct login data", someData['directLogins'][indexReference])
267//console.log("reference", reference);
268//console.log("record index", this.recordsIndex());
269//console.log("record inverted index", recordsInvertedIndex);
270 } 259 }
271 } 260 }
272 261
273 return this._records; 262 return this._records;
274 }, this)); 263 }, this));
275 innerDeferredResult.callback(); 264 innerDeferredResult.callback();
276 } else { 265 } else {
277 innerDeferredResult = MochiKit.Async.succeed(this._records); 266 innerDeferredResult = MochiKit.Async.succeed(this._records);
278 } 267 }
279 268
280 return innerDeferredResult; 269 return innerDeferredResult;
281 }, this)); 270 }, this));
282 deferredResult.releaseLock(this.lock()); 271 deferredResult.releaseLock(this.lock());
283 deferredResult.callback(); 272 deferredResult.callback();
284 273
285 return deferredResult; 274 return deferredResult;
286 }, 275 },
287 276
288 //------------------------------------------------------------------------- 277 //-------------------------------------------------------------------------
289 278
290 'updateRecordIndexForNewRecord': function (aNewRecord) { 279 'updateRecordIndexForNewRecord': function (aNewRecord) {
291 var newRecordIndex; 280 var newRecordIndex;
292 var recordReference; 281 var recordReference;
293 282
294 recordReference = aNewRecord.reference(); 283 recordReference = aNewRecord.reference();
295 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + ''; 284 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + '';
296 this.recordsIndex()[recordReference] = newRecordIndex; 285 this.recordsIndex()[recordReference] = newRecordIndex;
297 286
298 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex); 287 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex);
299 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord); 288 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord);
300 }, 289 },
301 290
302 //......................................................................... 291 //.........................................................................
303 292
304 'createNewRecord': function () { 293 'createNewRecord': function () {
305 var deferredResult; 294 var deferredResult;
306 var newRecord; 295 var newRecord;
307 296
308//console.log("#### new Clipperz.PM.DataModel.Record [4]");
309 newRecord = new Clipperz.PM.DataModel.Record({ 297 newRecord = new Clipperz.PM.DataModel.Record({
310 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), 298 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
311 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(), 299 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
312 300
313 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'), 301 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
314 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), 302 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
315 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), 303 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
316 304
317 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 305 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
318 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 306 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
319 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'), 307 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
320 308
321 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') 309 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
322 }); 310 });
323 311
324 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord); 312 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord);
325 this.updateRecordIndexForNewRecord(newRecord); 313 this.updateRecordIndexForNewRecord(newRecord);
326 314
327 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [ 315 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [
328 MochiKit.Base.method(this, 'records'), 316 MochiKit.Base.method(this, 'records'),
329 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord), 317 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord),
330 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()), 318 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()),
331 MochiKit.Base.method(newRecord, 'setLabel', ''), 319 MochiKit.Base.method(newRecord, 'setLabel', ''),
332 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord) 320 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord)
333 ], {trace:false}); 321 ], {trace:false});
334 322
335 323
336 return deferredResult; 324 return deferredResult;
337 }, 325 },
338 326
339 //------------------------------------------------------------------------- 327 //-------------------------------------------------------------------------
340 328
341 'deleteRecord': function (aRecord) { 329 'deleteRecord': function (aRecord) {
342 var deferredResult; 330 var deferredResult;
343 var recordReference; 331 var recordReference;
344 332
345 recordReference = aRecord.reference(); 333 recordReference = aRecord.reference();
346 334
347 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false}); 335 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false});
348 336
349 deferredResult.addMethod(aRecord, 'directLogins'); 337 deferredResult.addMethod(aRecord, 'directLogins');
350 deferredResult.addCallback(MochiKit.Base.values); 338 deferredResult.addCallback(MochiKit.Base.values);
351 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin')); 339 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin'));
352 340
353 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]); 341 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
354 deferredResult.addCallback(MochiKit.Base.bind(function () { 342 deferredResult.addCallback(MochiKit.Base.bind(function () {
355 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]); 343 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]);
356 delete this.recordsIndex()[recordReference]; 344 delete this.recordsIndex()[recordReference];
357 }, this)); 345 }, this));
358 346
359 deferredResult.addMethod(this, 'records'); 347 deferredResult.addMethod(this, 'records');
360 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference)); 348 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference));
361 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference); 349 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference);
362 350
363 deferredResult.addMethod(this, 'records'); 351 deferredResult.addMethod(this, 'records');
364 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) { 352 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
365 delete someRecords[recordReference]; 353 delete someRecords[recordReference];
366 }, this)); 354 }, this));
367 deferredResult.callback(); 355 deferredResult.callback();
368 356
369 return deferredResult; 357 return deferredResult;
370 }, 358 },
371 359
372 //========================================================================= 360 //=========================================================================
373 361
374 'removeDirectLogin': function (aDirectLogin) { 362 'removeDirectLogin': function (aDirectLogin) {
375 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]); 363 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]);
376 }, 364 },
377 365
378 //------------------------------------------------------------------------- 366 //-------------------------------------------------------------------------
379 367
380 'createNewDirectLogin': function (aRecord) { 368 'createNewDirectLogin': function (aRecord) {
381 var newDirectLogin; 369 var newDirectLogin;
382 varnewDirectLoginIndexValue; 370 varnewDirectLoginIndexValue;
383 371
384 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord}); 372 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord});
385 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1; 373 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1;
386 374
387 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin); 375 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
388 376
389//console.log("UserHeaderRecordIndex.createNewDirectLogin [1]", newDirectLogin.reference(), newDirectLoginIndexValue);
390 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue; 377 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
391//console.log("UserHeaderRecordIndex.createNewDirectLogin [2]", newDirectLogin.reference(), this.directLoginsIndex()[newDirectLogin.reference()]);
392 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]}); 378 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
393 379
394 return newDirectLogin; 380 return newDirectLogin;
395 }, 381 },
396 382
397 //========================================================================= 383 //=========================================================================
398 384
399 'deleteAllCleanTextData': function () { 385 'deleteAllCleanTextData': function () {
400 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [ 386 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [
401 // MochiKit.Base.method(this, 'records'), 387 // MochiKit.Base.method(this, 'records'),
402 // MochiKit.Base.values, 388 // MochiKit.Base.values,
403 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), 389 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
404 390
405 MochiKit.Base.method(this, 'recordsData'), 391 MochiKit.Base.method(this, 'recordsData'),
406 MochiKit.Base.methodcaller('deleteAllCleanTextData'), 392 MochiKit.Base.methodcaller('deleteAllCleanTextData'),
407 MochiKit.Base.method(this, 'directLoginsData'), 393 MochiKit.Base.method(this, 'directLoginsData'),
408 MochiKit.Base.methodcaller('deleteAllCleanTextData') 394 MochiKit.Base.methodcaller('deleteAllCleanTextData')
409 ], {trace:false}); 395 ], {trace:false});
410 }, 396 },
411 397
412 //------------------------------------------------------------------------- 398 //-------------------------------------------------------------------------
413 399
414 'hasAnyCleanTextData': function () { 400 'hasAnyCleanTextData': function () {
415 var deferredResult; 401 var deferredResult;
416 402
417 deferredResult = new Clipperz.Async.Deferred({trace:false}); 403 deferredResult = new Clipperz.Async.Deferred({trace:false});
418 deferredResult.collectResults({ 404 deferredResult.collectResults({
419 'recordsData': [ 405 'recordsData': [
420 MochiKit.Base.method(this, 'recordsData'), 406 MochiKit.Base.method(this, 'recordsData'),
421 MochiKit.Base.methodcaller('hasAnyCleanTextData') 407 MochiKit.Base.methodcaller('hasAnyCleanTextData')
422 ], 408 ],
423 'directLoginsData':[ 409 'directLoginsData':[
424 MochiKit.Base.method(this, 'directLoginsData'), 410 MochiKit.Base.method(this, 'directLoginsData'),
425 MochiKit.Base.methodcaller('hasAnyCleanTextData') 411 MochiKit.Base.methodcaller('hasAnyCleanTextData')
426 ], 412 ],
427 // 'records': [ 413 // 'records': [
428 // MochiKit.Base.method(this, 'records'), 414 // MochiKit.Base.method(this, 'records'),
429 // MochiKit.Base.values, 415 // MochiKit.Base.values,
430 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')), 416 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
431 // Clipperz.Async.collectAll 417 // Clipperz.Async.collectAll
432 // ] 418 // ]
433 }); 419 });
434//deferredResult.addCallback(function (aValue) { console.log("USER.Header.RecordIndex.hasAnyCleanTextData", aValue); return aValue});
435 420
436 // deferredResult.addCallback(MochiKit.Base.values); 421 // deferredResult.addCallback(MochiKit.Base.values);
437 // deferredResult.addCallback(MochiKit.Base.flattenArguments); 422 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
438 // deferredResult.addCallback(function(someValues) { 423 // deferredResult.addCallback(function(someValues) {
439 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 424 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
440 // }); 425 // });
441 deferredResult.addCallback(Clipperz.Async.or); 426 deferredResult.addCallback(Clipperz.Async.or);
442 427
443 deferredResult.callback(); 428 deferredResult.callback();
444 429
445 return deferredResult; 430 return deferredResult;
446 }, 431 },
447 432
448 //------------------------------------------------------------------------- 433 //-------------------------------------------------------------------------
449 434
450 'hasPendingChanges': function () { 435 'hasPendingChanges': function () {
451 vardeferredResult; 436 vardeferredResult;
452 437
453 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false}); 438 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false});
454 deferredResult.collectResults({ 439 deferredResult.collectResults({
455 'recordsData': [ 440 'recordsData': [
456 MochiKit.Base.method(this, 'recordsData'), 441 MochiKit.Base.method(this, 'recordsData'),
457 MochiKit.Base.methodcaller('hasPendingChanges') 442 MochiKit.Base.methodcaller('hasPendingChanges')
458 ], 443 ],
459 'directLoginsData': [ 444 'directLoginsData': [
460 MochiKit.Base.method(this, 'directLoginsData'), 445 MochiKit.Base.method(this, 'directLoginsData'),
461 MochiKit.Base.methodcaller('hasPendingChanges') 446 MochiKit.Base.methodcaller('hasPendingChanges')
462 ] 447 ]
463 }); 448 });
464//deferredResult.addCallback(function (aValue) { console.log("UserHeaderIndex.hasPendingResults", aValue); return aValue; });
465 deferredResult.addCallback(Clipperz.Async.or); 449 deferredResult.addCallback(Clipperz.Async.or);
466 // deferredResult.addCallback(MochiKit.Base.values); 450 // deferredResult.addCallback(MochiKit.Base.values);
467 // deferredResult.addCallback(MochiKit.Base.flattenArguments); 451 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
468 // deferredResult.addCallback(function(someValues) { 452 // deferredResult.addCallback(function(someValues) {
469 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 453 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
470 // }); 454 // });
471 deferredResult.callback(); 455 deferredResult.callback();
472 456
473 return deferredResult; 457 return deferredResult;
474 }, 458 },
475 459
476 //------------------------------------------------------------------------- 460 //-------------------------------------------------------------------------
477 461
478 'commitTransientState': function () { 462 'commitTransientState': function () {
479 var deferredResult; 463 var deferredResult;
480 464
481 deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [ 465 deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [
482 MochiKit.Base.method(this, 'recordsData'), 466 MochiKit.Base.method(this, 'recordsData'),
483 MochiKit.Base.methodcaller('commitTransientState'), 467 MochiKit.Base.methodcaller('commitTransientState'),
484 468
485 MochiKit.Base.method(this, 'directLoginsData'), 469 MochiKit.Base.method(this, 'directLoginsData'),
486 MochiKit.Base.methodcaller('commitTransientState'), 470 MochiKit.Base.methodcaller('commitTransientState'),
487 471
488 MochiKit.Base.method(this, 'resetTransientState', true) 472 MochiKit.Base.method(this, 'resetTransientState', true)
489 ], {trace:false}); 473 ], {trace:false});
490 474
491 return deferredResult; 475 return deferredResult;
492 }, 476 },
493 477
494 //------------------------------------------------------------------------- 478 //-------------------------------------------------------------------------
495 479
496 'revertChanges': function () { 480 'revertChanges': function () {
497 return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [ 481 return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [
498 MochiKit.Base.method(this, 'recordsData'), 482 MochiKit.Base.method(this, 'recordsData'),
499 MochiKit.Base.methodcaller('revertChanges'), 483 MochiKit.Base.methodcaller('revertChanges'),
500 484
501 // MochiKit.Base.method(this, 'directLoginsData'), 485 // MochiKit.Base.method(this, 'directLoginsData'),
502 // MochiKit.Base.methodcaller('revertChanges'), 486 // MochiKit.Base.methodcaller('revertChanges'),
503 487
504 MochiKit.Base.method(this, 'records'), 488 MochiKit.Base.method(this, 'records'),
505 MochiKit.Base.bind(function (someRecords) { 489 MochiKit.Base.bind(function (someRecords) {
506 varrecordReference; 490 varrecordReference;
507 491
508 for (recordReference in this.transientState().getValue('deleteRecordsReferences')) { 492 for (recordReference in this.transientState().getValue('deleteRecordsReferences')) {
509 this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference); 493 this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference);
510 someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference); 494 someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference);
511 } 495 }
512 496
@@ -525,97 +509,96 @@ Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
525 //this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue; 509 //this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
526 //this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]}); 510 //this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
527 511
528 512
529 // for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) { 513 // for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) {
530 // someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference); 514 // someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference);
531 // } 515 // }
532 516
533 for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) { 517 for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) {
534 // this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]); 518 // this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]);
535 delete this.directLoginsIndex()[directLoginReference]; 519 delete this.directLoginsIndex()[directLoginReference];
536 } 520 }
537 }, this), 521 }, this),
538 522
539 MochiKit.Base.method(this, 'directLoginsData'), 523 MochiKit.Base.method(this, 'directLoginsData'),
540 MochiKit.Base.methodcaller('revertChanges'), 524 MochiKit.Base.methodcaller('revertChanges'),
541 525
542 MochiKit.Base.method(this, 'resetTransientState', false) 526 MochiKit.Base.method(this, 'resetTransientState', false)
543 ], {trace:false}); 527 ], {trace:false});
544 }, 528 },
545 529
546 //------------------------------------------------------------------------- 530 //-------------------------------------------------------------------------
547 531
548 'prepareRemoteDataWithKey': function (aKey) { 532 'prepareRemoteDataWithKey': function (aKey) {
549 // "records": { 533 // "records": {
550 // "index": { 534 // "index": {
551 // "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0", 535 // "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0",
552 // "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1", 536 // "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1",
553 // ... 537 // ...
554 // "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18", 538 // "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18",
555 // "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19" 539 // "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19"
556 // }, 540 // },
557 // "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w=" 541 // "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w="
558 // }, 542 // },
559 // "directLogins": { 543 // "directLogins": {
560 // "index": { 544 // "index": {
561 // "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0", 545 // "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0",
562 // "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1", 546 // "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1",
563 // ... 547 // ...
564 // "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17", 548 // "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17",
565 // "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18" 549 // "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18"
566 // }, 550 // },
567 // "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x" 551 // "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x"
568 // }, 552 // },
569 553
570 var deferredResult; 554 var deferredResult;
571 var result; 555 var result;
572 556
573//console.log("recordsIndex", this.recordsIndex());
574 result = {}; 557 result = {};
575 558
576 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false}); 559 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false});
577 deferredResult.collectResults({ 560 deferredResult.collectResults({
578 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()), 561 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()),
579 'data': [ 562 'data': [
580 MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey), 563 MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey),
581 MochiKit.Base.itemgetter('data') 564 MochiKit.Base.itemgetter('data')
582 ] 565 ]
583 }); 566 });
584 deferredResult.addCallback(Clipperz.Async.setItem, result, 'records'); 567 deferredResult.addCallback(Clipperz.Async.setItem, result, 'records');
585 568
586 deferredResult.collectResults({ 569 deferredResult.collectResults({
587 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()), 570 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()),
588 'data': [ 571 'data': [
589 MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey), 572 MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey),
590 MochiKit.Base.itemgetter('data') 573 MochiKit.Base.itemgetter('data')
591 ] 574 ]
592 }); 575 });
593 deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins'); 576 deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins');
594 577
595 deferredResult.addCallback(MochiKit.Async.succeed, result); 578 deferredResult.addCallback(MochiKit.Async.succeed, result);
596 579
597 deferredResult.callback(); 580 deferredResult.callback();
598 581
599 return deferredResult; 582 return deferredResult;
600 }, 583 },
601 584
602 //------------------------------------------------------------------------- 585 //-------------------------------------------------------------------------
603 586
604 'updateRecordKeyAndPrepareRemoteData': function (aRecord) { 587 'updateRecordKeyAndPrepareRemoteData': function (aRecord) {
605 varnewRecordKey; 588 varnewRecordKey;
606 var deferredResult; 589 var deferredResult;
607 590
608 newRecordKey = Clipperz.PM.Crypto.randomKey(); 591 newRecordKey = Clipperz.PM.Crypto.randomKey();
609 592
610 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false}); 593 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false});
611 deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey)); 594 deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey));
612 deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey)); 595 deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey));
613 deferredResult.callback(); 596 deferredResult.callback();
614 597
615 return deferredResult; 598 return deferredResult;
616 }, 599 },
617 600
618 //......................................................................... 601 //.........................................................................
619 602
620 'removeNewRecordWithNoChanges': function (aRecord) { 603 'removeNewRecordWithNoChanges': function (aRecord) {
621 var deferredResult; 604 var deferredResult;