1 // Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
\r
3 // Permission is hereby granted, free of charge, to any person obtaining
\r
4 // a copy of this software and associated documentation files (the
\r
5 // "Software"), to deal in the Software without restriction, including
\r
6 // without limitation the rights to use, copy, modify, merge, publish,
\r
7 // distribute, sublicense, and/or sell copies of the Software, and to
\r
8 // permit persons to whom the Software is furnished to do so, subject to
\r
9 // the following conditions:
\r
11 // The above copyright notice and this permission notice shall be
\r
12 // included in all copies or substantial portions of the Software.
\r
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
22 Grid = Class.create();
\r
24 container: 'grid_container',
\r
26 baseTable: 'grid_baseTable',
\r
27 baseRow: 'grid_baseRow',
\r
28 baseCell: 'grid_baseCell',
\r
30 headerTable: 'grid_headerTable',
\r
31 headerRow: 'grid_headerRow',
\r
32 headerCell: 'grid_headerCell',
\r
33 headerCellDrag: 'grid_headerCellDrag',
\r
34 headerCellSort: 'grid_headerCellVal',
\r
36 idTable: 'grid_idTable',
\r
37 idRow: 'grid_idRow',
\r
38 idCell: 'grid_idCell',
\r
39 idCellVal: 'grid_idCellVal',
\r
41 cellTable: 'grid_cellTable',
\r
42 cellTbody: 'grid_cellTbody',
\r
43 cellRow: 'grid_cellRow',
\r
45 cellVal: 'grid_cellVal',
\r
46 cellSelected: 'grid_cellSelected',
\r
47 state: 'grid_state',
\r
48 stateEmpty: 'grid_stateEmpty',
\r
49 stateOpen: 'grid_stateOpen',
\r
50 stateClose: 'grid_stateClose',
\r
52 inplaceEditor: 'grid_inplaceEditor'
\r
55 Grid.scrollLeft = 0;
\r
57 Grid.options.baseTable = {
\r
63 Grid.options.headerTable = {
\r
69 Grid.options.idTable = {
\r
75 Grid.options.cellTable = {
\r
83 initialize : function(element) {
\r
85 this.element = $(element);
\r
86 Element.setStyle(this.element, {visibility: 'hidden'});
\r
87 Element.hide(this.element);
\r
89 var options = Object.extend({
\r
90 cssPrefix: 'custum_',
\r
93 cellDefaultWidth: 72,
\r
94 cellDefaultHeight: 25,
\r
95 defaultRowLength: 10,
\r
102 updateGridReceiver: '',
\r
104 hierarchyCol: false,
\r
105 hierarchyIndent: 20,
\r
107 }, arguments[1] || {});
\r
109 this.options = options;
\r
110 this.custumCss = CssUtil.appendPrefix(options.cssPrefix, Grid.className);
\r
111 this.cssUtil = new CssUtil([Grid.className, this.custumCss]);
\r
112 this.cssUtil.addClassNames(this.element, 'container');
\r
113 this.hierarchyCol = this.options.hierarchyCol ? $(this.options.hierarchyCol) : false;
\r
114 this.hierarchyColIndex = this.hierarchyCol ? this.hierarchyCol.cellIndex : 0;
\r
115 Element.makePositioned(this.element);
\r
116 Position.includeScrollOffsets = true;
\r
117 this.stateDivWidth = parseInt(CssUtil.getCssRuleBySelectorText('.' + Grid.className.state).style.width, 10);
\r
119 this.marginSize = this.options.marginSize ? this.options.marginSize : 4;
\r
120 this.stateIndent = 15;
\r
122 this.rowIdBase = this.element.id + '_row_';
\r
123 this.topLevelList = new Array();
\r
124 this.removeList = new Array();
\r
126 this.removeList.each(function(r) {
\r
127 r.parentNode.removeChild(r);
\r
129 var sortOptions = {
\r
130 relate : this.idTable,
\r
131 handle:this.headerTable,
\r
132 callBack:this.finishSort.bind(this)
\r
134 sortOptions = $H(sortOptions).merge(this.options.sortOptions);
\r
135 this.sortTable = new SortableTableGridEx(this.cellTable, sortOptions);
\r
136 Element.setStyle(this.element, {visibility: 'visible'});
\r
137 Element.show(this.element);
\r
140 build: function() {
\r
141 Element.cleanWhitespace(this.element);
\r
142 this.cellTable = this.element.childNodes[0];
\r
143 Element.cleanWhitespace(this.cellTable);
\r
145 this.colLength = this.cellTable.tHead.rows[0].cells.length;
\r
146 this.rowLength = this.cellTable.tBodies[0].rows.length;
\r
147 if (this.rowLength == 0)this.rowLength = this.options.defaultRowLength;
\r
148 this.buildBaseTable();
\r
149 this.buildHeaderTable();
\r
150 this.buildIdTable();
\r
151 this.buildCellTable();
\r
153 Event.observe(this.element, 'scroll', this.fixTablePosition.bindAsEventListener(this));
\r
156 buildBaseTable: function() {
\r
158 this.baseTable = Builder.node('table', Grid.options.baseTable);
\r
159 this.cssUtil.addClassNames(this.baseTable, 'baseTable');
\r
160 with (this.baseTable.style) {
\r
161 width = this.options.baseWidth + 'px';
\r
162 height = this.options.baseHeight + 'px';
\r
163 position = 'absolute';
\r
164 top = this.options.baseTop + 'px';
\r
165 left = this.options.baseLeft + 'px';
\r
168 var row = this.baseTable.insertRow(0);
\r
169 var cell = row.insertCell(0);
\r
171 this.cssUtil.addClassNames(row, 'baseRow');
\r
172 this.cssUtil.addClassNames(cell, 'baseCell');
\r
174 this.element.appendChild(this.baseTable);
\r
177 buildHeaderTable: function() {
\r
178 this.headerTable = Builder.node('table', Grid.options.headerTable);
\r
179 this.cssUtil.addClassNames(this.headerTable, 'headerTable');
\r
181 var thead = this.cellTable.tHead;
\r
182 var row = thead.rows[0];
\r
183 row.id = this.element.id + '_headerTable_row';
\r
184 var cells = row.cells;
\r
185 Element.cleanWhitespace(thead);
\r
186 Element.cleanWhitespace(row);
\r
188 this.cssUtil.addClassNames(row, 'headerRow');
\r
189 for (var i = 0; i < cells.length; i++) {
\r
190 var cell = cells[i];
\r
191 var value = cell.firstChild;
\r
192 var title = cell.innerHTML;
\r
193 this.buildHeaderCell(cell, title, i);
\r
194 this.removeList.push(value);
\r
196 this.headerTable.appendChild(thead);
\r
197 with (this.headerTable.style) {
\r
198 width = this.options.cellDefaultWidth * this.colLength + 'px';
\r
199 height = this.baseTable.style.height;
\r
200 position= 'absolute';
\r
201 top = Element.getStyle(this.baseTable, 'top');
\r
202 left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';
\r
204 this.element.appendChild(this.headerTable);
\r
209 handle:Grid.className.headerCellDrag,
\r
211 overlap:'horizontal',
\r
212 scroll:this.element,
\r
213 onUpdate:this.updateCellLine.bind(this)
\r
217 buildHeaderCell : function(cell, title, index) {
\r
219 cell.id = this.element.id + '_header_col_' + index;
\r
221 var drag = Builder.node('div');
\r
222 var sort = Builder.node('div');
\r
224 this.cssUtil.addClassNames(cell, 'headerCell');
\r
225 this.cssUtil.addClassNames(drag, 'headerCellDrag');
\r
226 this.cssUtil.addClassNames(sort, 'headerCellSort');
\r
228 cell.style.width = this.options.cellDefaultWidth + 'px';
\r
229 var dragWidth = parseInt(Element.getStyle(cell, 'width')) - (this.marginSize * 2);
\r
230 var sortWidth = dragWidth - (this.marginSize * 2);
\r
231 var cellHeight = this.options.baseHeight - (Grid.options.headerTable.border * 4);
\r
232 with (drag.style) {
\r
233 width = dragWidth + 'px';
\r
234 height = cellHeight + 'px';
\r
235 marginLeft = this.marginSize + 'px';
\r
236 marginRight = this.marginSize + 'px';
\r
238 with (sort.style) {
\r
239 width = sortWidth + 'px';
\r
240 height = cellHeight + 'px';
\r
241 marginLeft = this.marginSize + 'px';
\r
242 marginRight = this.marginSize + 'px';
\r
245 sort.innerHTML = title;
\r
246 drag.appendChild(sort);
\r
247 cell.appendChild(drag);
\r
249 new ResizeableGridEx(cell, {minWidth: this.options.cellMinWidth, top:0,right:2, bottom:0, left:0 ,draw:this.updateCellWidth.bind(this)});
\r
250 Event.observe(cell, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
\r
251 Event.observe(drag, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
\r
252 Event.observe(sort, 'mousedown', this.setSelectedColumn.bindAsEventListener(this));
\r
255 buildIdTable: function() {
\r
257 this.idTable = Builder.node('table', Grid.options.idTable);
\r
258 this.cssUtil.addClassNames(this.idTable, 'idTable');
\r
259 for (var i = 0; i < this.rowLength; i++) {
\r
261 var row = this.idTable.insertRow(i);
\r
262 this.buildIdRow(row, i);
\r
265 with(this.idTable.style) {
\r
266 width = this.options.baseWidth + 'px';
\r
267 position = 'absolute';
\r
268 top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';
\r
269 left = Element.getStyle(this.baseTable, 'left');
\r
272 this.element.appendChild(this.idTable);
\r
273 var tbody = this.idTable.tBodies[0];
\r
274 tbody.id = this.element.id + '_idTable_tbody';
\r
279 handle:Grid.className.idCellVal,
\r
280 scroll:this.element,
\r
282 overlap:'vertical',
\r
283 onUpdate:this.updateRowLine.bind(this)
\r
287 buildIdRow : function(row, index) {
\r
288 row.id = this.rowIdBase + '_id_' + index;
\r
290 var cell = row.insertCell(0);
\r
291 var valueDiv = Builder.node('div');
\r
293 this.cssUtil.addClassNames(row, 'idRow');
\r
294 this.cssUtil.addClassNames(cell, 'idCell');
\r
295 this.cssUtil.addClassNames(valueDiv, 'idCellVal');
\r
297 with (cell.style) {
\r
298 width = this.options.baseWidth + 'px';
\r
299 height = this.options.cellDefaultHeight + 'px';
\r
301 with (valueDiv.style) {
\r
302 marginTop = this.marginSize + 'px';
\r
303 marginBottom = this.marginSize + 'px';
\r
304 width = this.options.baseWidth - (Grid.options.idTable.border * 4) + 'px';
\r
305 height = this.options.cellDefaultHeight - (this.marginSize * 2) + 'px';
\r
308 valueDiv.innerHTML = index + 1;
\r
309 cell.appendChild(valueDiv);
\r
311 new ResizeableGridEx(cell, {minHeight: this.options.cellMinHeight, top:0, right: 0, bottom: 2, left: 0, draw:this.updateCellHeight.bind(this)});
\r
313 Event.observe(row, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
\r
314 Event.observe(cell, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
\r
315 Event.observe(valueDiv, 'mousedown', this.setSelectedRow.bindAsEventListener(this));
\r
318 buildCellTable: function() {
\r
319 var tbody = this.cellTable.tBodies[0];
\r
320 Element.cleanWhitespace(tbody);
\r
321 with(this.cellTable){
\r
322 border = Grid.options.cellTable.border;
\r
323 cellSpacing = Grid.options.cellTable.cellSpacing;
\r
324 cellPadding = Grid.options.cellTable.cellPadding;
\r
326 this.cssUtil.addClassNames(this.cellTable, 'cellTable');
\r
327 this.cssUtil.addClassNames(tbody, 'cellTbody');
\r
328 this.element.appendChild(this.cellTable);
\r
329 var rows = this.cellTable.rows;
\r
331 if (!rows || rows.length == 0) {
\r
332 for(var i = 0; i < this.rowLength; i++) {
\r
334 var newRow = this.cellTable.insertRow(i);
\r
335 newRow.id = this.rowIdBase + i;
\r
336 this.cssUtil.addClassNames(newRow, 'cellRow');
\r
338 for (var j = 0; j < this.colLength; j++) {
\r
339 var newCell = newRow.insertCell(j);
\r
340 this.buildCell(newCell, j, "");
\r
342 if (this.options.hierarchy) {
\r
343 this.setHierarchyRow(newRow);
\r
348 for (var i = 0; i < this.rowLength; i++) {
\r
350 Element.cleanWhitespace(row);
\r
351 this.cssUtil.addClassNames(row, 'cellRow');
\r
352 row.id = this.rowIdBase + i;
\r
353 var cells = row.cells;
\r
355 for (var j = 0; j < cells.length; j++) {
\r
356 var cell = cells[j];
\r
357 Element.cleanWhitespace(cell);
\r
358 this.buildCell(cell, j, Element.collectTextNodes(cell));
\r
359 this.removeList.push(cell.firstChild);
\r
361 if (this.options.hierarchy) {
\r
362 this.setHierarchyRow(row);
\r
367 with (this.cellTable.style) {
\r
368 width = this.options.cellDefaultWidth * this.colLength + 'px';
\r
369 position = 'absolute';
\r
370 top = parseInt(Element.getStyle(this.baseTable, 'top')) + parseInt(Element.getStyle(this.baseTable, 'height')) + 'px';
\r
371 left = parseInt(Element.getStyle(this.baseTable, 'left')) + parseInt(Element.getStyle(this.baseTable, 'width')) + 'px';
\r
374 this.cellTable.getIdRow = this.getIdRow.bind(this);
\r
377 buildCell : function(cell, cellIdIndex, value) {
\r
379 var cellValueDiv = Builder.node('div');
\r
380 cellValueDiv.innerHTML = value;
\r
382 cell.appendChild(cellValueDiv);
\r
383 cell.id = cell.parentNode.id + '_col_' + cellIdIndex;
\r
385 this.cssUtil.addClassNames(cell, 'cell');
\r
386 this.cssUtil.addClassNames(cellValueDiv, 'cellVal');
\r
388 with (cell.style) {
\r
389 width = Element.getStyle(this.getHeaderCell(cell), 'width');
\r
390 height = Element.getStyle(this.getIdRow(cell.parentNode).cells[0], 'height');
\r
392 with (cellValueDiv.style) {
\r
393 width = cell.style.width;
\r
394 height = cell.style.height;
\r
396 marginBottom = '0px';
\r
399 Event.observe(cell, 'click', this.setSelectedCell.bindAsEventListener(this));
\r
401 var ajax = new Ajax.InPlaceEditor(cellValueDiv, this.options.cellEditUrl,
\r
403 formClassName: this.cssUtil.joinClassNames('inplaceEditor'),
\r
408 submitOnBlur:true,
\r
409 hoverClassName: "cellHover",
\r
410 highlightcolor: "#becfeb",
\r
411 highlightendcolor: "#becfeb",
\r
412 onComplete: this.showStateDiv.bind(this),
\r
413 callback : this.createInplaceEditorParams.bind(this),
\r
414 formId : cell.id + '_form'
\r
417 cellValueDiv.ajax = ajax;
\r
418 Event.stopObserving(cellValueDiv, 'click', ajax.onclickListener);
\r
419 Event.stopObserving(cellValueDiv, 'mouseover', ajax.mouseoverListener);
\r
420 Event.stopObserving(cellValueDiv, 'mouseout', ajax.mouseoutListener);
\r
423 Event.observe(cellValueDiv, 'dblclick', this.setTextAreaSize.bindAsEventListener(this));
\r
424 if (this.options.hierarchy && cell.cellIndex == this.hierarchyColIndex) {
\r
425 Event.observe(cellValueDiv, 'dblclick', this.hideStateDiv.bindAsEventListener(this));
\r
427 Event.observe(cellValueDiv, 'dblclick', ajax.onclickListener);
\r
431 addColumn: function(index, colTitle, values) {
\r
432 var headerRow = this.headerTable.rows[0];
\r
433 var insertIndex = (!isNaN(index)) ? index : this.colLength;
\r
434 var colIdIndex = this.colLength;
\r
435 var headerCell = headerRow.insertCell(insertIndex);
\r
436 this.buildHeaderCell(headerCell, colTitle, insertIndex);
\r
438 var rows = this.cellTable.rows;
\r
439 var idRows = this.idTable.rows;
\r
440 for (var i = 0; i < rows.length; i++) {
\r
442 var cell = rows[i].insertCell(insertIndex);
\r
443 var cellValue = "";
\r
444 if (values && values[i]) {
\r
445 cellValue = values[i];
\r
447 this.buildCell(cell, colIdIndex, cellValue);
\r
450 this.headerTable.style.width = parseInt(Element.getStyle(this.headerTable, 'width')) + this.options.cellDefaultWidth + 'px';
\r
451 this.cellTable.style.width = this.headerTable.style.width;
\r
453 var sortableOptions = Sortable.options(headerRow);
\r
455 sortableOptions.draggables.push(
\r
461 scroll: this.element,
\r
462 handle: Element.getElementsByClassName(headerCell, Grid.className.headerCellDrag)[0]
\r
466 Droppables.add(headerCell, {overlap:'horizontal', containment:headerRow, onHover:Sortable.onHover, greedy:true});
\r
467 sortableOptions.droppables.push(headerCell);
\r
468 this.sortTable.addEvent(Element.getElementsByClassName(headerCell, Grid.className.headerCellSort)[0]);
\r
469 this.colLength += 1;
\r
472 deleteColumn : function(index) {
\r
473 if((isNaN(index)) || index >= this.colLength) {
\r
476 var headerRow = this.headerTable.rows[0];
\r
477 if (!headerRow) return;
\r
478 var headerCell = headerRow.cells[index];
\r
479 if (!headerCell) return;
\r
481 var width = headerCell.offsetWidth;
\r
482 var rows = this.cellTable.rows;
\r
483 headerRow.deleteCell(index);
\r
485 for (var i = 0; i < rows.length; i++) {
\r
486 rows[i].deleteCell(index);
\r
489 var headerTableWidth = parseInt(Element.getStyle(this.headerTable, 'width')) - width;
\r
491 this.headerTable.style.width = headerTableWidth >= 0 ? headerTableWidth + 'px' : '0px';
\r
492 this.cellTable.style.width = this.headerTable.style.width;
\r
493 this.colLength -= 1;
\r
494 this.fixTablePosition();
\r
497 addRow : function(index, values) {
\r
498 var insertIndex = (!isNaN(index)) ? index : this.idTable.rows.length;
\r
499 var rowIdIndex = this.idTable.rows.length;
\r
500 var idRow = this.idTable.insertRow(index);
\r
501 idRow.id = this.rowIdBase + '_id_' + rowIdIndex;
\r
502 this.buildIdRow(idRow, rowIdIndex);
\r
505 var cellRow = this.cellTable.insertRow(insertIndex);
\r
506 cellRow.id = this.rowIdBase + rowIdIndex;
\r
507 this.cssUtil.addClassNames(cellRow, 'cellRow');
\r
508 var headerCells = this.headerTable.rows[0].cells;
\r
510 for (var i = 0; i < headerCells.length; i++) {
\r
511 var headerCell = headerCells[i];
\r
512 var colIdIndex = headerCell.id.substring(headerCell.id.indexOf('_col_',0) + '_col_'.length);
\r
513 var cell = cellRow.insertCell(i);
\r
514 var cellValue = (values && values[i]) ? values[i] : "";
\r
515 this.buildCell(cell, colIdIndex, cellValue);
\r
518 this.sortTable.defaultOrder.insert(index, cellRow);
\r
520 var idTbody = this.idTable.tBodies[0];
\r
521 var sortableOptions = Sortable.options(idTbody);
\r
523 sortableOptions.draggables.push(
\r
529 scroll: this.element,
\r
530 handle: Element.getElementsByClassName(idRow, Grid.className.idCellVal)[0]
\r
534 Droppables.add(idRow, {overlap:'vertical', containment:idTbody, onHover:Sortable.onHover, greedy:true});
\r
535 sortableOptions.droppables.push(idRow);
\r
536 this.rowLength += 1;
\r
540 deleteRow : function(index) {
\r
541 if(isNaN(index) || index >= this.rowLength) {
\r
545 var targetId = null;
\r
546 if (this.cellTable.rows[index])
\r
547 targetId = this.cellTable.rows[index].id;
\r
551 this.sortTable.defaultOrder.reverse();
\r
552 var newOrder = new Array();
\r
554 for (var i = 0; this.sortTable.defaultOrder.length > 0; i++) {
\r
555 var row = this.sortTable.defaultOrder.pop();
\r
556 if (row.id == targetId) {
\r
559 newOrder.push(row);
\r
562 this.sortTable.defaultOrder = newOrder;
\r
563 this.idTable.deleteRow(index);
\r
564 this.cellTable.deleteRow(index);
\r
566 this.fixTablePosition();
\r
567 this.rowLength -= 1;
\r
571 getHeaderCell : function(cell) {
\r
572 return this.headerTable.rows[0].cells[cell.cellIndex];
\r
575 getCells : function(index) {
\r
576 var rows = this.cellTable.rows;
\r
577 var columns = new Array();
\r
578 for (var i = 0; i < rows.length; i++){
\r
579 columns.push(rows[i].cells[index]);
\r
584 getRow : function(index) {
\r
585 return this.cellTable.rows[index];
\r
588 getIdRow : function(cellRow) {
\r
589 var id = cellRow.id;
\r
590 var index = id.substring(this.rowIdBase.length);
\r
591 var targetRow = $(this.rowIdBase + '_id_' + index);
\r
595 getColTitle : function(index) {
\r
596 var headerCell = this.headerTable.rows[0].cells[index];
\r
597 var title = Element.collectTextNodes(headerCell);
\r
601 finishSort : function() {
\r
602 for (var i = 0; i < this.cellTable.rows.length; i++) {
\r
603 this.idTable.tBodies[0].appendChild(this.getIdRow(this.cellTable.rows[i]));
\r
608 setSelectedCell : function(event) {
\r
609 this.removeSelectedClasses();
\r
610 var src = Event.element(event);
\r
612 if (src.tagName.toUpperCase() != 'TH' && src.tagName.toUpperCase() != 'TD') {
\r
613 src = Element.getParentByTagName(['TH,TD'], src);
\r
616 this.targetCell = src;
\r
618 if (this.targetCell) {
\r
619 this.targetColIndex = this.targetCell.cellIndex;
\r
620 this.targetRowIndex = this.targetCell.parentNode.rowIndex;
\r
621 this.targetColumn = this.getCells(this.targetColIndex);
\r
622 this.targetRow = this.getRow(this.targetRowIndex);
\r
625 this.cssUtil.addClassNames(this.targetCell, 'cellSelected');
\r
626 var childNodes = Element.getTagNodes(this.targetCell, true);
\r
627 for (var i = 0; i < childNodes.length; i++) {
\r
628 this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
\r
632 setSelectedColumn : function(event) {
\r
633 this.removeSelectedClasses();
\r
635 this.targetCell = null;
\r
636 this.targetRowIndex = null;
\r
637 this.targetRow = null;
\r
638 this.targetIdRow = null;
\r
639 var src = Event.element(event);
\r
640 if (src && (src.tagName.toUpperCase() == 'TH' || src.tagName.toUpperCase() == 'TD')) {
\r
641 this.targetHeaderCell = src;
\r
643 this.targetHeaderCell = Element.getParentByTagName(['TH,TD'], src);
\r
645 if (this.targetHeaderCell) {
\r
646 this.targetColIndex = this.targetHeaderCell.cellIndex;
\r
647 this.targetColumn = this.getCells(this.targetColIndex);
\r
648 this.cssUtil.addClassNames(this.targetHeaderCell, 'cellSelected');
\r
649 var childNodes = Element.getTagNodes(this.targetHeaderCell, true);
\r
650 for (var i = 0; i < childNodes.length; i++) {
\r
651 this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
\r
653 for(var i = 0; i < this.targetColumn.length; i++) {
\r
654 this.cssUtil.addClassNames(this.targetColumn[i], 'cellSelected');
\r
655 var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true);
\r
656 for (var j = 0; j < cellChildNodes.length; j++) {
\r
657 this.cssUtil.addClassNames(cellChildNodes.length[j], 'cellSelected');
\r
663 setSelectedRow : function(event) {
\r
664 this.removeSelectedClasses();
\r
665 var src = Event.element(event);
\r
666 if (src && src.tagName.toUpperCase() == 'TR') {
\r
667 this.targetIdRow = src;
\r
669 this.targetIdRow = Element.getParentByTagName(['TR'], src);
\r
671 if (this.targetIdRow) {
\r
672 this.targetRowIndex = this.targetIdRow.rowIndex;
\r
673 this.targetRow = this.getRow(this.targetRowIndex);
\r
675 this.cssUtil.addClassNames(this.targetRow, 'cellSelected');
\r
676 var childNodes = Element.getTagNodes(this.targetRow, true);
\r
677 for (var i = 0; i < childNodes.length; i++) {
\r
678 this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
\r
680 this.cssUtil.addClassNames(this.targetIdRow, 'cellSelected');
\r
681 childNodes = Element.getTagNodes(this.targetIdRow, true);
\r
682 for (var i = 0; i < childNodes.length; i++) {
\r
683 this.cssUtil.addClassNames(childNodes[i], 'cellSelected');
\r
689 removeSelectedClasses : function() {
\r
690 if (this.targetHeaderCell) {
\r
691 this.cssUtil.removeClassNames(this.targetHeaderCell, 'cellSelected');
\r
692 var childNodes = Element.getTagNodes(this.targetHeaderCell, true);
\r
693 for (var i = 0; i < childNodes.length; i++) {
\r
694 this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
\r
696 for(var i = 0; i < this.targetColumn.length; i++) {
\r
697 this.cssUtil.removeClassNames(this.targetColumn[i], 'cellSelected');
\r
698 var cellChildNodes = Element.getTagNodes(this.targetColumn[i], true);
\r
699 for (var j = 0; j < cellChildNodes.length; j++) {
\r
700 this.cssUtil.removeClassNames(cellChildNodes.length[j], 'cellSelected');
\r
705 if (this.targetCell) {
\r
706 this.cssUtil.removeClassNames(this.targetCell, 'cellSelected');
\r
707 var childNodes = Element.getTagNodes(this.targetCell, true);
\r
708 for (var i = 0; i < childNodes.length; i++) {
\r
709 this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
\r
714 if (this.targetRow) {
\r
715 this.cssUtil.removeClassNames(this.targetRow, 'cellSelected');
\r
716 var childNodes = Element.getTagNodes(this.targetRow, true);
\r
717 for (var i = 0; i < childNodes.length; i++) {
\r
718 this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
\r
720 this.cssUtil.removeClassNames(this.targetIdRow, 'cellSelected');
\r
721 childNodes = Element.getTagNodes(this.targetIdRow, true);
\r
722 for (var i = 0; i < childNodes.length; i++) {
\r
723 this.cssUtil.removeClassNames(childNodes[i], 'cellSelected');
\r
727 this.targetHeaderCell = null;
\r
728 this.targetColumn = null;
\r
729 this.targetColIndex = null;
\r
730 this.targetCell = null;
\r
731 this.targetRowIndex = null;
\r
732 this.targetRow = null;
\r
733 this.targetIdRow = null;
\r
736 updateId : function() {
\r
737 var rows = this.idTable.rows;
\r
738 for (var i = 0; i < rows.length; i++) {
\r
739 var idValue = document.getElementsByClassName(this.custumCss.idCellVal, rows[i])[0];
\r
741 idValue.innerHTML = i + 1;
\r
745 updateRowLine : function(target) {
\r
746 var targetCellRow = this.cellTable.rows[this.targetRowIndex];
\r
747 var updateRowIndex = this.targetIdRow.rowIndex;
\r
748 var cellTableBody = targetCellRow.parentNode;
\r
749 var cellTableRows = cellTableBody.rows;
\r
751 if (this.options.hierarchy) {
\r
752 var checkRow = cellTableBody.rows[this.targetIdRow.rowIndex];
\r
753 if (this.isParentRow(checkRow, targetCellRow)) {
\r
754 var idBody = this.idTable.tBodies[0];
\r
755 idBody.insertBefore(this.targetIdRow, idBody.rows[this.targetRowIndex]);
\r
759 if (updateRowIndex == cellTableRows.length - 1) {
\r
760 cellTableBody.appendChild(targetCellRow);
\r
761 } else if (this.targetRowIndex < updateRowIndex) {
\r
762 cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex + 1]);
\r
764 cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex]);
\r
766 if (this.options.hierarchy) {
\r
767 this.updateOutline(targetCellRow);
\r
769 this.targetRowIndex = updateRowIndex;
\r
772 updateCellLine : function(target){
\r
773 var targetCells = this.getCells(this.targetColIndex);
\r
774 var updateColIndex = this.targetHeaderCell.cellIndex;
\r
776 var rows = this.cellTable.rows;
\r
778 for (var i = 0; i < rows.length; i++) {
\r
779 var cells = rows[i].cells;
\r
780 var targetCell = targetCells[i];
\r
782 if (updateColIndex == cells.length -1) {
\r
783 rows[i].appendChild(targetCell);
\r
784 } else if (this.targetColIndex < updateColIndex) {
\r
785 rows[i].insertBefore(targetCell, cells[updateColIndex + 1]);
\r
787 rows[i].insertBefore(targetCell, cells[updateColIndex]);
\r
790 this.targetColIndex = updateColIndex;
\r
793 updateCellWidth : function(newStyle, headColumn) {
\r
795 if(newStyle.width > this.options.cellMinWidth) {
\r
796 var dragDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellDrag)[0];
\r
797 var sortDiv = Element.getElementsByClassName(headColumn, Grid.className.headerCellSort)[0];
\r
798 var val = newStyle.width - (parseInt(Element.getStyle(headColumn, 'width')));
\r
800 val = parseInt(val);
\r
802 this.headerTable.style.width = (parseInt(Element.getStyle(this.headerTable, 'width')) + val) + 'px';
\r
804 dragDiv.style.width = newStyle.width - (this.marginSize * 2) + 'px';
\r
805 sortDiv.style.width = parseInt(Element.getStyle(dragDiv, 'width')) - (this.marginSize * 2) + 'px';
\r
807 var index = headColumn.cellIndex ;
\r
808 var rows = this.cellTable.rows;
\r
810 this.cellTable.style.width = this.headerTable.style.width
\r
812 for(var i = 0; i < rows.length; i++){
\r
813 var cell = rows[i].cells[index];
\r
814 var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
\r
815 cellValueDiv.style.width = newStyle.width + 'px';
\r
816 cell.style.width = newStyle.width + 'px';
\r
822 updateCellHeight : function(newStyle, idCell) {
\r
823 if(newStyle.height > this.options.cellMinHeight) {
\r
824 var row = idCell.parentNode;
\r
825 var index = row.rowIndex;
\r
826 var idValueDiv = Element.getElementsByClassName(idCell, Grid.className.idCellVal)[0];
\r
827 idValueDiv.style.height = newStyle.height - (this.marginSize * 2) + 'px';
\r
828 var padding = parseInt(idValueDiv.style.paddingTop);
\r
829 var cellRow = this.cellTable.rows[index];
\r
830 var cells = cellRow.cells;
\r
831 for (var i = 0; i < cells.length; i++) {
\r
832 cells[i].style.height = newStyle.height + 'px';
\r
833 var cellValueDiv = Element.getElementsByClassName(cells[i], Grid.className.cellVal)[0];
\r
834 cellValueDiv.style.height = newStyle.height + 'px';
\r
839 setTextAreaSize : function(event) {
\r
840 var target = Event.element(event);
\r
841 var rows = parseInt(Element.getStyle(target, 'height'));
\r
842 var cols = parseInt(Element.getStyle(target, 'width'));
\r
843 target.ajax.options.rows = Math.round(rows/20);
\r
844 target.ajax.options.cols = Math.round(cols/20);
\r
847 fixTablePosition : function(event) {
\r
848 Grid.scrollTop = this.element.scrollTop;
\r
849 Grid.scrollLeft = this.element.scrollLeft;
\r
850 this.baseTable.style.top = Grid.scrollTop + 'px';
\r
851 this.baseTable.style.left = Grid.scrollLeft + 'px';
\r
852 this.headerTable.style.top = Grid.scrollTop + 'px';
\r
853 this.idTable.style.left = Grid.scrollLeft + 'px';
\r
856 //----------ajax request param method---------------------------------------------------------------------------
\r
857 createInplaceEditorParams : function(form, value) {
\r
858 var rowIndexEnd = form.id.indexOf('_col_', 0);
\r
859 var rowIndex = form.id.substring(this.rowIdBase.length, rowIndexEnd);
\r
861 var colIndexStart = rowIndexEnd + '_col_'.length;
\r
862 var colIndexEnd = form.id.indexOf('_form', 0);
\r
863 var colIndex = form.id.substring(colIndexStart, colIndexEnd);
\r
864 var jsonRowObj = this.rowDataToJsonObj(rowIndex);
\r
866 var targetColTitle = this.getColTitle(colIndex);
\r
867 jsonRowObj.each(function(j) {
\r
868 if (j.column == targetColTitle) {
\r
873 var jsonRowText = JSON.stringify(jsonRowObj);
\r
875 rowData: jsonRowText,
\r
876 column: targetColTitle,
\r
879 return $H(params).toQueryString();
\r
882 gridDataToJsonObj : function() {
\r
883 var rows = this.cellTable.rows;
\r
884 var jsonDataList = [];
\r
885 for (var i = 0; i < this.rowLength; i++) {
\r
886 var rowData = this.rowDataToJsonObj(i);
\r
887 jsonDataList.push(rowData);
\r
889 return jsonDataList;
\r
892 rowDataToJsonObj : function(index) {
\r
893 var jsonRowObj = [];
\r
894 var row = $A(this.cellTable.rows).detect(function(r) {return r.id.getSuffix() == index});
\r
895 for (var i = 0; i < this.colLength; i++) {
\r
896 var jsonCellObj = {};
\r
897 jsonCellObj['column'] = this.getColTitle(i);
\r
898 jsonCellObj['value'] = Element.collectTextNodes(row.cells[i]);
\r
899 jsonRowObj.push(jsonCellObj);
\r
904 updateGridData : function() {
\r
906 var jsonDataText = JSON.stringify(this.gridDataToJsonObj());
\r
907 var params = 'id=' + encodeURIComponent(this.element.id) + '&data=' + encodeURIComponent(jsonDataText);
\r
910 this.options.updateGridReceiver,
\r
911 this.options.updateGridUrl,
\r
913 parameters: params,
\r
914 evalScripts: true, asynchronous:true
\r
920 //----------hierarchy grid method---------------------------------------------------------------------------
\r
921 setHierarchyRow : function(row, outlineLevel, outlineNum){
\r
922 row.outlineLevel = outlineLevel || 1;
\r
923 row.list = row.list || new Array();
\r
924 if (row.outlineLevel == 1) {
\r
925 this.topLevelList.push(row);
\r
926 row.outlineNum = outlineNum || this.topLevelList.length;
\r
928 var parentRow = this.getParentRow(row);
\r
929 parentRow.list.push(row);
\r
930 var num = parentRow.length;
\r
931 row.outlineNum = outlineNum || parentRow.outlineNum + '.' + parentRow.list.length;
\r
935 this.buildStateDiv(row.cells[this.hierarchyColIndex]);
\r
936 this.setOutlineIndent(row);
\r
937 this.setFontWeight(row);
\r
940 buildStateDiv : function (cell) {
\r
941 var stateDiv = Builder.node('div');
\r
942 var valueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
\r
943 this.cssUtil.addClassNames(stateDiv, 'state');
\r
944 cell.insertBefore(stateDiv, valueDiv);
\r
946 if (document.all) {
\r
947 stateDiv.style.position = "absolute";
\r
949 stateDiv.style.position = "relative";
\r
950 stateDiv.style.cssFloat = "left";
\r
952 this.addStateClass(cell, stateDiv);
\r
953 Event.observe(stateDiv, 'click', this.toggleState.bindAsEventListener(this));
\r
956 addStateClass : function (cell, stateDiv) {
\r
957 var row = cell.parentNode;
\r
958 if (row.list.length == 0) {
\r
959 this.cssUtil.addClassNames(stateDiv, 'stateEmpty');
\r
960 } else if (this.options.open){
\r
961 this.cssUtil.addClassNames(stateDiv, 'stateOpen');
\r
963 this.cssUtil.addClassNames(stateDiv, 'stateClose');
\r
964 this.closeRow(row);
\r
968 toggleState : function(event) {
\r
969 var src = Event.element(event);
\r
970 var row = src.parentNode.parentNode;
\r
972 if (!Element.hasClassName(src, Grid.className.stateEmpty)) {
\r
973 if (Element.hasClassName(src, Grid.className.stateOpen)) {
\r
974 this.closeRow(row.list);
\r
975 this.cssUtil.removeClassNames(src, 'stateOpen');
\r
976 this.cssUtil.addClassNames(src, 'stateClose');
\r
978 this.openRow(row.list);
\r
979 this.cssUtil.removeClassNames(src, 'stateClose');
\r
980 this.cssUtil.addClassNames(src, 'stateOpen');
\r
985 openRow : function(list) {
\r
986 for (var i = 0; i < list.length; i++) {
\r
989 Element.show(this.getIdRow(row));
\r
990 var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];
\r
991 if (Element.hasClassName(stateDiv, Grid.className.stateOpen)) {
\r
992 this.openRow(row.list)
\r
997 closeRow : function(list) {
\r
998 for (var i = 0; i < list.length; i++) {
\r
999 Element.hide(list[i]);
\r
1000 Element.hide(this.getIdRow(list[i]));
\r
1001 this.closeRow(list[i].list)
\r
1006 showStateDiv : function(transport, element) {
\r
1007 var row = Element.getParentByTagName(['TR'], element);
\r
1008 var state = Element.getElementsByClassName(row, Grid.className.state)[0];
\r
1009 Element.show(state);
\r
1012 hideStateDiv : function(event) {
\r
1013 var src = Event.element(event);
\r
1014 var row = Element.getParentByTagName(['TR'], src);
\r
1015 var state = Element.getElementsByClassName(row, Grid.className.state)[0];
\r
1017 Element.hide(state);
\r
1020 addHierarchyRow : function(index, values) {
\r
1021 if (this.colLength == 0) {
\r
1024 var newRow = this.addRow(index, values);
\r
1026 newRow.list = new Array();
\r
1027 var previousRow = newRow.previousSibling;
\r
1028 var parentRow = null;
\r
1029 var parentList = null;
\r
1030 var insertIndex = 0;
\r
1031 if (!previousRow) {
\r
1032 newRow.outlineLevel = 1;
\r
1033 parentList = this.topLevelList;
\r
1034 } else if (previousRow.list.length > 0) {
\r
1035 newRow.outlineLevel = previousRow.outlineLevel + 1;
\r
1036 parentRow = previousRow;
\r
1037 parentList = parentRow.list;
\r
1039 newRow.outlineLevel = previousRow.outlineLevel;
\r
1040 parentRow = this.getParentRow(previousRow);
\r
1041 parentList = parentRow ? parentRow.list : this.topLevelList;
\r
1042 insertIndex = parentList.indexOf(previousRow) + 1;
\r
1044 parentList.insert(insertIndex, newRow);
\r
1045 this.buildStateDiv(newRow.cells[this.hierarchyColIndex]);
\r
1046 for (var i = insertIndex; i < parentList.length; i++) {
\r
1047 if (parentList[i].outlineLevel != 1) {
\r
1048 parentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);
\r
1050 parentList[i].outlineNum = i + 1;
\r
1052 this.setOutline(parentList[i]);
\r
1057 deleteHierarchyRow : function(index) {
\r
1058 if(isNaN(index) || index >= this.rowLength) {
\r
1061 var row = this.getRow(index);
\r
1065 var parentRow = this.getParentRow(row);
\r
1066 var parentList = parentRow ? parentRow.list : this.topLevelList;
\r
1067 var removeIndex = parentList.indexOf(row);
\r
1068 var childList = row.list;
\r
1070 for (var i = 0; i < childList.length; i++) {
\r
1071 this.deleteChildRow(childList[i]);
\r
1073 parentList.remove(removeIndex);
\r
1074 this.deleteRow(index);
\r
1076 for (var i = removeIndex; i < parentList.length; i++) {
\r
1077 var updateRow = parentList[i];
\r
1078 if (updateRow.outlineLevel == 1) {
\r
1079 updateRow.outlineNum = i + 1;
\r
1081 updateRow.outlineNum = this.getParentRow(updateRow).outlineNum + '.' + (i + 1);
\r
1083 this.setOutline(parentList[i]);
\r
1085 this.setFontWeight(parentRow);
\r
1088 deleteChildRow : function(childRow) {
\r
1089 var list = childRow.list;
\r
1091 for (var i = 0; i < list.length; i++) {
\r
1092 this.deleteChildRow(list[i]);
\r
1094 this.deleteRow(childRow.rowIndex);
\r
1097 levelUp : function(row) {
\r
1101 var previousRow = row.previousSibling;
\r
1102 if (row.outlineLevel == 1 || !previousRow) {
\r
1106 var parentRow = this.getParentRow(row);
\r
1107 var currentList = parentRow.list;
\r
1109 var newParentRow = this.getParentRow(parentRow);
\r
1110 var targetList = newParentRow ? newParentRow.list : this.topLevelList;
\r
1112 var currentIndex = currentList.indexOf(row);
\r
1113 var targetIndex = targetList.indexOf(parentRow) + 1;
\r
1115 row.outlineLevel -= 1;
\r
1116 targetList.insert(targetIndex, row);
\r
1117 currentList.remove(currentIndex);
\r
1119 while (currentList[currentIndex]) {
\r
1120 var moveRow = currentList[currentIndex];
\r
1121 row.list.push(moveRow);
\r
1122 currentList.remove(currentIndex);
\r
1125 if (row.outlineLevel != 1) {
\r
1126 row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);
\r
1128 row.outlineNum = targetIndex + 1;
\r
1131 this.setOutline(row);
\r
1133 for (var i = targetIndex + 1; i < targetList.length; i++) {
\r
1134 if (targetList[i].outlineLevel != 1) {
\r
1135 targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);
\r
1137 targetList[i].outlineNum = i + 1;
\r
1139 this.setOutline(targetList[i]);
\r
1142 this.setFontWeight(row);
\r
1143 this.setFontWeight(parentRow);
\r
1144 this.setFontWeight(newParentRow);
\r
1145 this.setStateClass(row);
\r
1146 this.setStateClass(previousRow);
\r
1149 levelDown : function(row) {
\r
1153 var previousRow = row.previousSibling;
\r
1154 var parentRow = this.getParentRow(row);
\r
1155 if (!previousRow || parentRow == previousRow) {
\r
1158 var currentList = (row.outlineLevel == 1) ? this.topLevelList : parentRow.list;
\r
1159 var currentIndex = currentList.indexOf(row);
\r
1161 row.outlineLevel += 1;
\r
1163 var newParentRow = this.getParentRow(row);
\r
1164 var targetList = newParentRow.list;
\r
1165 var targetIndex = targetList.length;
\r
1167 currentList.remove(currentIndex);
\r
1168 targetList.push(row);
\r
1170 row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);
\r
1171 this.setOutline(row);
\r
1172 for (var i = currentIndex; i < currentList.length; i++) {
\r
1173 if (currentList[i].outlineLevel != 1) {
\r
1174 currentList[i].outlineNum = parentRow.outlineNum + '.' + (i + 1);
\r
1176 currentList[i].outlineNum = i + 1;
\r
1178 this.setOutline(currentList[i]);
\r
1181 for (var i = targetIndex + 1; i < targetList.length; i++) {
\r
1182 targetList[i].outlineNum = newParentRow.outlineNum + '.' + (i + 1);
\r
1183 this.setOutline(targetList[i]);
\r
1186 this.setFontWeight(row);
\r
1187 this.setFontWeight(parentRow);
\r
1188 this.setFontWeight(newParentRow);
\r
1189 this.setStateClass(row);
\r
1190 this.setStateClass(previousRow);
\r
1194 setStateClass : function(row) {
\r
1195 if (!row.list) return;
\r
1196 var stateDiv = Element.getElementsByClassName(row.cells[this.hierarchyColIndex], Grid.className.state)[0];
\r
1198 if (Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length > 0) {
\r
1199 this.cssUtil.removeClassNames(stateDiv, 'stateEmpty');
\r
1200 this.cssUtil.addClassNames(stateDiv, 'stateOpen');
\r
1201 } else if (!Element.hasClassName(stateDiv, Grid.className.stateEmpty) && row.list.length == 0) {
\r
1202 this.cssUtil.removeClassNames(stateDiv, 'stateOpen');
\r
1203 this.cssUtil.addClassNames(stateDiv, 'stateEmpty');
\r
1207 setOutline : function(row) {
\r
1208 var childList = row.list;
\r
1209 if (!childList) return;
\r
1210 for(var i = 0; i < childList.length; i++) {
\r
1211 var childRow = childList[i];
\r
1212 childRow.outlineLevel = row.outlineLevel + 1;
\r
1213 childRow.outlineNum = row.outlineNum + '.' + (i + 1);
\r
1214 this.setOutline(childRow);
\r
1216 this.setOutlineIndent(row);
\r
1219 setOutlineIndent : function(row) {
\r
1220 var cell = row.cells[this.hierarchyColIndex];
\r
1224 var cellValueDiv = Element.getElementsByClassName(cell, Grid.className.cellVal)[0];
\r
1225 var stateDiv = Element.getElementsByClassName(cell, Grid.className.state)[0];
\r
1226 if (!stateDiv) return;
\r
1227 var stateDivWidth = stateDiv.offsetWidth || this.stateDivWidth;
\r
1228 var left = this.options.hierarchyIndent * (row.outlineLevel - 1);
\r
1229 var valueLeft = document.all ? left + stateDivWidth : left;
\r
1230 cellValueDiv.style.left = valueLeft + 'px';
\r
1231 stateDiv.style.left = left + 'px';
\r
1234 setFontWeight : function(row) {
\r
1236 if (!row.list) return;
\r
1237 if (row.list.length > 0){
\r
1238 row.style.fontWeight = 'bold';
\r
1240 row.style.fontWeight = 'normal';
\r
1245 updateOutline : function(row) {
\r
1246 var previousRow = row.previousSibling;
\r
1247 var newParentRow = null;
\r
1248 var insertIndex = 0;
\r
1249 var newParentList = null;
\r
1251 if (!previousRow.list) return;
\r
1252 if (!previousRow) {
\r
1253 newParentList = this.topLevelList;
\r
1254 }else if(previousRow.list.length > 0) {
\r
1255 newParentRow = previousRow;
\r
1256 newParentList = newParentRow.list;
\r
1258 newParentRow = this.getParentRow(previousRow);
\r
1259 newParentList = newParentRow ? newParentRow.list : this.topLevelList;
\r
1260 insertIndex = newParentList.indexOf(previousRow) + 1;
\r
1262 var parentRow = this.getParentRowByIndex(row, this.targetRowIndex);
\r
1263 var parentList = null;
\r
1265 var outlineNumBase = '';
\r
1267 parentList = parentRow.list;
\r
1268 outlineNumBase = parentRow.outlineNum + '.';
\r
1270 parentList = this.topLevelList;
\r
1271 if (!parentList) return;
\r
1273 var removeIndex = parentList.indexOf(row);
\r
1275 if (parentList == newParentList && removeIndex < insertIndex) {
\r
1277 parentList.remove(removeIndex);
\r
1278 parentList.insert(insertIndex, row);
\r
1279 for (var i = removeIndex; i < parentList.length; i++) {
\r
1281 parentList[i].outlineNum = outlineNumBase + (i + 1);
\r
1282 this.setOutline(parentList[i]);
\r
1287 parentList.remove(removeIndex);
\r
1288 newParentList.insert(insertIndex, row);
\r
1289 for (var i = removeIndex; i < parentList.length; i++) {
\r
1290 parentList[i].outlineNum = outlineNumBase + (i + 1);
\r
1291 this.setOutline(parentList[i]);
\r
1293 var newOutlineNumBase = newParentRow ? newParentRow.outlineNum + '.' : '';
\r
1294 var newOutlineLevelBase = newParentRow ? newParentRow.outlineLevel : 0;
\r
1295 row.outlineNum = newOutlineNumBase + (insertIndex + 1);
\r
1296 row.outlineLevel = newOutlineLevelBase + 1;
\r
1297 for (var i = insertIndex; i < newParentList.length; i++) {
\r
1298 newParentList[i].outlineNum = newOutlineNumBase + (i + 1);
\r
1299 this.setOutline(newParentList[i]);
\r
1301 this.setOutline(row);
\r
1303 this.setFontWeight(row);
\r
1304 this.setStateClass(row);
\r
1306 this.setFontWeight(parentRow);
\r
1307 this.setStateClass(parentRow);
\r
1309 if (newParentRow) {
\r
1310 this.setFontWeight(newParentRow);
\r
1311 this.setStateClass(newParentRow);
\r
1313 this.updateHierarchyRowLine(row);
\r
1316 updateHierarchyRowLine : function(row, existingRow) {
\r
1317 if (!row.list) return;
\r
1318 var rowIndex = row.rowIndex;
\r
1319 var cellBody = this.cellTable.tBodies[0];
\r
1320 var idBody = this.idTable.tBodies[0];
\r
1321 if (!existingRow) {
\r
1322 existingRow = cellBody.rows[rowIndex + 1]
\r
1325 for (var i = 0; i < row.list.length; i++) {
\r
1326 if (!existingRow) {
\r
1327 cellBody.appendChild(row.list[i]);
\r
1328 idBody.appendChild(this.getIdRow(row.list[i]));
\r
1330 cellBody.insertBefore(row.list[i], existingRow);
\r
1331 idBody.insertBefore(this.getIdRow(row.list[i]), this.getIdRow(existingRow));
\r
1333 this.updateHierarchyRowLine(row.list[i], existingRow);
\r
1337 getParentRow : function(row) {
\r
1338 if (row.outlineLevel == 1) {
\r
1342 var previousRow = row.previousSibling;
\r
1343 if (!previousRow) {
\r
1347 while (previousRow.outlineLevel != (row.outlineLevel - 1)) {
\r
1348 previousRow = previousRow.previousSibling;
\r
1350 return previousRow;
\r
1354 getParentRowByIndex : function(row, index) {
\r
1355 if (row.outlineLevel == 1) {
\r
1358 if (this.targetRowIndex) {
\r
1359 for(var i = 0; i < this.targetRowIndex + 1; i++) {
\r
1360 if (!this.cellTable.rows[i].list) return;
\r
1361 if (this.cellTable.rows[i].list.indexOf(row) != -1) {
\r
1362 return this.cellTable.rows[i];
\r
1369 getPreviousRootRow : function(row) {
\r
1370 var previousRow = row.previousSibling;
\r
1371 if (!previousRow) {
\r
1374 while (previousRow.outlineLevel != 1) {
\r
1375 previousRow = previousRow.previousSibling;
\r
1378 return previousRow;
\r
1381 isParentRow : function(row, parentRow) {
\r
1382 var temp = this.getParentRow(row);
\r
1385 } else if (temp == parentRow) {
\r
1388 return this.isParentRow(temp, parentRow);
\r