2 Fieldmapper object table
9 function drawFMObjectTable( args ) {
11 var destination = args.dest;
14 if( typeof destination == 'string' )
15 destination = $(destination);
16 var builder = new FMObjectBuilder(obj, args);
18 destination.appendChild(builder.build());
23 /* Constructor for the builder object */
24 function FMObjectBuilder( obj, args ) {
26 this.table = elem('table');
27 this.thead = elem('thead');
28 this.tbody = elem('tbody');
29 this.thead_tr = elem('tr');
31 this.display = args.display;
32 this.selectCol = args.selectCol;
33 this.selectColName = args.selectColName;
34 this.selectAllName = args.selectAllName;
35 this.selectNoneName = args.selectNoneName;
37 if(!this.display) this.display = {};
39 this.table.appendChild(this.thead);
40 this.table.appendChild(this.tbody);
41 this.thead.appendChild(this.thead_tr)
43 addCSSClass(this.table, 'fm_table');
44 addCSSClass(this.table, 'sortable');
45 this.table.id = 'fm_table_' + (ID_GEN++);
49 FMObjectBuilder.prototype.getSelected = function() {
51 for( var i = 0; i < this.rows.length; i++ ) {
52 var r = $(this.rows[i]);
53 if( $n(r,'selected') && $n(r,'selected').checked )
54 objs.push(this.obj[i]);
59 /* Builds the table */
60 FMObjectBuilder.prototype.build = function() {
63 if( instanceOf(this.obj, Array) )
65 else this.obj = [this.obj];
70 if( this.selectCol ) {
72 var td = elem('td',null,this.selectColName);
74 var all = elem('a',{href:'javascript:void(0);','class':'fm_select_link' }, this.selectAllName);
75 var none = elem('a',{href:'javascript:void(0);', 'class':'fm_select_link'}, this.selectNoneName);
77 all.onclick = function(){obj.selectAll()};
78 none.onclick = function(){obj.selectNone()};
82 this.thead_tr.appendChild(td);
84 for( var i = 0; i < this.keys.length; i++ )
85 this.thead_tr.appendChild(elem('td',null,this.keys[i]));
87 for( var i = 0; i < this.obj.length; i++ )
88 this.buildObjectRow(this.obj[i]);
95 FMObjectBuilder.prototype.selectAll = function() {
96 for( var i = 0; i < this.rows.length; i++ ) {
97 var r = $(this.rows[i]);
98 $n(r,'selected').checked = true;
102 FMObjectBuilder.prototype.selectNone = function() {
103 for( var i = 0; i < this.rows.length; i++ ) {
104 var r = $(this.rows[i]);
105 $n(r,'selected').checked = false;
111 FMObjectBuilder.prototype.setKeys = function(o) {
113 if( this.display[o.classname] ) {
114 this.keys = this.display[o.classname].fields;
115 this.bold = this.display[o.classname].bold;
118 if(!this.keys && FM_TABLE_DISPLAY[o.classname])
119 this.keys = FM_TABLE_DISPLAY[o.classname].fields;
121 if(!this.bold && FM_TABLE_DISPLAY[o.classname])
122 this.bold = FM_TABLE_DISPLAY[o.classname].bold;
125 this.keys = fmclasses[o.classname];
129 if(sortme) this.keys = this.keys.sort();
132 /* use this method to insert object rows after the table has been rendered */
133 FMObjectBuilder.prototype.add = function(obj) {
135 this.buildObjectRow(obj);
138 /* Inserts one row into the table to represent a single object */
139 FMObjectBuilder.prototype.buildObjectRow = function(obj) {
140 var row = elem('tr');
141 row.id = 'fm_table_' + (ID_GEN++);
142 this.rows.push(row.id);
146 td.appendChild(elem('input',{type:'checkbox',name:'selected'}));
150 for( var i = 0; i < this.keys.length; i++ ) {
152 var data = obj[this.keys[i]]();
153 data = this.munge(data);
154 this.fleshData(td, data, this.keys[i]);
157 this.tbody.appendChild(row);
160 FMObjectBuilder.prototype.munge = function(data) {
162 if(typeof data == 'string') {
163 if( data.match(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/) ) {
164 data = data.replace(/T/,' ');
165 data = data.replace(/:\d{2}-.*/,'');
172 FMObjectBuilder.prototype.dataName = function(data) {
174 if( this.display[data.classname] )
175 name = this.display[data.classname].name;
177 if(!name && FM_TABLE_DISPLAY[data.classname])
178 name = FM_TABLE_DISPLAY[data.classname].name;
180 if(!name) name = 'id';
187 FMObjectBuilder.prototype.fleshData = function(td, data, key) {
188 if(data == null) data = '';
190 if( typeof data == 'object' ) {
193 if( data._isfieldmapper )
194 atext = this.dataName(data);
196 else if (instanceOf(data, Array) )
202 var expand = function () {
204 var row = td.parentNode.nextSibling;
205 if( row && row.getAttribute('subrow') == key) buildme = false;
206 master.hideSubTables();
207 if(buildme) master.buildSubTable(td, data, key);
210 var a = elem('a',{href:'javascript:void(0);'});
212 a.appendChild(text(atext));
216 td.appendChild(text(''));
220 if( this.bold && grep(this.bold,function(i){return (i==key)}) ) {
221 var span = elem('span',{'class':'fm_table_bold'}, data);
222 td.appendChild(span);
224 td.appendChild(text( data ));
229 FMObjectBuilder.prototype.hideSubTables = function() {
231 /* clear out any existing subrows */
232 for( var i = 0; i < this.tbody.childNodes.length; i++ ) {
233 var r = this.tbody.childNodes[i];
234 if( r.getAttribute('subrow') )
235 this.tbody.removeChild(r);
238 /* un-style any selected tds */
239 var tds = this.tbody.getElementsByTagName('td');
240 for( i = 0; i < tds.length; i++ )
241 removeCSSClass( tds[i], 'fm_selected' );
244 FMObjectBuilder.prototype.buildSubTable = function(td, obj, key) {
246 var left = parseInt(td.offsetLeft);
247 var div = elem('div');
248 var row = elem('tr');
249 var subtd= elem('td');
251 if( td.parentNode.nextSibling )
252 this.tbody.insertBefore(row, td.parentNode.nextSibling);
254 this.tbody.appendChild(row);
256 row.appendChild(subtd);
257 row.setAttribute('subrow', key);
258 subtd.appendChild(div);
260 addCSSClass(td, 'fm_selected');
261 subtd.setAttribute('colspan',this.keys.length);
263 subtd.setAttribute('colspan',this.keys.length + 1);
265 subtd.setAttribute('style', 'width: 100%; padding-left:'+left+'px;');
266 var builder = drawFMObjectTable({dest:div, obj:obj, display:this.display});
267 builder.table.setAttribute('style', 'width: auto;');
268 addCSSClass(builder.table, 'fm_selected');
270 var newleft = left - (builder.table.clientWidth / 2) + (td.clientWidth / 2);
272 if( newleft < left ) {
273 if( newleft < 0 ) newleft = 0;
274 newleft = parseInt(newleft);
275 var style = subtd.getAttribute('style');
276 style = style.replace(new RegExp(left), newleft);
277 subtd.setAttribute('style', style);