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.widget.FilteringTable");
12
dojo.require("dojo.date.format");
13
dojo.require("dojo.math");
14
dojo.require("dojo.collections.Store");
15
dojo.require("dojo.html.*");
16
dojo.require("dojo.html.util");
17
dojo.require("dojo.html.style");
18
dojo.require("dojo.html.selection");
19
dojo.require("dojo.event.*");
20
dojo.require("dojo.widget.*");
21
dojo.require("dojo.widget.HtmlWidget");
22
dojo.widget.defineWidget("dojo.widget.FilteringTable", dojo.widget.HtmlWidget, function () {
23
	this.store = new dojo.collections.Store();
24
	this.valueField = "Id";
25
	this.multiple = false;
26
	this.maxSelect = 0;
27
	this.maxSortable = 1;
28
	this.minRows = 0;
29
	this.defaultDateFormat = "%D";
30
	this.isInitialized = false;
31
	this.alternateRows = false;
32
	this.columns = [];
33
	this.sortInformation = [{index:0, direction:0}];
34
	this.headClass = "";
35
	this.tbodyClass = "";
36
	this.headerClass = "";
37
	this.headerUpClass = "selectedUp";
38
	this.headerDownClass = "selectedDown";
39
	this.rowClass = "";
40
	this.rowAlternateClass = "alt";
41
	this.rowSelectedClass = "selected";
42
	this.columnSelected = "sorted-column";
43
}, {isContainer:false, templatePath:null, templateCssPath:null, getTypeFromString:function (s) {
44
	var parts = s.split("."), i = 0, obj = dj_global;
45
	do {
46
		obj = obj[parts[i++]];
47
	} while (i < parts.length && obj);
48
	return (obj != dj_global) ? obj : null;
49
}, getByRow:function (row) {
50
	return this.store.getByKey(dojo.html.getAttribute(row, "value"));
51
}, getDataByRow:function (row) {
52
	return this.store.getDataByKey(dojo.html.getAttribute(row, "value"));
53
}, getRow:function (obj) {
54
	var rows = this.domNode.tBodies[0].rows;
55
	for (var i = 0; i < rows.length; i++) {
56
		if (this.store.getDataByKey(dojo.html.getAttribute(rows[i], "value")) == obj) {
57
			return rows[i];
58
		}
59
	}
60
	return null;
61
}, getColumnIndex:function (fieldPath) {
62
	for (var i = 0; i < this.columns.length; i++) {
63
		if (this.columns[i].getField() == fieldPath) {
64
			return i;
65
		}
66
	}
67
	return -1;
68
}, getSelectedData:function () {
69
	var data = this.store.get();
70
	var a = [];
71
	for (var i = 0; i < data.length; i++) {
72
		if (data[i].isSelected) {
73
			a.push(data[i].src);
74
		}
75
	}
76
	if (this.multiple) {
77
		return a;
78
	} else {
79
		return a[0];
80
	}
81
}, isSelected:function (obj) {
82
	var data = this.store.get();
83
	for (var i = 0; i < data.length; i++) {
84
		if (data[i].src == obj) {
85
			return true;
86
		}
87
	}
88
	return false;
89
}, isValueSelected:function (val) {
90
	var v = this.store.getByKey(val);
91
	if (v) {
92
		return v.isSelected;
93
	}
94
	return false;
95
}, isIndexSelected:function (idx) {
96
	var v = this.store.getByIndex(idx);
97
	if (v) {
98
		return v.isSelected;
99
	}
100
	return false;
101
}, isRowSelected:function (row) {
102
	var v = this.getByRow(row);
103
	if (v) {
104
		return v.isSelected;
105
	}
106
	return false;
107
}, reset:function () {
108
	this.store.clearData();
109
	this.columns = [];
110
	this.sortInformation = [{index:0, direction:0}];
111
	this.resetSelections();
112
	this.isInitialized = false;
113
	this.onReset();
114
}, resetSelections:function () {
115
	this.store.forEach(function (element) {
116
		element.isSelected = false;
117
	});
118
}, onReset:function () {
119
}, select:function (obj) {
120
	var data = this.store.get();
121
	for (var i = 0; i < data.length; i++) {
122
		if (data[i].src == obj) {
123
			data[i].isSelected = true;
124
			break;
125
		}
126
	}
127
	this.onDataSelect(obj);
128
}, selectByValue:function (val) {
129
	this.select(this.store.getDataByKey(val));
130
}, selectByIndex:function (idx) {
131
	this.select(this.store.getDataByIndex(idx));
132
}, selectByRow:function (row) {
133
	this.select(this.getDataByRow(row));
134
}, selectAll:function () {
135
	this.store.forEach(function (element) {
136
		element.isSelected = true;
137
	});
138
}, onDataSelect:function (obj) {
139
}, toggleSelection:function (obj) {
140
	var data = this.store.get();
141
	for (var i = 0; i < data.length; i++) {
142
		if (data[i].src == obj) {
143
			data[i].isSelected = !data[i].isSelected;
144
			break;
145
		}
146
	}
147
	this.onDataToggle(obj);
148
}, toggleSelectionByValue:function (val) {
149
	this.toggleSelection(this.store.getDataByKey(val));
150
}, toggleSelectionByIndex:function (idx) {
151
	this.toggleSelection(this.store.getDataByIndex(idx));
152
}, toggleSelectionByRow:function (row) {
153
	this.toggleSelection(this.getDataByRow(row));
154
}, toggleAll:function () {
155
	this.store.forEach(function (element) {
156
		element.isSelected = !element.isSelected;
157
	});
158
}, onDataToggle:function (obj) {
159
}, _meta:{field:null, format:null, filterer:null, noSort:false, sortType:"String", dataType:String, sortFunction:null, filterFunction:null, label:null, align:"left", valign:"middle", getField:function () {
160
	return this.field || this.label;
161
}, getType:function () {
162
	return this.dataType;
163
}}, createMetaData:function (obj) {
164
	for (var p in this._meta) {
165
		if (!obj[p]) {
166
			obj[p] = this._meta[p];
167
		}
168
	}
169
	if (!obj.label) {
170
		obj.label = obj.field;
171
	}
172
	if (!obj.filterFunction) {
173
		obj.filterFunction = this._defaultFilter;
174
	}
175
	return obj;
176
}, parseMetadata:function (head) {
177
	this.columns = [];
178
	this.sortInformation = [];
179
	var row = head.getElementsByTagName("tr")[0];
180
	var cells = row.getElementsByTagName("td");
181
	if (cells.length == 0) {
182
		cells = row.getElementsByTagName("th");
183
	}
184
	for (var i = 0; i < cells.length; i++) {
185
		var o = this.createMetaData({});
186
		if (dojo.html.hasAttribute(cells[i], "align")) {
187
			o.align = dojo.html.getAttribute(cells[i], "align");
188
		}
189
		if (dojo.html.hasAttribute(cells[i], "valign")) {
190
			o.valign = dojo.html.getAttribute(cells[i], "valign");
191
		}
192
		if (dojo.html.hasAttribute(cells[i], "nosort")) {
193
			o.noSort = (dojo.html.getAttribute(cells[i], "nosort") == "true");
194
		}
195
		if (dojo.html.hasAttribute(cells[i], "sortusing")) {
196
			var trans = dojo.html.getAttribute(cells[i], "sortusing");
197
			var f = this.getTypeFromString(trans);
198
			if (f != null && f != window && typeof (f) == "function") {
199
				o.sortFunction = f;
200
			}
201
		}
202
		o.label = dojo.html.renderedTextContent(cells[i]);
203
		if (dojo.html.hasAttribute(cells[i], "field")) {
204
			o.field = dojo.html.getAttribute(cells[i], "field");
205
		} else {
206
			if (o.label.length > 0) {
207
				o.field = o.label;
208
			} else {
209
				o.field = "field" + i;
210
			}
211
		}
212
		if (dojo.html.hasAttribute(cells[i], "format")) {
213
			o.format = dojo.html.getAttribute(cells[i], "format");
214
		}
215
		if (dojo.html.hasAttribute(cells[i], "dataType")) {
216
			var sortType = dojo.html.getAttribute(cells[i], "dataType");
217
			if (sortType.toLowerCase() == "html" || sortType.toLowerCase() == "markup") {
218
				o.sortType = "__markup__";
219
			} else {
220
				var type = this.getTypeFromString(sortType);
221
				if (type) {
222
					o.sortType = sortType;
223
					o.dataType = type;
224
				}
225
			}
226
		}
227
		if (dojo.html.hasAttribute(cells[i], "filterusing")) {
228
			var trans = dojo.html.getAttribute(cells[i], "filterusing");
229
			var f = this.getTypeFromString(trans);
230
			if (f != null && f != window && typeof (f) == "function") {
231
				o.filterFunction = f;
232
			}
233
		}
234
		this.columns.push(o);
235
		if (dojo.html.hasAttribute(cells[i], "sort")) {
236
			var info = {index:i, direction:0};
237
			var dir = dojo.html.getAttribute(cells[i], "sort");
238
			if (!isNaN(parseInt(dir))) {
239
				dir = parseInt(dir);
240
				info.direction = (dir != 0) ? 1 : 0;
241
			} else {
242
				info.direction = (dir.toLowerCase() == "desc") ? 1 : 0;
243
			}
244
			this.sortInformation.push(info);
245
		}
246
	}
247
	if (this.sortInformation.length == 0) {
248
		this.sortInformation.push({index:0, direction:0});
249
	} else {
250
		if (this.sortInformation.length > this.maxSortable) {
251
			this.sortInformation.length = this.maxSortable;
252
		}
253
	}
254
}, parseData:function (body) {
255
	if (body.rows.length == 0 && this.columns.length == 0) {
256
		return;
257
	}
258
	var self = this;
259
	this["__selected__"] = [];
260
	var arr = this.store.getFromHtml(this.columns, body, function (obj, row) {
261
		if (typeof (obj[self.valueField]) == "undefined" || obj[self.valueField] == null) {
262
			obj[self.valueField] = dojo.html.getAttribute(row, "value");
263
		}
264
		if (dojo.html.getAttribute(row, "selected") == "true") {
265
			self["__selected__"].push(obj);
266
		}
267
	});
268
	this.store.setData(arr, true);
269
	this.render();
270
	for (var i = 0; i < this["__selected__"].length; i++) {
271
		this.select(this["__selected__"][i]);
272
	}
273
	this.renderSelections();
274
	delete this["__selected__"];
275
	this.isInitialized = true;
276
}, onSelect:function (e) {
277
	var row = dojo.html.getParentByType(e.target, "tr");
278
	if (dojo.html.hasAttribute(row, "emptyRow")) {
279
		return;
280
	}
281
	var body = dojo.html.getParentByType(row, "tbody");
282
	if (this.multiple) {
283
		if (e.shiftKey) {
284
			var startRow;
285
			var rows = body.rows;
286
			for (var i = 0; i < rows.length; i++) {
287
				if (rows[i] == row) {
288
					break;
289
				}
290
				if (this.isRowSelected(rows[i])) {
291
					startRow = rows[i];
292
				}
293
			}
294
			if (!startRow) {
295
				startRow = row;
296
				for (; i < rows.length; i++) {
297
					if (this.isRowSelected(rows[i])) {
298
						row = rows[i];
299
						break;
300
					}
301
				}
302
			}
303
			this.resetSelections();
304
			if (startRow == row) {
305
				this.toggleSelectionByRow(row);
306
			} else {
307
				var doSelect = false;
308
				for (var i = 0; i < rows.length; i++) {
309
					if (rows[i] == startRow) {
310
						doSelect = true;
311
					}
312
					if (doSelect) {
313
						this.selectByRow(rows[i]);
314
					}
315
					if (rows[i] == row) {
316
						doSelect = false;
317
					}
318
				}
319
			}
320
		} else {
321
			this.toggleSelectionByRow(row);
322
		}
323
	} else {
324
		this.resetSelections();
325
		this.toggleSelectionByRow(row);
326
	}
327
	this.renderSelections();
328
}, onSort:function (e) {
329
	var oldIndex = this.sortIndex;
330
	var oldDirection = this.sortDirection;
331
	var source = e.target;
332
	var row = dojo.html.getParentByType(source, "tr");
333
	var cellTag = "td";
334
	if (row.getElementsByTagName(cellTag).length == 0) {
335
		cellTag = "th";
336
	}
337
	var headers = row.getElementsByTagName(cellTag);
338
	var header = dojo.html.getParentByType(source, cellTag);
339
	for (var i = 0; i < headers.length; i++) {
340
		dojo.html.setClass(headers[i], this.headerClass);
341
		if (headers[i] == header) {
342
			if (this.sortInformation[0].index != i) {
343
				this.sortInformation.unshift({index:i, direction:0});
344
			} else {
345
				this.sortInformation[0] = {index:i, direction:(~this.sortInformation[0].direction) & 1};
346
			}
347
		}
348
	}
349
	this.sortInformation.length = Math.min(this.sortInformation.length, this.maxSortable);
350
	for (var i = 0; i < this.sortInformation.length; i++) {
351
		var idx = this.sortInformation[i].index;
352
		var dir = (~this.sortInformation[i].direction) & 1;
353
		dojo.html.setClass(headers[idx], dir == 0 ? this.headerDownClass : this.headerUpClass);
354
	}
355
	this.render();
356
}, onFilter:function () {
357
}, _defaultFilter:function (obj) {
358
	return true;
359
}, setFilter:function (field, fn) {
360
	for (var i = 0; i < this.columns.length; i++) {
361
		if (this.columns[i].getField() == field) {
362
			this.columns[i].filterFunction = fn;
363
			break;
364
		}
365
	}
366
	this.applyFilters();
367
}, setFilterByIndex:function (idx, fn) {
368
	this.columns[idx].filterFunction = fn;
369
	this.applyFilters();
370
}, clearFilter:function (field) {
371
	for (var i = 0; i < this.columns.length; i++) {
372
		if (this.columns[i].getField() == field) {
373
			this.columns[i].filterFunction = this._defaultFilter;
374
			break;
375
		}
376
	}
377
	this.applyFilters();
378
}, clearFilterByIndex:function (idx) {
379
	this.columns[idx].filterFunction = this._defaultFilter;
380
	this.applyFilters();
381
}, clearFilters:function () {
382
	for (var i = 0; i < this.columns.length; i++) {
383
		this.columns[i].filterFunction = this._defaultFilter;
384
	}
385
	var rows = this.domNode.tBodies[0].rows;
386
	for (var i = 0; i < rows.length; i++) {
387
		rows[i].style.display = "";
388
		if (this.alternateRows) {
389
			dojo.html[((i % 2 == 1) ? "addClass" : "removeClass")](rows[i], this.rowAlternateClass);
390
		}
391
	}
392
	this.onFilter();
393
}, applyFilters:function () {
394
	var alt = 0;
395
	var rows = this.domNode.tBodies[0].rows;
396
	for (var i = 0; i < rows.length; i++) {
397
		var b = true;
398
		var row = rows[i];
399
		for (var j = 0; j < this.columns.length; j++) {
400
			var value = this.store.getField(this.getDataByRow(row), this.columns[j].getField());
401
			if (this.columns[j].getType() == Date && value != null && !value.getYear) {
402
				value = new Date(value);
403
			}
404
			if (!this.columns[j].filterFunction(value)) {
405
				b = false;
406
				break;
407
			}
408
		}
409
		row.style.display = (b ? "" : "none");
410
		if (b && this.alternateRows) {
411
			dojo.html[((alt++ % 2 == 1) ? "addClass" : "removeClass")](row, this.rowAlternateClass);
412
		}
413
	}
414
	this.onFilter();
415
}, createSorter:function (info) {
416
	var self = this;
417
	var sortFunctions = [];
418
	function createSortFunction(fieldIndex, dir) {
419
		var meta = self.columns[fieldIndex];
420
		var field = meta.getField();
421
		return function (rowA, rowB) {
422
			if (dojo.html.hasAttribute(rowA, "emptyRow")) {
423
				return 1;
424
			}
425
			if (dojo.html.hasAttribute(rowB, "emptyRow")) {
426
				return -1;
427
			}
428
			var a = self.store.getField(self.getDataByRow(rowA), field);
429
			var b = self.store.getField(self.getDataByRow(rowB), field);
430
			var ret = 0;
431
			if (a > b) {
432
				ret = 1;
433
			}
434
			if (a < b) {
435
				ret = -1;
436
			}
437
			return dir * ret;
438
		};
439
	}
440
	var current = 0;
441
	var max = Math.min(info.length, this.maxSortable, this.columns.length);
442
	while (current < max) {
443
		var direction = (info[current].direction == 0) ? 1 : -1;
444
		sortFunctions.push(createSortFunction(info[current].index, direction));
445
		current++;
446
	}
447
	return function (rowA, rowB) {
448
		var idx = 0;
449
		while (idx < sortFunctions.length) {
450
			var ret = sortFunctions[idx++](rowA, rowB);
451
			if (ret != 0) {
452
				return ret;
453
			}
454
		}
455
		return 0;
456
	};
457
}, createRow:function (obj) {
458
	var row = document.createElement("tr");
459
	dojo.html.disableSelection(row);
460
	if (obj.key != null) {
461
		row.setAttribute("value", obj.key);
462
	}
463
	for (var j = 0; j < this.columns.length; j++) {
464
		var cell = document.createElement("td");
465
		cell.setAttribute("align", this.columns[j].align);
466
		cell.setAttribute("valign", this.columns[j].valign);
467
		dojo.html.disableSelection(cell);
468
		var val = this.store.getField(obj.src, this.columns[j].getField());
469
		if (typeof (val) == "undefined") {
470
			val = "";
471
		}
472
		this.fillCell(cell, this.columns[j], val);
473
		row.appendChild(cell);
474
	}
475
	return row;
476
}, fillCell:function (cell, meta, val) {
477
	if (meta.sortType == "__markup__") {
478
		cell.innerHTML = val;
479
	} else {
480
		if (meta.getType() == Date) {
481
			val = new Date(val);
482
			if (!isNaN(val)) {
483
				var format = this.defaultDateFormat;
484
				if (meta.format) {
485
					format = meta.format;
486
				}
487
				cell.innerHTML = dojo.date.strftime(val, format);
488
			} else {
489
				cell.innerHTML = val;
490
			}
491
		} else {
492
			if ("Number number int Integer float Float".indexOf(meta.getType()) > -1) {
493
				if (val.length == 0) {
494
					val = "0";
495
				}
496
				var n = parseFloat(val, 10) + "";
497
				if (n.indexOf(".") > -1) {
498
					n = dojo.math.round(parseFloat(val, 10), 2);
499
				}
500
				cell.innerHTML = n;
501
			} else {
502
				cell.innerHTML = val;
503
			}
504
		}
505
	}
506
}, prefill:function () {
507
	this.isInitialized = false;
508
	var body = this.domNode.tBodies[0];
509
	while (body.childNodes.length > 0) {
510
		body.removeChild(body.childNodes[0]);
511
	}
512
	if (this.minRows > 0) {
513
		for (var i = 0; i < this.minRows; i++) {
514
			var row = document.createElement("tr");
515
			if (this.alternateRows) {
516
				dojo.html[((i % 2 == 1) ? "addClass" : "removeClass")](row, this.rowAlternateClass);
517
			}
518
			row.setAttribute("emptyRow", "true");
519
			for (var j = 0; j < this.columns.length; j++) {
520
				var cell = document.createElement("td");
521
				cell.innerHTML = "&nbsp;";
522
				row.appendChild(cell);
523
			}
524
			body.appendChild(row);
525
		}
526
	}
527
}, init:function () {
528
	this.isInitialized = false;
529
	var head = this.domNode.getElementsByTagName("thead")[0];
530
	if (head.getElementsByTagName("tr").length == 0) {
531
		var row = document.createElement("tr");
532
		for (var i = 0; i < this.columns.length; i++) {
533
			var cell = document.createElement("td");
534
			cell.setAttribute("align", this.columns[i].align);
535
			cell.setAttribute("valign", this.columns[i].valign);
536
			dojo.html.disableSelection(cell);
537
			cell.innerHTML = this.columns[i].label;
538
			row.appendChild(cell);
539
			if (!this.columns[i].noSort) {
540
				dojo.event.connect(cell, "onclick", this, "onSort");
541
			}
542
		}
543
		dojo.html.prependChild(row, head);
544
	}
545
	if (this.store.get().length == 0) {
546
		return false;
547
	}
548
	var idx = this.domNode.tBodies[0].rows.length;
549
	if (!idx || idx == 0 || this.domNode.tBodies[0].rows[0].getAttribute("emptyRow") == "true") {
550
		idx = 0;
551
		var body = this.domNode.tBodies[0];
552
		while (body.childNodes.length > 0) {
553
			body.removeChild(body.childNodes[0]);
554
		}
555
		var data = this.store.get();
556
		for (var i = 0; i < data.length; i++) {
557
			var row = this.createRow(data[i]);
558
			body.appendChild(row);
559
			idx++;
560
		}
561
	}
562
	if (this.minRows > 0 && idx < this.minRows) {
563
		idx = this.minRows - idx;
564
		for (var i = 0; i < idx; i++) {
565
			row = document.createElement("tr");
566
			row.setAttribute("emptyRow", "true");
567
			for (var j = 0; j < this.columns.length; j++) {
568
				cell = document.createElement("td");
569
				cell.innerHTML = "&nbsp;";
570
				row.appendChild(cell);
571
			}
572
			body.appendChild(row);
573
		}
574
	}
575
	var row = this.domNode.getElementsByTagName("thead")[0].rows[0];
576
	var cellTag = "td";
577
	if (row.getElementsByTagName(cellTag).length == 0) {
578
		cellTag = "th";
579
	}
580
	var headers = row.getElementsByTagName(cellTag);
581
	for (var i = 0; i < headers.length; i++) {
582
		dojo.html.setClass(headers[i], this.headerClass);
583
	}
584
	for (var i = 0; i < this.sortInformation.length; i++) {
585
		var idx = this.sortInformation[i].index;
586
		var dir = (~this.sortInformation[i].direction) & 1;
587
		dojo.html.setClass(headers[idx], dir == 0 ? this.headerDownClass : this.headerUpClass);
588
	}
589
	this.isInitialized = true;
590
	return this.isInitialized;
591
}, render:function () {
592
	if (!this.isInitialized) {
593
		var b = this.init();
594
		if (!b) {
595
			this.prefill();
596
			return;
597
		}
598
	}
599
	var rows = [];
600
	var body = this.domNode.tBodies[0];
601
	var emptyRowIdx = -1;
602
	for (var i = 0; i < body.rows.length; i++) {
603
		rows.push(body.rows[i]);
604
	}
605
	var sortFunction = this.createSorter(this.sortInformation);
606
	if (sortFunction) {
607
		rows.sort(sortFunction);
608
	}
609
	for (var i = 0; i < rows.length; i++) {
610
		if (this.alternateRows) {
611
			dojo.html[((i % 2 == 1) ? "addClass" : "removeClass")](rows[i], this.rowAlternateClass);
612
		}
613
		dojo.html[(this.isRowSelected(body.rows[i]) ? "addClass" : "removeClass")](body.rows[i], this.rowSelectedClass);
614
		body.appendChild(rows[i]);
615
	}
616
}, renderSelections:function () {
617
	var body = this.domNode.tBodies[0];
618
	for (var i = 0; i < body.rows.length; i++) {
619
		dojo.html[(this.isRowSelected(body.rows[i]) ? "addClass" : "removeClass")](body.rows[i], this.rowSelectedClass);
620
	}
621
}, initialize:function () {
622
	var self = this;
623
	dojo.event.connect(this.store, "onSetData", function () {
624
		self.store.forEach(function (element) {
625
			element.isSelected = false;
626
		});
627
		self.isInitialized = false;
628
		var body = self.domNode.tBodies[0];
629
		if (body) {
630
			while (body.childNodes.length > 0) {
631
				body.removeChild(body.childNodes[0]);
632
			}
633
		}
634
		self.render();
635
	});
636
	dojo.event.connect(this.store, "onClearData", function () {
637
		self.isInitialized = false;
638
		self.render();
639
	});
640
	dojo.event.connect(this.store, "onAddData", function (addedObject) {
641
		var row = self.createRow(addedObject);
642
		self.domNode.tBodies[0].appendChild(row);
643
		self.render();
644
	});
645
	dojo.event.connect(this.store, "onAddDataRange", function (arr) {
646
		for (var i = 0; i < arr.length; i++) {
647
			arr[i].isSelected = false;
648
			var row = self.createRow(arr[i]);
649
			self.domNode.tBodies[0].appendChild(row);
650
		}
651
		self.render();
652
	});
653
	dojo.event.connect(this.store, "onRemoveData", function (removedObject) {
654
		var rows = self.domNode.tBodies[0].rows;
655
		for (var i = 0; i < rows.length; i++) {
656
			if (self.getDataByRow(rows[i]) == removedObject.src) {
657
				rows[i].parentNode.removeChild(rows[i]);
658
				break;
659
			}
660
		}
661
		self.render();
662
	});
663
	dojo.event.connect(this.store, "onUpdateField", function (obj, fieldPath, val) {
664
		var row = self.getRow(obj);
665
		var idx = self.getColumnIndex(fieldPath);
666
		if (row && row.cells[idx] && self.columns[idx]) {
667
			self.fillCell(row.cells[idx], self.columns[idx], val);
668
		}
669
	});
670
}, postCreate:function () {
671
	this.store.keyField = this.valueField;
672
	if (this.domNode) {
673
		if (this.domNode.nodeName.toLowerCase() != "table") {
674
		}
675
		if (this.domNode.getElementsByTagName("thead")[0]) {
676
			var head = this.domNode.getElementsByTagName("thead")[0];
677
			if (this.headClass.length > 0) {
678
				head.className = this.headClass;
679
			}
680
			dojo.html.disableSelection(this.domNode);
681
			this.parseMetadata(head);
682
			var header = "td";
683
			if (head.getElementsByTagName(header).length == 0) {
684
				header = "th";
685
			}
686
			var headers = head.getElementsByTagName(header);
687
			for (var i = 0; i < headers.length; i++) {
688
				if (!this.columns[i].noSort) {
689
					dojo.event.connect(headers[i], "onclick", this, "onSort");
690
				}
691
			}
692
		} else {
693
			this.domNode.appendChild(document.createElement("thead"));
694
		}
695
		if (this.domNode.tBodies.length < 1) {
696
			var body = document.createElement("tbody");
697
			this.domNode.appendChild(body);
698
		} else {
699
			var body = this.domNode.tBodies[0];
700
		}
701
		if (this.tbodyClass.length > 0) {
702
			body.className = this.tbodyClass;
703
		}
704
		dojo.event.connect(body, "onclick", this, "onSelect");
705
		this.parseData(body);
706
	}
707
}});
708