| | |
| | | this.BACKSPACE_KEY = 8; |
| | | |
| | | this.list = list ? list : null; |
| | | this.tagname = this.list ? this.list.nodeName.toLowerCase() : 'table'; |
| | | this.thead; |
| | | this.tbody; |
| | | this.frame = null; |
| | | this.rows = []; |
| | | this.selection = []; |
| | |
| | | this.focused = false; |
| | | this.drag_mouse_start = null; |
| | | this.dblclick_time = 600; |
| | | this.row_init = function(){}; |
| | | this.row_init = function(){}; // @deprecated; use list.addEventListener('initrow') instead |
| | | |
| | | // overwrite default paramaters |
| | | if (p && typeof p === 'object') |
| | |
| | | */ |
| | | init: function() |
| | | { |
| | | if (this.list && this.list.tBodies[0]) { |
| | | if (this.tagname == 'table' && this.list && this.list.tBodies[0]) { |
| | | this.thead = this.list.tHead; |
| | | this.tbody = this.list.tBodies[0]; |
| | | } |
| | | else if (this.tagname != 'table' && this.list) { |
| | | this.tbody = this.list; |
| | | } |
| | | |
| | | if (this.tbody) { |
| | | this.rows = []; |
| | | this.rowcount = 0; |
| | | |
| | | var r, len, rows = this.list.tBodies[0].rows; |
| | | var r, len, rows = this.tbody.childNodes; |
| | | |
| | | for (r=0, len=rows.length; r<len; r++) { |
| | | this.init_row(rows[r]); |
| | |
| | | if (document.all) |
| | | row.onselectstart = function() { return false; }; |
| | | |
| | | this.row_init(this.rows[uid]); |
| | | this.row_init(this.rows[uid]); // legacy support |
| | | this.triggerEvent('initrow', this.rows[uid]); |
| | | } |
| | | }, |
| | | |
| | |
| | | */ |
| | | init_header: function() |
| | | { |
| | | if (this.list && this.list.tHead) { |
| | | if (this.thead) { |
| | | this.colcount = 0; |
| | | |
| | | var col, r, p = this; |
| | | // add events for list columns moving |
| | | if (this.column_movable && this.list.tHead && this.list.tHead.rows) { |
| | | for (r=0; r<this.list.tHead.rows[0].cells.length; r++) { |
| | | if (this.column_movable && this.thead && this.thead.rows) { |
| | | for (r=0; r<this.thead.rows[0].cells.length; r++) { |
| | | if (this.column_fixed == r) |
| | | continue; |
| | | col = this.list.tHead.rows[0].cells[r]; |
| | | col = this.thead.rows[0].cells[r]; |
| | | col.onmousedown = function(e){ return p.drag_column(e, this); }; |
| | | this.colcount++; |
| | | } |
| | |
| | | */ |
| | | clear: function(sel) |
| | | { |
| | | var tbody = document.createElement('tbody'); |
| | | if (this.tagname == 'table') { |
| | | var tbody = document.createElement('tbody'); |
| | | this.list.insertBefore(tbody, this.tbody); |
| | | this.list.removeChild(this.list.tBodies[1]); |
| | | this.tbody = tbody; |
| | | } |
| | | else { |
| | | $(this.row_tagname() + ':not(.thead)', this.tbody).remove(); |
| | | } |
| | | |
| | | this.list.insertBefore(tbody, this.list.tBodies[0]); |
| | | this.list.removeChild(this.list.tBodies[1]); |
| | | this.rows = []; |
| | | this.rowcount = 0; |
| | | |
| | |
| | | */ |
| | | remove_row: function(uid, sel_next) |
| | | { |
| | | var obj = this.rows[uid] ? this.rows[uid].obj : null; |
| | | var node = this.rows[uid] ? this.rows[uid].obj : null; |
| | | |
| | | if (!obj) |
| | | if (!node) |
| | | return; |
| | | |
| | | obj.style.display = 'none'; |
| | | node.style.display = 'none'; |
| | | |
| | | if (sel_next) |
| | | this.select_next(); |
| | |
| | | */ |
| | | insert_row: function(row, attop) |
| | | { |
| | | var tbody = this.list.tBodies[0]; |
| | | var tbody = this.tbody; |
| | | |
| | | if (attop && tbody.rows.length) |
| | | // create a real dom node first |
| | | if (row.nodeName === undefined) { |
| | | // for performance reasons use DOM instead of jQuery here |
| | | var domrow = document.createElement(this.row_tagname()); |
| | | if (row.id) domrow.id = row.id; |
| | | if (row.className) domrow.className = row.className; |
| | | if (row.style) $.extend(domrow.style, row.style); |
| | | |
| | | for (var domcell, col, i=0; row.cols && i < row.cols.length; i++) { |
| | | col = row.cols[i]; |
| | | domcell = document.createElement(this.col_tagname()); |
| | | if (col.className) domcell.className = col.className; |
| | | if (col.innerHTML) domcell.innerHTML = col.innerHTML; |
| | | domrow.appendChild(domcell); |
| | | } |
| | | |
| | | row = domrow; |
| | | } |
| | | |
| | | if (attop && tbody.childNodes.length) |
| | | tbody.insertBefore(row, tbody.firstChild); |
| | | else |
| | | tbody.appendChild(row); |
| | |
| | | this.rowcount++; |
| | | }, |
| | | |
| | | /** |
| | | * |
| | | */ |
| | | update_row: function(id, cols, newid, select) |
| | | { |
| | | var row = this.rows[id]; |
| | | if (!row) return false; |
| | | |
| | | var domrow = row.obj; |
| | | for (var domcell, col, i=0; cols && i < cols.length; i++) { |
| | | this.get_cell(domrow, i).html(cols[i]); |
| | | } |
| | | |
| | | if (newid) { |
| | | delete this.rows[id]; |
| | | domrow.id = 'rcmrow' + newid; |
| | | this.init_row(domrow); |
| | | |
| | | if (select) |
| | | this.selection[0] = newid; |
| | | } |
| | | }, |
| | | |
| | | |
| | | /** |
| | |
| | | this.add_dragfix(); |
| | | |
| | | // find selected column number |
| | | for (var i=0; i<this.list.tHead.rows[0].cells.length; i++) { |
| | | if (col == this.list.tHead.rows[0].cells[i]) { |
| | | for (var i=0; i<this.thead.rows[0].cells.length; i++) { |
| | | if (col == this.thead.rows[0].cells[i]) { |
| | | this.selected_column = i; |
| | | break; |
| | | } |
| | |
| | | this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj }); |
| | | } |
| | | else { |
| | | var tbody = this.list.tBodies[0]; |
| | | var tbody = this.tbody; |
| | | new_row = tbody.firstChild; |
| | | depth = 0; |
| | | last_expanded_parent_depth = 0; |
| | |
| | | return false; |
| | | } |
| | | else { |
| | | new_row = this.list.tBodies[0].firstChild; |
| | | new_row = this.tbody.firstChild; |
| | | depth = 0; |
| | | } |
| | | |
| | |
| | | this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj }); |
| | | } |
| | | else { |
| | | new_row = this.list.tBodies[0].firstChild; |
| | | new_row = this.tbody.firstChild; |
| | | depth = 0; |
| | | } |
| | | |
| | |
| | | get_first_row: function() |
| | | { |
| | | if (this.rowcount) { |
| | | var i, len, rows = this.list.tBodies[0].rows; |
| | | var i, len, rows = this.tbody.childNodes; |
| | | |
| | | for (i=0, len=rows.length-1; i<len; i++) |
| | | if (rows[i].id && String(rows[i].id).match(/^rcmrow([a-z0-9\-_=\+\/]+)/i) && this.rows[RegExp.$1] != null) |
| | |
| | | get_last_row: function() |
| | | { |
| | | if (this.rowcount) { |
| | | var i, rows = this.list.tBodies[0].rows; |
| | | var i, rows = this.tbody.childNodes; |
| | | |
| | | for (i=rows.length-1; i>=0; i--) |
| | | if (rows[i].id && String(rows[i].id).match(/^rcmrow([a-z0-9\-_=\+\/]+)/i) && this.rows[RegExp.$1] != null) |
| | |
| | | return null; |
| | | }, |
| | | |
| | | row_tagname: function() |
| | | { |
| | | var row_tagnames = { table:'tr', ul:'li', '*':'div' }; |
| | | return row_tagnames[this.tagname] || row_tagnames['*']; |
| | | }, |
| | | |
| | | col_tagname: function() |
| | | { |
| | | var col_tagnames = { table:'td', '*':'span' }; |
| | | return col_tagnames[this.tagname] || col_tagnames['*']; |
| | | }, |
| | | |
| | | get_cell: function(row, index) |
| | | { |
| | | return $(this.col_tagname(), row).eq(index); |
| | | }, |
| | | |
| | | /** |
| | | * selects or unselects the proper row depending on the modifier key pressed |
| | |
| | | this.shift_start = id; |
| | | |
| | | var n, i, j, to_row = this.rows[id], |
| | | from_rowIndex = this.rows[this.shift_start].obj.rowIndex, |
| | | to_rowIndex = to_row.obj.rowIndex; |
| | | from_rowIndex = this._rowIndex(this.rows[this.shift_start].obj), |
| | | to_rowIndex = this._rowIndex(to_row.obj); |
| | | |
| | | if (!to_row.expanded && to_row.has_children) |
| | | if (to_row = this.rows[(this.row_children(id)).pop()]) |
| | | to_rowIndex = to_row.obj.rowIndex; |
| | | to_rowIndex = this._rowIndex(to_row.obj); |
| | | |
| | | i = ((from_rowIndex < to_rowIndex) ? from_rowIndex : to_rowIndex), |
| | | j = ((from_rowIndex > to_rowIndex) ? from_rowIndex : to_rowIndex); |
| | | |
| | | // iterate through the entire message list |
| | | for (n in this.rows) { |
| | | if (this.rows[n].obj.rowIndex >= i && this.rows[n].obj.rowIndex <= j) { |
| | | if (this._rowIndex(this.rows[n].obj) >= i && this._rowIndex(this.rows[n].obj) <= j) { |
| | | if (!this.in_selection(n)) { |
| | | this.highlight_row(n, true); |
| | | } |
| | |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * Helper method to emulate the rowIndex property of non-tr elements |
| | | */ |
| | | _rowIndex: function(obj) |
| | | { |
| | | return (obj.rowIndex !== undefined) ? obj.rowIndex : $(obj).prevAll().length; |
| | | }, |
| | | |
| | | /** |
| | | * Check if given id is part of the current selection |
| | |
| | | this.draglayer.html(''); |
| | | |
| | | // get subjects of selected messages |
| | | var i, n, obj; |
| | | var i, n, obj, me; |
| | | for (n=0; n<this.selection.length; n++) { |
| | | // only show 12 lines |
| | | if (n>12) { |
| | |
| | | break; |
| | | } |
| | | |
| | | me = this; |
| | | if (obj = this.rows[this.selection[n]].obj) { |
| | | for (i=0; i<obj.childNodes.length; i++) { |
| | | if (obj.childNodes[i].nodeName == 'TD') { |
| | | if (n == 0) |
| | | this.drag_start_pos = $(obj.childNodes[i]).offset(); |
| | | $('> '+this.col_tagname(), obj).each(function(i,elem){ |
| | | if (n == 0) |
| | | me.drag_start_pos = $(elem).offset(); |
| | | |
| | | if (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == i)) { |
| | | var subject = $(obj.childNodes[i]).text(); |
| | | if (me.subject_col < 0 || (me.subject_col >= 0 && me.subject_col == i)) { |
| | | var subject = $(elem).text(); |
| | | |
| | | if (!subject) |
| | | break; |
| | | |
| | | if (subject) { |
| | | // remove leading spaces |
| | | subject = $.trim(subject); |
| | | // truncate line to 50 characters |
| | | subject = (subject.length > 50 ? subject.substring(0, 50) + '...' : subject); |
| | | |
| | | var entry = $('<div>').text(subject); |
| | | this.draglayer.append(entry); |
| | | break; |
| | | me.draglayer.append(entry); |
| | | } |
| | | |
| | | return false; // break |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | if (!this.col_draglayer) { |
| | | var lpos = $(this.list).offset(), |
| | | cells = this.list.tHead.rows[0].cells; |
| | | cells = this.thead.rows[0].cells; |
| | | |
| | | // create dragging layer |
| | | this.col_draglayer = $('<div>').attr('id', 'rcmcoldraglayer') |
| | |
| | | */ |
| | | column_replace: function(from, to) |
| | | { |
| | | var len, cells = this.list.tHead.rows[0].cells, |
| | | // only supported for <table> lists |
| | | if (!this.thead || !this.thead.rows) |
| | | return; |
| | | |
| | | var len, cells = this.thead.rows[0].cells, |
| | | elem = cells[from], |
| | | before = cells[to], |
| | | td = document.createElement('td'); |
| | |
| | | cells[0].parentNode.replaceChild(elem, td); |
| | | |
| | | // replace list cells |
| | | for (r=0, len=this.list.tBodies[0].rows.length; r<len; r++) { |
| | | row = this.list.tBodies[0].rows[r]; |
| | | for (r=0, len=this.tbody.rows.length; r<len; r++) { |
| | | row = this.tbody.rows[r]; |
| | | |
| | | elem = row.cells[from]; |
| | | before = row.cells[to]; |