TableListField = Class.create(); TableListField.prototype = { errorMessage: "Error talking to server", initialize: function() { var rules = {}; rules['#'+this.id+' table.data a.deletelink'] = { onclick: this.deleteRecord.bind(this) }; rules['#'+this.id+' th a'] = { onclick: this.refresh.bind(this) }; rules['#'+this.id+' th'] = { initialize: function() { var sortLinks = $$('span.sortLinkHidden a', this); if(sortLinks) Element.hide(sortLinks[0]); }, onmouseover: function(e) { var sortLinks = $$('span.sortLinkHidden a', this); if(sortLinks) Element.show(sortLinks[0]); }, onmouseout: function(e) { var sortLinks = $$('span.sortLinkHidden a', this); if(sortLinks) Element.hide(sortLinks[0]); } }; rules['#'+this.id+' div.PageControls a'] = {onclick: this.refresh.bind(this)}; rules['#'+this.id+' table.data tr td.markingcheckbox'] = { onclick : function(e) { // do nothing for clicks in marking box cells (e.g. if checkbox is missed) } }; // initialize summary (if needed) // TODO Breaks with nested divs var summaryCols = $$('tfoot tr.summary td', this); this._summaryDefs = []; //should check summaryCols.length, because summaryCols will always be an array, though its length could be 0. if(summaryCols && summaryCols.length) { rules['#'+this.id+' table.data tbody input'] = { onchange: function(e) { if (!e) e = window.event; // stupid IE // workaround for wrong scope with bind(this) and applyTo() var root = Event.findElement(e,'div'); // TODO Fix slow $$()-calls and re-enable clientside summaries //root._summarise(); } }; rules['#'+this.id+' table.data tbody select'] = { onchange: function(e) { if (!e) e = window.event; // stupid IE // workaround for wrong scope with bind(this) and applyTo() var root = Event.findElement(e,'div'); // TODO Fix slow $$()-calls and re-enable clientside summaries //root._summarise(); }.bind(this) }; } Behaviour.register('TableListField_'+this.id,rules); /* if(summaryCols.length) { this._getSummaryDefs(summaryCols); } */ }, /** * Deletes the given dataobject record via an ajax request * to complextablefield->Delete() * @param {Object} e */ deleteRecord: function(e) { var img = Event.element(e); var link = Event.findElement(e,"a"); var row = Event.findElement(e,"tr"); // TODO ajaxErrorHandler and loading-image are dependent on cms, but formfield is in sapphire var confirmed = confirm(ss.i18n._t('TABLEFIELD.DELETECONFIRMMESSAGE', 'Are you sure you want to delete this record?')); if(confirmed) { img.setAttribute("src",'cms/images/network-save.gif'); // TODO doesn't work new Ajax.Request( link.getAttribute("href"), { method: 'post', postBody: 'forceajax=1' + ($('SecurityID') ? '&SecurityID=' + $('SecurityID').value : ''), onComplete: function(){ Effect.Fade( row, { afterFinish: function(obj) { // remove row from DOM obj.element.parentNode.removeChild(obj.element); // recalculate summary if needed (assumes that TableListField.js is present) // TODO Proper inheritance if(this._summarise) this._summarise(); // custom callback if(this.callback_deleteRecord) this.callback_deleteRecord(e); }.bind(this) } ); }.bind(this), onFailure: this.ajaxErrorHandler } ); } Event.stop(e); }, removeById: function(id) { var el =$('record-' + this.id + '-' + id); if(el) el.parentNode.removeChild(el); this._summarise(); }, refresh: function(e) { if(e) { var el = Event.element(e); if(el.nodeName != "a") el = Event.findElement(e,"a"); } else { var el = $(this.id); } if(el.getAttribute('href')) { new Ajax.Request( el.getAttribute('href'), { postBody: 'update=1', onComplete: function(response) { Element.replace(this.id, response.responseText); // reapply behaviour and reattach methods to TF container node // e.g.