Subversion Repositories Applications.papyrus

Rev

Rev 1372 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1318 alexandre_ 1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
10
 
1422 alexandre_ 11
 
12
 
1318 alexandre_ 13
dojo.provide("dojo.collections.Store");
14
dojo.require("dojo.lang.common");
15
dojo.collections.Store = function (jsonArray) {
16
	var data = [];
17
	var items = {};
18
	this.keyField = "Id";
19
	this.get = function () {
20
		return data;
21
	};
22
	this.getByKey = function (key) {
23
		return items[key];
24
	};
25
	this.getByIndex = function (idx) {
26
		return data[idx];
27
	};
28
	this.getIndexOf = function (key) {
29
		for (var i = 0; i < data.length; i++) {
30
			if (data[i].key == key) {
31
				return i;
32
			}
33
		}
34
		return -1;
35
	};
36
	this.getData = function () {
37
		var arr = [];
38
		for (var i = 0; i < data.length; i++) {
39
			arr.push(data[i].src);
40
		}
41
		return arr;
42
	};
43
	this.getDataByKey = function (key) {
44
		if (items[key] != null) {
45
			return items[key].src;
46
		}
47
		return null;
48
	};
49
	this.getIndexOfData = function (obj) {
50
		for (var i = 0; i < data.length; i++) {
51
			if (data[i].src == obj) {
52
				return i;
53
			}
54
		}
55
		return -1;
56
	};
57
	this.getDataByIndex = function (idx) {
58
		if (data[idx]) {
59
			return data[idx].src;
60
		}
61
		return null;
62
	};
63
	this.update = function (obj, fieldPath, val, bDontFire) {
64
		var parts = fieldPath.split("."), i = 0, o = obj, field;
65
		if (parts.length > 1) {
66
			field = parts.pop();
67
			do {
68
				if (parts[i].indexOf("()") > -1) {
69
					var temp = parts[i++].split("()")[0];
70
					if (!o[temp]) {
71
						dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object.");
72
					} else {
73
						o = o[temp]();
74
					}
75
				} else {
76
					o = o[parts[i++]];
77
				}
78
			} while (i < parts.length && o != null);
79
		} else {
80
			field = parts[0];
81
		}
82
		obj[field] = val;
83
		if (!bDontFire) {
84
			this.onUpdateField(obj, fieldPath, val);
85
		}
86
	};
87
	this.forEach = function (fn) {
88
		if (Array.forEach) {
89
			Array.forEach(data, fn, this);
90
		} else {
91
			for (var i = 0; i < data.length; i++) {
92
				fn.call(this, data[i]);
93
			}
94
		}
95
	};
96
	this.forEachData = function (fn) {
97
		if (Array.forEach) {
98
			Array.forEach(this.getData(), fn, this);
99
		} else {
100
			var a = this.getData();
101
			for (var i = 0; i < a.length; i++) {
102
				fn.call(this, a[i]);
103
			}
104
		}
105
	};
106
	this.setData = function (arr, bDontFire) {
107
		data = [];
108
		for (var i = 0; i < arr.length; i++) {
109
			var o = {key:arr[i][this.keyField], src:arr[i]};
110
			data.push(o);
111
			items[o.key] = o;
112
		}
113
		if (!bDontFire) {
114
			this.onSetData();
115
		}
116
	};
117
	this.clearData = function (bDontFire) {
118
		data = [];
119
		items = {};
120
		if (!bDontFire) {
121
			this.onClearData();
122
		}
123
	};
124
	this.addData = function (obj, key, bDontFire) {
125
		var k = key || obj[this.keyField];
126
		if (items[k] != null) {
127
			var o = items[k];
128
			o.src = obj;
129
		} else {
130
			var o = {key:k, src:obj};
131
			data.push(o);
132
			items[o.key] = o;
133
		}
134
		if (!bDontFire) {
135
			this.onAddData(o);
136
		}
137
	};
138
	this.addDataRange = function (arr, bDontFire) {
139
		var objects = [];
140
		for (var i = 0; i < arr.length; i++) {
141
			var k = arr[i][this.keyField];
142
			if (items[k] != null) {
143
				var o = items[k];
144
				o.src = arr[i];
145
			} else {
146
				var o = {key:k, src:arr[i]};
147
				data.push(o);
148
				items[k] = o;
149
			}
150
			objects.push(o);
151
		}
152
		if (!bDontFire) {
153
			this.onAddDataRange(objects);
154
		}
155
	};
156
	this.addDataByIndex = function (obj, idx, key, bDontFire) {
157
		var k = key || obj[this.keyField];
158
		if (items[k] != null) {
159
			var i = this.getIndexOf(k);
160
			var o = data.splice(i, 1);
161
			o.src = obj;
162
		} else {
163
			var o = {key:k, src:obj};
164
			items[k] = o;
165
		}
166
		data.splice(idx, 0, o);
167
		if (!bDontFire) {
168
			this.onAddData(o);
169
		}
170
	};
171
	this.addDataRangeByIndex = function (arr, idx, bDontFire) {
172
		var objects = [];
173
		for (var i = 0; i < arr.length; i++) {
174
			var k = arr[i][this.keyField];
175
			if (items[k] != null) {
176
				var j = this.getIndexOf(k);
177
				var o = data.splice(j, 1);
178
				o.src = arr[i];
179
			} else {
180
				var o = {key:k, src:arr[i]};
181
				items[k] = o;
182
			}
183
			objects.push(o);
184
		}
185
		data.splice(idx, 0, objects);
186
		if (!bDontFire) {
187
			this.onAddDataRange(objects);
188
		}
189
	};
190
	this.removeData = function (obj, bDontFire) {
191
		var idx = -1;
192
		var o = null;
193
		for (var i = 0; i < data.length; i++) {
194
			if (data[i].src == obj) {
195
				idx = i;
196
				o = data[i];
197
				break;
198
			}
199
		}
200
		if (!bDontFire) {
201
			this.onRemoveData(o);
202
		}
203
		if (idx > -1) {
204
			data.splice(idx, 1);
205
			delete items[o.key];
206
		}
207
	};
208
	this.removeDataRange = function (idx, range, bDontFire) {
209
		var ret = data.splice(idx, range);
210
		for (var i = 0; i < ret.length; i++) {
211
			delete items[ret[i].key];
212
		}
213
		if (!bDontFire) {
214
			this.onRemoveDataRange(ret);
215
		}
216
		return ret;
217
	};
218
	this.removeDataByKey = function (key, bDontFire) {
219
		this.removeData(this.getDataByKey(key), bDontFire);
220
	};
221
	this.removeDataByIndex = function (idx, bDontFire) {
222
		this.removeData(this.getDataByIndex(idx), bDontFire);
223
	};
224
	if (jsonArray && jsonArray.length && jsonArray[0]) {
225
		this.setData(jsonArray, true);
226
	}
227
};
228
dojo.extend(dojo.collections.Store, {getField:function (obj, field) {
229
	var parts = field.split("."), i = 0, o = obj;
230
	do {
231
		if (parts[i].indexOf("()") > -1) {
232
			var temp = parts[i++].split("()")[0];
233
			if (!o[temp]) {
234
				dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object.");
235
			} else {
236
				o = o[temp]();
237
			}
238
		} else {
239
			o = o[parts[i++]];
240
		}
241
	} while (i < parts.length && o != null);
242
	if (i < parts.length) {
243
		dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + field + "' is not a property of the passed object.");
244
	}
245
	return o;
246
}, getFromHtml:function (meta, body, fnMod) {
247
	var rows = body.rows;
248
	var ctor = function (row) {
249
		var obj = {};
250
		for (var i = 0; i < meta.length; i++) {
251
			var o = obj;
252
			var data = row.cells[i].innerHTML;
253
			var p = meta[i].getField();
254
			if (p.indexOf(".") > -1) {
255
				p = p.split(".");
256
				while (p.length > 1) {
257
					var pr = p.shift();
258
					o[pr] = {};
259
					o = o[pr];
260
				}
261
				p = p[0];
262
			}
263
			var type = meta[i].getType();
264
			if (type == String) {
265
				o[p] = data;
266
			} else {
267
				if (data) {
268
					o[p] = new type(data);
269
				} else {
270
					o[p] = new type();
271
				}
272
			}
273
		}
274
		return obj;
275
	};
276
	var arr = [];
277
	for (var i = 0; i < rows.length; i++) {
278
		var o = ctor(rows[i]);
279
		if (fnMod) {
280
			fnMod(o, rows[i]);
281
		}
282
		arr.push(o);
283
	}
284
	return arr;
285
}, onSetData:function () {
286
}, onClearData:function () {
287
}, onAddData:function (obj) {
288
}, onAddDataRange:function (arr) {
289
}, onRemoveData:function (obj) {
290
}, onRemoveDataRange:function (arr) {
291
}, onUpdateField:function (obj, field, val) {
292
}});
293