From 7f1587466903afb695473334fc7747e10a4e18bb Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 21 Aug 2008 14:35:02 +0000 Subject: [PATCH 1/2] Monotone-Parent: ebfcfa3a765664e839e40597a7fe36e370f2a76c Monotone-Revision: 64979613a77fc7ce9232d0bc7e3f8ba911f6cd92 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2008-08-21T14:35:02 Monotone-Branch: ca.inverse.sogo --- UI/WebServerResources/ContactsUI.js | 58 ++++++++++++++++------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index f620608c1..89ee1da92 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -1,11 +1,15 @@ /* JavaScript for SOGoContacts */ var cachedContacts = {}; -var currentAddressBook = null; var usersRightsWindowHeight = 200; var usersRightsWindowWidth = 450; +var Contact = { + currentAddressBook: null, + currentContact: null +}; + function validateEditorInput(sender) { var errortext = ""; var field; @@ -26,10 +30,10 @@ function validateEditorInput(sender) { } function openContactsFolder(contactsFolder, reload, idx) { - if ((contactsFolder && contactsFolder != currentAddressBook) + if ((contactsFolder && contactsFolder != Contact.currentAddressBook) || reload) { - currentAddressBook = contactsFolder; - var url = URLForFolderID(currentAddressBook) + + Contact.currentAddressBook = contactsFolder; + var url = URLForFolderID(Contact.currentAddressBook) + "/view?noframe=1"; var searchValue = search["value"]; @@ -45,7 +49,7 @@ function openContactsFolder(contactsFolder, reload, idx) { if (idx) { selection = [idx]; } - else if (contactsFolder == currentAddressBook) { + else if (contactsFolder == Contact.currentAddressBook) { var contactsList = $("contactsList"); if (contactsList) selection = contactsList.getSelectedRowsId(); @@ -66,7 +70,7 @@ function openContactsFolder(contactsFolder, reload, idx) { function openContactsFolderAtIndex(element) { var idx = element.getAttribute("idx"); - var url = URLForFolderID(currentAddressBook) + "/view?noframe=1&idx=" + idx; + var url = URLForFolderID(Contact.currentAddressBook) + "/view?noframe=1&idx=" + idx; if (document.contactsListAjaxRequest) { document.contactsListAjaxRequest.aborted = true; @@ -285,12 +289,13 @@ function loadContact(idx) { document.contactAjaxRequest.abort(); } - if (cachedContacts[currentAddressBook + "/" + idx]) { + if (cachedContacts[Contact.currentAddressBook + "/" + idx]) { var div = $('contactView'); - div.innerHTML = cachedContacts[currentAddressBook + "/" + idx]; + Contact.currentContact = idx; + div.innerHTML = cachedContacts[Contact.currentAddressBook + "/" + idx]; } else { - var url = (URLForFolderID(currentAddressBook) + var url = (URLForFolderID(Contact.currentAddressBook) + "/" + idx + "/view?noframe=1"); document.contactAjaxRequest = triggerAjaxRequest(url, contactLoadCallback, idx); @@ -304,7 +309,8 @@ function contactLoadCallback(http) { && http.status == 200) { document.contactAjaxRequest = null; var content = http.responseText; - cachedContacts[currentAddressBook + "/" + http.callbackData] = content; + cachedContacts[Contact.currentAddressBook + "/" + http.callbackData] = content; + Contact.currentContact = http.callbackData; div.innerHTML = content; } else { @@ -346,7 +352,7 @@ function moveTo(uri) { function onContactRowDblClick(event) { var contactId = this.getAttribute('contactid'); - openContactWindow(URLForFolderID(currentAddressBook) + openContactWindow(URLForFolderID(Contact.currentAddressBook) + "/" + contactId + "/edit", contactId); return false; @@ -359,8 +365,10 @@ function onContactSelectionChange(event) { var node = $(rows[0]); loadContact(node.getAttribute('contactid')); } - else if (rows.length > 1) + else if (rows.length > 1) { $('contactView').update(); + Contact.currentContact = null; + } } function onMenuEditContact(event) { @@ -395,7 +403,7 @@ function onToolbarEditSelectedContacts(event) { } for (var i = 0; i < rows.length; i++) { - openContactWindow(URLForFolderID(currentAddressBook) + openContactWindow(URLForFolderID(Contact.currentAddressBook) + "/" + rows[i] + "/edit", rows[i]); } @@ -413,7 +421,7 @@ function onToolbarWriteToSelectedContacts(event) { } openMailComposeWindow(ApplicationBaseURL + "../Mail/compose" - + "?folder=" + currentAddressBook.substring(1) + + "?folder=" + Contact.currentAddressBook.substring(1) + "&uid=" + rows.join("&uid=")); if (document.body.hasClassName("popup")) @@ -428,14 +436,11 @@ function onToolbarDeleteSelectedContacts(event) { if (rows.length) { for (var i = 0; i < rows.length; i++) { - delete cachedContacts[currentAddressBook + "/" + rows[i]]; - var urlstr = (URLForFolderID(currentAddressBook) + "/" + delete cachedContacts[Contact.currentAddressBook + "/" + rows[i]]; + var urlstr = (URLForFolderID(Contact.currentAddressBook) + "/" + rows[i] + "/delete"); triggerAjaxRequest(urlstr, onContactDeleteEventCallback, rows[i]); } - - var contactView = $('contactView'); - contactView.update(); } else { window.alert(labels["Please select a contact."]); @@ -449,6 +454,8 @@ function onContactDeleteEventCallback(http) { if (isHttpStatus204(http.status)) { var row = $(http.callbackData); row.parentNode.removeChild(row); + if (Contact.currentContact == http.callbackData) + $("contactView").update(); } else if (parseInt(http.status) == 403) { var row = $(http.callbackData); @@ -494,7 +501,7 @@ function onHeaderClick(event) { } function newContact(sender) { - openContactWindow(URLForFolderID(currentAddressBook) + "/newcontact"); + openContactWindow(URLForFolderID(Contact.currentAddressBook) + "/newcontact"); return false; /* stop following the link */ } @@ -510,7 +517,8 @@ function onFolderSelectionChange(event) { } $("contactView").update(); - + Contact.currentContact = null; + if (nodes[0].hasClassName("denied")) { var div = $("contactsListContent"); div.update(); @@ -525,12 +533,12 @@ function onFolderSelectionChange(event) { } function refreshCurrentFolder() { - openContactsFolder(currentAddressBook, true); + openContactsFolder(Contact.currentAddressBook, true); } function onConfirmContactSelection(event) { var tag = this.getAttribute("name"); - var folderLi = $(currentAddressBook); + var folderLi = $(Contact.currentAddressBook); var currentAddressBookName = folderLi.innerHTML; var selectorList = null; var initialValues = null; @@ -562,8 +570,8 @@ function onConfirmContactSelection(event) { } function refreshContacts(contactId) { - openContactsFolder(currentAddressBook, true, contactId); - delete cachedContacts[currentAddressBook + "/" + contactId]; + openContactsFolder(Contact.currentAddressBook, true, contactId); + delete cachedContacts[Contact.currentAddressBook + "/" + contactId]; loadContact(contactId); return false; From 6665b3c5835289b73b6bf9b50385ebb793e07f44 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 21 Aug 2008 15:30:51 +0000 Subject: [PATCH 2/2] Monotone-Parent: 64979613a77fc7ce9232d0bc7e3f8ba911f6cd92 Monotone-Revision: f0e213596b61da3ea457a1a0a14230911c3b4fe6 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2008-08-21T15:30:51 Monotone-Branch: ca.inverse.sogo --- UI/WebServerResources/UIxMailEditor.js | 3 - UI/WebServerResources/tablekit.js | 234 +++++++++++++++++-------- 2 files changed, 157 insertions(+), 80 deletions(-) diff --git a/UI/WebServerResources/UIxMailEditor.js b/UI/WebServerResources/UIxMailEditor.js index a31fb4ce6..4a3d575e6 100644 --- a/UI/WebServerResources/UIxMailEditor.js +++ b/UI/WebServerResources/UIxMailEditor.js @@ -485,9 +485,6 @@ function initMailEditor() { if (listContent.length > 0) $("attachmentsArea").setStyle({ display: "block" }); - var list = $("addressList"); - TableKit.Resizable.init(list, {'trueResize' : true, 'keepWidth' : true}); - var textarea = $("text"); var textContent = textarea.getValue(); var sigLimit = textContent.lastIndexOf("--"); diff --git a/UI/WebServerResources/tablekit.js b/UI/WebServerResources/tablekit.js index b51ae9e31..6055724be 100644 --- a/UI/WebServerResources/tablekit.js +++ b/UI/WebServerResources/tablekit.js @@ -2,8 +2,8 @@ * * Copyright (c) 2007 Andrew Tetlaw & Millstream Web Software * http://www.millstream.com.au/view/code/tablekit/ -* Version: 1.2.1 2007-03-11 -* +* Version: 1.3b 2008-03-23 +* * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without @@ -63,19 +63,18 @@ Object.extend(TableKit, { getBodyRows : function(table) { table = $(table); var id = table.id; - if(!TableKit.rows[id]) { - TableKit.rows[id] = (table.tHead && table.tHead.rows.length > 0) ? $A(table.tBodies[0].rows) : $A(table.rows).without(table.rows[0]); + if(!TableKit.tables[id].dom.rows) { + TableKit.tables[id].dom.rows = (table.tHead && table.tHead.rows.length > 0) ? $A(table.tBodies[0].rows) : $A(table.rows).without(table.rows[0]); } - return TableKit.rows[id]; + return TableKit.tables[id].dom.rows; }, getHeaderCells : function(table, cell) { if(!table) { table = $(cell).up('table'); } var id = table.id; - if(!TableKit.heads[id]) { - //TableKit.heads[id] = $A((table.tHead && table.tHead.rows.length > 0) ? table.tHead.rows[table.tHead.rows.length-1].cells : table.rows[0].cells); - TableKit.heads[id] = $A((table.tHead && table.tHead.rows.length > 0) ? table.tHead.rows[0].cells : table.rows[0].cells); + if(!TableKit.tables[id].dom.head) { + TableKit.tables[id].dom.head = $A((table.tHead && table.tHead.rows.length > 0) ? table.tHead.rows[table.tHead.rows.length-1].cells : table.rows[0].cells); } - return TableKit.heads[id]; + return TableKit.tables[id].dom.head; }, getCellIndex : function(cell) { return $A(cell.parentNode.cells).indexOf(cell); @@ -85,30 +84,42 @@ Object.extend(TableKit, { }, getCellText : function(cell, refresh) { if(!cell) { return ""; } - TableKit.registerCell(cell); - var data = TableKit.cells[cell.id]; + var data = TableKit.getCellData(cell); if(refresh || data.refresh || !data.textContent) { data.textContent = cell.textContent ? cell.textContent : cell.innerText; data.refresh = false; } return data.textContent; }, + getCellData : function(cell) { + var t = null; + if(!cell.id) { + t = $(cell).up('table'); + cell.id = t.id + "-cell-" + TableKit._getc(); + } + var tblid = t ? t.id : cell.id.match(/(.*)-cell.*/)[1]; + if(!TableKit.tables[tblid].dom.cells[cell.id]) { + TableKit.tables[tblid].dom.cells[cell.id] = {textContent : '', htmlContent : '', active : false}; + } + return TableKit.tables[tblid].dom.cells[cell.id]; + }, register : function(table, options) { if(!table.id) { - TableKit._tblcount += 1; - table.id = "tablekit-table-" + TableKit._tblcount; + table.id = "tablekit-table-" + TableKit._getc(); } var id = table.id; - TableKit.tables[id] = TableKit.tables[id] ? Object.extend(TableKit.tables[id], options || {}) : Object.extend({sortable:false,resizable:false,editable:false}, options || {}); + TableKit.tables[id] = TableKit.tables[id] ? + Object.extend(TableKit.tables[id], options || {}) : + Object.extend( + {dom : {head:null,rows:null,cells:{}},sortable:false,resizable:false,editable:false}, + options || {} + ); }, - registerCell : function(cell) { - if(!cell.id) { - TableKit._cellcount += 1; - cell.id = "tablekit-cell-" + TableKit._cellcount; - } - if(!TableKit.cells[cell.id]) { - TableKit.cells[cell.id] = {textContent : '', htmlContent : '', active : false}; + notify : function(eventName, table, event) { + if(TableKit.tables[table.id] && TableKit.tables[table.id].observers && TableKit.tables[table.id].observers[eventName]) { + TableKit.tables[table.id].observers[eventName](table, event); } + TableKit.options.observers[eventName](table, event)(); }, isSortable : function(table) { return TableKit.tables[table.id] ? TableKit.tables[table.id].sortable : false; @@ -139,9 +150,6 @@ Object.extend(TableKit, { }, tables : {}, _opcache : {}, - cells : {}, - rows : {}, - heads : {}, options : { autoLoad : true, stripe : true, @@ -154,6 +162,7 @@ Object.extend(TableKit, { columnClass : 'sortcol', descendingClass : 'sortdesc', ascendingClass : 'sortasc', + defaultSortDirection : 1, noSortClass : 'nosort', sortFirstAscendingClass : 'sortfirstasc', sortFirstDecendingClass : 'sortfirstdesc', @@ -165,10 +174,77 @@ Object.extend(TableKit, { formClassName : 'editable-cell-form', noEditClass : 'noedit', editAjaxURI : '/', - editAjaxOptions : {} + editAjaxOptions : {}, + observers : { + 'onSortStart' : function(){}, + 'onSort' : function(){}, + 'onSortEnd' : function(){}, + 'onResizeStart' : function(){}, + 'onResize' : function(){}, + 'onResizeEnd' : function(){}, + 'onEditStart' : function(){}, + 'onEdit' : function(){}, + 'onEditEnd' : function(){} + } + }, + _c : 0, + _getc : function() {return TableKit._c += 1;}, + unloadTable : function(table){ + table = $(table); + if(!TableKit.tables[table.id]) {return;} //if not an existing registered table return + var cells = TableKit.getHeaderCells(table); + var op = TableKit.option('sortable resizable editable noSortClass descendingClass ascendingClass columnClass sortFirstAscendingClass sortFirstDecendingClass', table.id); + //unregister all the sorting and resizing events + cells.each(function(c){ + c = $(c); + if(op.sortable) { + if(!c.hasClassName(op.noSortClass)) { + Event.stopObserving(c, 'mousedown', TableKit.Sortable._sort); + c.removeClassName(op.columnClass); + c.removeClassName(op.sortFirstAscendingClass); + c.removeClassName(op.sortFirstDecendingClass); + //ensure that if table reloaded current sort is remembered via sort first class name + if(c.hasClassName(op.ascendingClass)) { + c.removeClassName(op.ascendingClass); + c.addClassName(op.sortFirstAscendingClass) + } else if (c.hasClassName(op.descendingClass)) { + c.removeClassName(op.descendingClass); + c.addClassName(op.sortFirstDecendingClass) + } + } + } + if(op.resizable) { + Event.stopObserving(c, 'mouseover', TableKit.Resizable.initDetect); + Event.stopObserving(c, 'mouseout', TableKit.Resizable.killDetect); + } + }); + //unregister the editing events and cancel any open editors + if(op.editable) { + Event.stopObserving(table.tBodies[0], 'click', TableKit.Editable._editCell); + for(var c in TableKit.tables[table.id].dom.cells) { + if(TableKit.tables[table.id].dom.cells[c].active) { + var cell = $(c); + var editor = TableKit.Editable.getCellEditor(cell); + editor.cancel(cell); + } + } + } + //delete the cache + TableKit.tables[table.id].dom = {head:null,rows:null,cells:{}}; // TODO: watch this for mem leaks + }, + reloadTable : function(table){ + table = $(table); + TableKit.unloadTable(table); + var op = TableKit.option('sortable resizable editable', table.id); + if(op.sortable) {TableKit.Sortable.init(table);} + if(op.resizable) {TableKit.Resizable.init(table);} + if(op.editable) {TableKit.Editable.init(table);} + }, + reload : function() { + for(var k in TableKit.tables) { + TableKit.reloadTable(k); + } }, - _tblcount : 0, - _cellcount : 0, load : function() { if(TableKit.options.autoLoad) { if(TableKit.options.sortable) { @@ -288,15 +364,16 @@ TableKit.Sortable = { table = table ? $(table) : cell.up('table'); index = TableKit.getCellIndex(cell); } - var op = TableKit.option('noSortClass descendingClass ascendingClass', table.id); + var op = TableKit.option('noSortClass descendingClass ascendingClass defaultSortDirection', table.id); if(cell.hasClassName(op.noSortClass)) {return;} - - order = order ? order : (cell.hasClassName(op.descendingClass) ? 1 : -1); + //TableKit.notify('onSortStart', table); + order = order ? order : op.defaultSortDirection; var rows = TableKit.getBodyRows(table); if(cell.hasClassName(op.ascendingClass) || cell.hasClassName(op.descendingClass)) { rows.reverse(); // if it was already sorted we just need to reverse it. + order = cell.hasClassName(op.descendingClass) ? 1 : -1; } else { var datatype = TableKit.Sortable.getDataType(cell,index,table); var tkst = TableKit.Sortable.types; @@ -317,10 +394,8 @@ TableKit.Sortable = { c.removeClassName(op.descendingClass); if(index === i) { if(order === 1) { - c.removeClassName(op.descendingClass); c.addClassName(op.ascendingClass); } else { - c.removeClassName(op.ascendingClass); c.addClassName(op.descendingClass); } } @@ -341,14 +416,16 @@ TableKit.Sortable = { var cache = colcache[table.id] ? colcache[table.id] : (colcache[table.id] = {}); if(!cache[index]) { - var t = ''; + var t = false; // first look for a data type id on the heading row cell if(cell.id && TableKit.Sortable.types[cell.id]) { - t = cell.id; + t = cell.id + } + if(!t) { + t = $w(cell.className).detect(function(n){ // then look for a data type classname on the heading row cell + return (TableKit.Sortable.types[n]) ? true : false; + }); } - t = cell.classNames().detect(function(n){ // then look for a data type classname on the heading row cell - return (TableKit.Sortable.types[n]) ? true : false; - }); if(!t) { var rows = TableKit.getBodyRows(table); cell = rows[0].cells[index]; // grab same index cell from body row to try and match data type @@ -442,9 +519,14 @@ TableKit.Sortable.addSortType( var mo_num = parseInt(r[2],10)-1; var day_num = r[1]; var hr_num = r[4] ? r[4] : 0; - if(r[7] && r[7].toLowerCase().indexOf('p') !== -1) { - hr_num = parseInt(r[4],10) + 12; - } + if(r[7]) { + var chr = parseInt(r[4],10); + if(r[7].toLowerCase().indexOf('p') !== -1) { + hr_num = chr < 12 ? chr + 12 : chr; + } else if(r[7].toLowerCase().indexOf('a') !== -1) { + hr_num = chr < 12 ? chr : 0; + } + } var min_num = r[5] ? r[5] : 0; var sec_num = r[6] ? r[6] : 0; return new Date(yr_num, mo_num, day_num, hr_num, min_num, sec_num, 0).valueOf(); @@ -458,9 +540,14 @@ TableKit.Sortable.addSortType( var mo_num = parseInt(r[1],10)-1; var day_num = r[2]; var hr_num = r[4] ? r[4] : 0; - if(r[7] && r[7].toLowerCase().indexOf('p') !== -1) { - hr_num = parseInt(r[4],10) + 12; - } + if(r[7]) { + var chr = parseInt(r[4],10); + if(r[7].toLowerCase().indexOf('p') !== -1) { + hr_num = chr < 12 ? chr + 12 : chr; + } else if(r[7].toLowerCase().indexOf('a') !== -1) { + hr_num = chr < 12 ? chr : 0; + } + } var min_num = r[5] ? r[5] : 0; var sec_num = r[6] ? r[6] : 0; return new Date(yr_num, mo_num, day_num, hr_num, min_num, sec_num, 0).valueOf(); @@ -516,7 +603,7 @@ TableKit.Sortable.addSortType( return TableKit.Sortable.Type.compare(new Date(ds + a),new Date(ds + b)); }}), new TableKit.Sortable.Type('currency',{ - pattern : /^[$£¥€¤]/, // dollar,pound,yen,euro,generic currency symbol + pattern : /^[$����]/, // dollar,pound,yen,euro,generic currency symbol normal : function(v) { return v ? parseFloat(v.replace(/[^-\d\.]/g,'')) : 0; }}) @@ -530,21 +617,10 @@ TableKit.Resizable = { var cells = TableKit.getHeaderCells(table); cells.each(function(c){ c = $(c); - //log ("init on " + c.firstChild.nodeValue); Event.observe(c, 'mouseover', TableKit.Resizable.initDetect); Event.observe(c, 'mouseout', TableKit.Resizable.killDetect); }); }, - reload : function(table) { - table = $(table); - var cells = TableKit.getHeaderCells(table); - cells.each(function(c){ - c = $(c); - Event.stopObserving(c, 'mouseover', TableKit.Resizable.initDetect); - Event.stopObserving(c, 'mouseout', TableKit.Resizable.killDetect); - }); - TableKit.Resizable.init(table); - }, resize : function(table, index, w) { var cell; if(typeof index === 'number') { @@ -561,6 +637,7 @@ TableKit.Resizable = { } var pad = parseInt(cell.getStyle('paddingLeft'),10) + parseInt(cell.getStyle('paddingRight'),10); w = Math.max(w-pad, TableKit.option('minWidth', table.id)[0]); + cell.setStyle({'width' : w + 'px'}); }, initDetect : function(e) { @@ -584,14 +661,13 @@ TableKit.Resizable = { e = TableKit.e(e); TableKit.Resizable._onHandle = false; var cell = Event.element(e); - if (!cell.tagName || cell.tagName != 'TD') return; Event.stopObserving(cell, 'mousemove', TableKit.Resizable.detectHandle); Event.stopObserving(cell, 'mousedown', TableKit.Resizable.startResize); cell.removeClassName(TableKit.option('resizeOnHandleClass', cell.up('table').id)[0]); }, startResize : function(e) { e = TableKit.e(e); - if(!TableKit.Resizable._onHandle) { return;} + if(!TableKit.Resizable._onHandle) {return;} var cell = Event.element(e); Event.stopObserving(cell, 'mousemove', TableKit.Resizable.detectHandle); Event.stopObserving(cell, 'mousedown', TableKit.Resizable.startResize); @@ -601,7 +677,7 @@ TableKit.Resizable = { TableKit.Resizable._tbl = table; if(TableKit.option('showHandle', table.id)[0]) { TableKit.Resizable._handle = $(document.createElement('div')).addClassName('resize-handle').setStyle({ - 'top' : Position.cumulativeOffset(cell)[1] + 'px', + 'top' : cell.cumulativeOffset()[1] + 'px', 'left' : Event.pointerX(e) + 'px', 'height' : table.getDimensions().height + 'px' }); @@ -614,7 +690,7 @@ TableKit.Resizable = { endResize : function(e) { e = TableKit.e(e); var cell = TableKit.Resizable._cell; - TableKit.Resizable.resize(null, cell, (Event.pointerX(e) - Position.cumulativeOffset(cell)[0])); + TableKit.Resizable.resize(null, cell, (Event.pointerX(e) - cell.cumulativeOffset()[0])); Event.stopObserving(document, 'mousemove', TableKit.Resizable.drag); Event.stopObserving(document, 'mouseup', TableKit.Resizable.endResize); if(TableKit.option('showHandle', TableKit.Resizable._tbl.id)[0]) { @@ -630,7 +706,7 @@ TableKit.Resizable = { e = TableKit.e(e); if(TableKit.Resizable._handle === null) { try { - TableKit.Resizable.resize(TableKit.Resizable._tbl, TableKit.Resizable._cell, (Event.pointerX(e) - Position.cumulativeOffset(TableKit.Resizable._cell)[0])); + TableKit.Resizable.resize(TableKit.Resizable._tbl, TableKit.Resizable._cell, (Event.pointerX(e) - TableKit.Resizable._cell.cumulativeOffset()[0])); } catch(e) {} } else { TableKit.Resizable._handle.setStyle({'left' : Event.pointerX(e) + 'px'}); @@ -638,7 +714,7 @@ TableKit.Resizable = { return false; }, pointerPos : function(element, x, y) { - var offset = Position.cumulativeOffset(element); + var offset = $(element).cumulativeOffset(); return (y >= offset[1] && y < offset[1] + element.offsetHeight && x >= offset[0] + element.offsetWidth - 5 && @@ -661,9 +737,13 @@ TableKit.Editable = { _editCell : function(e) { e = TableKit.e(e); var cell = Event.findElement(e,'td'); - TableKit.Editable.editCell(null, cell); + if(cell) { + TableKit.Editable.editCell(null, cell, null, e); + } else { + return false; + } }, - editCell : function(table, index, cindex) { + editCell : function(table, index, cindex, event) { var cell, row; if(typeof index === 'number') { if(!table || (table.tagName && table.tagName !== "TABLE")) {return;} @@ -677,7 +757,7 @@ TableKit.Editable = { row = $(table.tBodies[0].rows[index]); cell = $(row.cells[cindex]); } else { - cell = $(index); + cell = $(event ? Event.findElement(event, 'td') : index); table = (table && table.tagName && table.tagName !== "TABLE") ? $(table) : cell.up('table'); row = cell.up('tr'); } @@ -687,21 +767,25 @@ TableKit.Editable = { var head = $(TableKit.getHeaderCells(table, cell)[TableKit.getCellIndex(cell)]); if(head.hasClassName(op.noEditClass)) {return;} - TableKit.registerCell(cell); - var data = TableKit.cells[cell.id]; + var data = TableKit.getCellData(cell); if(data.active) {return;} data.htmlContent = cell.innerHTML; - var ftype = TableKit.Editable.types['text-input']; + var ftype = TableKit.Editable.getCellEditor(null,null,head); + ftype.edit(cell, event); + data.active = true; + }, + getCellEditor : function(cell, table, head) { + var head = head ? head : $(TableKit.getHeaderCells(table, cell)[TableKit.getCellIndex(cell)]); + var ftype = TableKit.Editable.types['text-input']; if(head.id && TableKit.Editable.types[head.id]) { ftype = TableKit.Editable.types[head.id]; } else { - var n = head.classNames().detect(function(n){ + var n = $w(head.className).detect(function(n){ return (TableKit.Editable.types[n]) ? true : false; }); ftype = n ? TableKit.Editable.types[n] : ftype; } - ftype.edit(cell); - data.active = true; + return ftype; }, types : {}, addCellEditor : function(o) { @@ -793,7 +877,7 @@ TableKit.Editable.CellEditor.prototype = { this.ajax = new Ajax.Updater(cell, op.ajaxURI || TableKit.option('editAjaxURI', table.id)[0], Object.extend(op.ajaxOptions || TableKit.option('editAjaxOptions', table.id)[0], { postBody : s, onComplete : function() { - var data = TableKit.cells[cell.id]; + var data = TableKit.getCellData(cell); data.active = false; data.refresh = true; // mark cell cache for refreshing, in case cell contents has changed and sorting is applied } @@ -806,7 +890,7 @@ TableKit.Editable.CellEditor.prototype = { }, cancel : function(cell) { this.ajax = null; - var data = TableKit.cells[cell.id]; + var data = TableKit.getCellData(cell); cell.innerHTML = data.htmlContent; data.htmlContent = ''; data.active = false; @@ -851,8 +935,4 @@ TableKit.Bench = { } } */ -if(window.FastInit) { - FastInit.addOnLoad(TableKit.load); -} else { - Event.observe(window, 'load', TableKit.load); -} +document.observe("dom:loaded", TableKit.load);