Subversion Repositories Applications.papyrus

Rev

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