OSDN Git Service

add user session
[cloudmanganw/git_repo.git] / war / WEB-INF / classes / jp / sourceforge / manganetwork / page / javascripts / spinelz / grid.js
1 // Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
2 // \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
10 // \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
13 //\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
21 \r
22 Grid = Class.create();\r
23 Grid.className = {\r
24   container:      'grid_container',\r
25   \r
26   baseTable:      'grid_baseTable',\r
27   baseRow:        'grid_baseRow',\r
28   baseCell:       'grid_baseCell',\r
29   \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
35   \r
36   idTable:        'grid_idTable',\r
37   idRow:          'grid_idRow',\r
38   idCell:         'grid_idCell',\r
39   idCellVal:      'grid_idCellVal',\r
40   \r
41   cellTable:      'grid_cellTable',\r
42   cellTbody:      'grid_cellTbody',\r
43   cellRow:        'grid_cellRow',\r
44   cell:           'grid_cell',\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
51   \r
52   inplaceEditor:  'grid_inplaceEditor'\r
53 }\r
54 Grid.scrollTop = 0;\r
55 Grid.scrollLeft = 0;\r
56 Grid.options = {}\r
57 Grid.options.baseTable = {\r
58   border:1,\r
59   frame : 'border',\r
60   cellSpacing:0,\r
61   cellPadding:0\r
62 }\r
63 Grid.options.headerTable = {\r
64   border:1,\r
65   frame : 'border',\r
66   cellSpacing:0,\r
67   cellPadding:0\r
68 }\r
69 Grid.options.idTable = {\r
70   border:1,\r
71   frame : 'border',\r
72   cellSpacing:0,\r
73   cellPadding:0\r
74 }\r
75 Grid.options.cellTable = {\r
76   border:1,\r
77   frame : 'border',\r
78   cellSpacing:0,\r
79   cellPadding:0\r
80 }\r
81 Grid.prototype = {\r
82   \r
83   initialize : function(element) {\r
84     \r
85     this.element = $(element);\r
86     Element.setStyle(this.element, {visibility: 'hidden'});\r
87     Element.hide(this.element);\r
88 \r
89     var options = Object.extend({\r
90       cssPrefix:          'custum_',\r
91       cellMinWidth:       10,\r
92       cellMinHeight:      10,\r
93       cellDefaultWidth:   72,\r
94       cellDefaultHeight:  25,\r
95       defaultRowLength:   10,\r
96       baseWidth:          40,\r
97       baseHeight:         25,\r
98       baseTop:            0,\r
99       baseLeft:           0,\r
100       cellEditUrl:        '',\r
101       updateGridUrl:      '',\r
102       updateGridReceiver: '',\r
103       hierarchy:          false,\r
104       hierarchyCol:       false,\r
105       hierarchyIndent:    20,\r
106       sortOptions:        {}\r
107     }, arguments[1] || {});\r
108     \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
118     \r
119     this.marginSize = this.options.marginSize ? this.options.marginSize : 4;\r
120     this.stateIndent = 15;\r
121     \r
122     this.rowIdBase = this.element.id + '_row_';\r
123     this.topLevelList = new Array();\r
124     this.removeList = new Array();\r
125     this.build();\r
126     this.removeList.each(function(r) {\r
127       r.parentNode.removeChild(r);\r
128     });\r
129     var sortOptions = {\r
130       relate : this.idTable,\r
131       handle:this.headerTable,\r
132       callBack:this.finishSort.bind(this)\r
133     };\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
138   },\r
139   \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
144     \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
152     \r
153     Event.observe(this.element, 'scroll', this.fixTablePosition.bindAsEventListener(this));\r
154   },\r
155   \r
156   buildBaseTable: function() {\r
157 \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
166     }\r
167     \r
168     var row = this.baseTable.insertRow(0);\r
169     var cell = row.insertCell(0);\r
170     \r
171     this.cssUtil.addClassNames(row, 'baseRow');\r
172     this.cssUtil.addClassNames(cell, 'baseCell');\r
173     \r
174     this.element.appendChild(this.baseTable);\r
175   },\r
176   \r
177   buildHeaderTable: function() {\r
178     this.headerTable = Builder.node('table', Grid.options.headerTable);\r
179     this.cssUtil.addClassNames(this.headerTable, 'headerTable');\r
180     \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
187     \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
195     }\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
203     }\r
204     this.element.appendChild(this.headerTable);\r
205     Sortable.create(\r
206       row, \r
207       {\r
208         tag:'td',\r
209         handle:Grid.className.headerCellDrag,\r
210         constraint:true,\r
211         overlap:'horizontal',\r
212         scroll:this.element,\r
213         onUpdate:this.updateCellLine.bind(this)\r
214       });\r
215   },\r
216   \r
217   buildHeaderCell : function(cell, title, index) {\r
218 \r
219     cell.id = this.element.id + '_header_col_' + index;\r
220     \r
221     var drag = Builder.node('div');\r
222     var sort = Builder.node('div');\r
223     \r
224     this.cssUtil.addClassNames(cell, 'headerCell');\r
225     this.cssUtil.addClassNames(drag, 'headerCellDrag');\r
226     this.cssUtil.addClassNames(sort, 'headerCellSort');\r
227     \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
237     }\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
243     }\r
244     \r
245     sort.innerHTML = title;\r
246     drag.appendChild(sort);\r
247     cell.appendChild(drag);\r
248     \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
253   },\r
254     \r
255   buildIdTable: function() {\r
256 \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
260       \r
261       var row = this.idTable.insertRow(i);\r
262       this.buildIdRow(row, i);\r
263     }\r
264     \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
270     }\r
271     \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
275     Sortable.create(\r
276       tbody, \r
277       {\r
278         tag:'tr',\r
279         handle:Grid.className.idCellVal,\r
280         scroll:this.element,\r
281         constraint:true,\r
282         overlap:'vertical',\r
283         onUpdate:this.updateRowLine.bind(this)\r
284       });\r
285   },\r
286   \r
287   buildIdRow : function(row, index) {\r
288     row.id = this.rowIdBase + '_id_' + index;\r
289     \r
290     var cell = row.insertCell(0);\r
291     var valueDiv = Builder.node('div');\r
292 \r
293     this.cssUtil.addClassNames(row, 'idRow');\r
294     this.cssUtil.addClassNames(cell, 'idCell');\r
295     this.cssUtil.addClassNames(valueDiv, 'idCellVal');      \r
296     \r
297     with (cell.style) {\r
298       width = this.options.baseWidth + 'px';\r
299       height = this.options.cellDefaultHeight + 'px';\r
300     }\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
306     }\r
307 \r
308     valueDiv.innerHTML = index + 1;\r
309     cell.appendChild(valueDiv);\r
310     \r
311     new ResizeableGridEx(cell, {minHeight: this.options.cellMinHeight, top:0, right: 0, bottom: 2, left: 0, draw:this.updateCellHeight.bind(this)});\r
312     \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
316   },\r
317   \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
325     }\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
330     \r
331     if (!rows || rows.length == 0) {\r
332       for(var i = 0; i < this.rowLength; i++) {\r
333         \r
334         var newRow = this.cellTable.insertRow(i);\r
335         newRow.id = this.rowIdBase + i;\r
336         this.cssUtil.addClassNames(newRow, 'cellRow');\r
337         \r
338         for (var j = 0; j < this.colLength; j++) {\r
339           var newCell = newRow.insertCell(j);\r
340           this.buildCell(newCell, j, "");\r
341         }\r
342         if (this.options.hierarchy) {\r
343           this.setHierarchyRow(newRow);\r
344         }\r
345       }  \r
346       \r
347     } else {\r
348       for (var i = 0; i < this.rowLength; i++) {\r
349         var row = rows[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
354 \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
360         }\r
361         if (this.options.hierarchy) {\r
362           this.setHierarchyRow(row);\r
363         }  \r
364       }\r
365     }\r
366     \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
372     }\r
373     \r
374     this.cellTable.getIdRow = this.getIdRow.bind(this);    \r
375   },\r
376 \r
377   buildCell : function(cell, cellIdIndex, value) {\r
378 \r
379     var cellValueDiv = Builder.node('div');\r
380     cellValueDiv.innerHTML = value;\r
381     \r
382     cell.appendChild(cellValueDiv);\r
383     cell.id = cell.parentNode.id + '_col_' + cellIdIndex;\r
384     \r
385     this.cssUtil.addClassNames(cell, 'cell');\r
386     this.cssUtil.addClassNames(cellValueDiv, 'cellVal');\r
387     \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
391     }  \r
392     with (cellValueDiv.style) {\r
393       width = cell.style.width;\r
394       height = cell.style.height;\r
395       marginTop = '0px';\r
396       marginBottom = '0px';\r
397     }\r
398     \r
399     Event.observe(cell, 'click', this.setSelectedCell.bindAsEventListener(this));\r
400         \r
401     var ajax = new Ajax.InPlaceEditor(cellValueDiv, this.options.cellEditUrl,\r
402       {\r
403         formClassName: this.cssUtil.joinClassNames('inplaceEditor'), \r
404         rows: 2, \r
405         cols:12, \r
406         okButton: false, \r
407         cancelLink:false, \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
415       }\r
416     );\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
421     \r
422 \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
426     }\r
427     Event.observe(cellValueDiv, 'dblclick', ajax.onclickListener);\r
428     \r
429   },\r
430   \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
437     \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
441       \r
442       var cell = rows[i].insertCell(insertIndex);\r
443       var cellValue = "";\r
444       if (values && values[i]) {\r
445         cellValue = values[i];\r
446       }\r
447       this.buildCell(cell, colIdIndex, cellValue);\r
448     }\r
449   \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
452     \r
453     var sortableOptions = Sortable.options(headerRow);\r
454     \r
455     sortableOptions.draggables.push(\r
456       new Draggable(\r
457         headerCell, \r
458         {\r
459           revert:     true,\r
460           constraint: true,\r
461           scroll:     this.element,\r
462           handle:     Element.getElementsByClassName(headerCell, Grid.className.headerCellDrag)[0]\r
463         }\r
464       )\r
465     );\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
470   },\r
471   \r
472   deleteColumn : function(index) {\r
473     if((isNaN(index)) || index >= this.colLength) {\r
474       return;\r
475     }\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
480     \r
481     var width = headerCell.offsetWidth;\r
482     var rows = this.cellTable.rows;\r
483     headerRow.deleteCell(index);\r
484     \r
485     for (var i = 0; i < rows.length; i++) {\r
486       rows[i].deleteCell(index);\r
487     }\r
488     \r
489     var headerTableWidth = parseInt(Element.getStyle(this.headerTable, 'width')) - width;\r
490     \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
495   },\r
496   \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
503     this.updateId();\r
504     \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
509     \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
516     }\r
517 \r
518     this.sortTable.defaultOrder.insert(index, cellRow);\r
519     \r
520     var idTbody = this.idTable.tBodies[0];\r
521     var sortableOptions = Sortable.options(idTbody);\r
522     \r
523     sortableOptions.draggables.push(\r
524       new Draggable(\r
525         idRow,\r
526         {\r
527           revert:     true,\r
528           constraint: true,\r
529           scroll:     this.element,\r
530           handle:     Element.getElementsByClassName(idRow, Grid.className.idCellVal)[0]\r
531         }\r
532       )\r
533     );\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
537     return cellRow;\r
538   },\r
539   \r
540   deleteRow : function(index) {\r
541     if(isNaN(index) || index >= this.rowLength) {\r
542       return;\r
543     }\r
544     \r
545     var targetId = null;\r
546     if (this.cellTable.rows[index])\r
547       targetId = this.cellTable.rows[index].id;\r
548     else\r
549       return;\r
550     \r
551     this.sortTable.defaultOrder.reverse();\r
552     var newOrder = new Array();\r
553     \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
557          continue;\r
558        }\r
559        newOrder.push(row);\r
560     }\r
561     \r
562     this.sortTable.defaultOrder = newOrder;\r
563     this.idTable.deleteRow(index);\r
564     this.cellTable.deleteRow(index);\r
565     \r
566     this.fixTablePosition();\r
567     this.rowLength -= 1;\r
568     this.updateId();\r
569   },\r
570   \r
571   getHeaderCell : function(cell) {\r
572     return this.headerTable.rows[0].cells[cell.cellIndex];\r
573   },\r
574   \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
580     }\r
581     return columns;\r
582   },\r
583   \r
584   getRow : function(index) {\r
585     return this.cellTable.rows[index];\r
586   },\r
587   \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
592     return targetRow;\r
593   },\r
594   \r
595   getColTitle : function(index) {\r
596     var headerCell = this.headerTable.rows[0].cells[index];\r
597     var title = Element.collectTextNodes(headerCell);\r
598     return title;\r
599   },\r
600   \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
604     }\r
605     this.updateId();\r
606   },\r
607   \r
608   setSelectedCell : function(event) {\r
609     this.removeSelectedClasses();\r
610     var src = Event.element(event);\r
611 \r
612     if (src.tagName.toUpperCase() != 'TH' && src.tagName.toUpperCase() != 'TD') { \r
613       src = Element.getParentByTagName(['TH,TD'], src);\r
614     }        \r
615     \r
616     this.targetCell = src;\r
617     \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
623     }\r
624     \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
629     }\r
630   },\r
631     \r
632   setSelectedColumn : function(event) {\r
633     this.removeSelectedClasses();\r
634     \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
642     } else {\r
643       this.targetHeaderCell = Element.getParentByTagName(['TH,TD'], src);\r
644     }\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
652       }\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
658         }\r
659       }\r
660     }\r
661   },\r
662 \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
668     } else {\r
669       this.targetIdRow = Element.getParentByTagName(['TR'], src);\r
670     }\r
671     if (this.targetIdRow) {\r
672       this.targetRowIndex = this.targetIdRow.rowIndex;\r
673       this.targetRow = this.getRow(this.targetRowIndex);\r
674       \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
679       }\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
684       }  \r
685     }\r
686     \r
687   },\r
688   \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
695       }\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
701         }\r
702       }\r
703       \r
704     }\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
710       }\r
711       \r
712     }\r
713     \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
719       }\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
724       }  \r
725     }\r
726     \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
734   },\r
735   \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
740       \r
741       idValue.innerHTML = i + 1;\r
742     }\r
743   },\r
744   \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
750     \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
756         return;\r
757       }\r
758     }\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
763     } else {\r
764       cellTableBody.insertBefore(targetCellRow, cellTableRows[updateRowIndex]);\r
765     }\r
766     if (this.options.hierarchy) {\r
767       this.updateOutline(targetCellRow);\r
768     }\r
769     this.targetRowIndex = updateRowIndex;\r
770     this.updateId();\r
771   },\r
772   updateCellLine : function(target){\r
773     var targetCells = this.getCells(this.targetColIndex);\r
774     var updateColIndex = this.targetHeaderCell.cellIndex;\r
775     \r
776     var rows = this.cellTable.rows;\r
777     \r
778     for (var i = 0; i < rows.length; i++) {\r
779       var cells = rows[i].cells;\r
780       var targetCell = targetCells[i];\r
781       \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
786       } else {\r
787         rows[i].insertBefore(targetCell, cells[updateColIndex]);\r
788       }\r
789     }\r
790     this.targetColIndex = updateColIndex;\r
791   },\r
792   \r
793   updateCellWidth : function(newStyle, headColumn) {\r
794     \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
799       \r
800       val = parseInt(val);\r
801       \r
802       this.headerTable.style.width = (parseInt(Element.getStyle(this.headerTable, 'width')) + val) + 'px';\r
803       \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
806       \r
807       var index = headColumn.cellIndex ;\r
808       var rows = this.cellTable.rows;\r
809 \r
810       this.cellTable.style.width = this.headerTable.style.width\r
811       \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
817       }\r
818             \r
819     }\r
820   },\r
821   \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
835       }\r
836     }\r
837   },\r
838   \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
845   },\r
846   \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
854   },\r
855   \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
860 \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
865 \r
866     var targetColTitle = this.getColTitle(colIndex);\r
867     jsonRowObj.each(function(j) {\r
868       if (j.column == targetColTitle) {\r
869         j.value = value;\r
870         throw $break;\r
871       }\r
872     });\r
873     var jsonRowText = JSON.stringify(jsonRowObj);\r
874     var params = {\r
875       rowData: jsonRowText,\r
876       column: targetColTitle,\r
877       value: value\r
878     };\r
879     return $H(params).toQueryString();\r
880   },\r
881   \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
888     }\r
889     return jsonDataList;  \r
890   },\r
891   \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
900     }\r
901     return jsonRowObj;\r
902   },\r
903   \r
904   updateGridData : function() {\r
905     \r
906     var jsonDataText = JSON.stringify(this.gridDataToJsonObj());\r
907     var params = 'id=' + encodeURIComponent(this.element.id) + '&data=' + encodeURIComponent(jsonDataText);\r
908 \r
909     new Ajax.Updater(\r
910       this.options.updateGridReceiver, \r
911       this.options.updateGridUrl,\r
912       { \r
913         parameters: params, \r
914         evalScripts: true, asynchronous:true\r
915         \r
916       }\r
917     );    \r
918   },\r
919 \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
927     } else {\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
932       \r
933     }\r
934       \r
935     this.buildStateDiv(row.cells[this.hierarchyColIndex]);\r
936     this.setOutlineIndent(row);\r
937     this.setFontWeight(row);\r
938   },\r
939   \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
945     \r
946     if (document.all) {\r
947       stateDiv.style.position = "absolute";\r
948     } else {\r
949       stateDiv.style.position = "relative";\r
950       stateDiv.style.cssFloat = "left";\r
951     }\r
952     this.addStateClass(cell, stateDiv);\r
953     Event.observe(stateDiv, 'click', this.toggleState.bindAsEventListener(this));\r
954   },\r
955   \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
962     } else {\r
963       this.cssUtil.addClassNames(stateDiv, 'stateClose');\r
964       this.closeRow(row);\r
965     }\r
966   },\r
967   \r
968   toggleState : function(event) {\r
969     var src = Event.element(event);\r
970     var row = src.parentNode.parentNode;\r
971 \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
977       } else {\r
978         this.openRow(row.list);\r
979         this.cssUtil.removeClassNames(src, 'stateClose');\r
980         this.cssUtil.addClassNames(src, 'stateOpen');\r
981       }\r
982     }\r
983   },\r
984   \r
985   openRow : function(list) {\r
986     for (var i = 0; i < list.length; i++) {\r
987       var row = list[i];\r
988       Element.show(row);\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
993       }\r
994     }\r
995   },\r
996   \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
1002     }  \r
1003   },\r
1004 \r
1005   \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
1010   },\r
1011   \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
1016     \r
1017     Element.hide(state);\r
1018   },\r
1019   \r
1020   addHierarchyRow : function(index, values) {\r
1021     if (this.colLength == 0) {\r
1022       return;\r
1023     }\r
1024     var newRow = this.addRow(index, values);\r
1025     \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
1038     } else {\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
1043     }\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
1049       } else {\r
1050         parentList[i].outlineNum = i + 1;\r
1051       }\r
1052       this.setOutline(parentList[i]);\r
1053     }    \r
1054     \r
1055   },\r
1056   \r
1057   deleteHierarchyRow : function(index) {\r
1058     if(isNaN(index) || index >= this.rowLength) {\r
1059       return;\r
1060     }\r
1061     var row = this.getRow(index);\r
1062     if (!row) {\r
1063       return;\r
1064     }\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
1069     \r
1070     for (var i = 0; i < childList.length; i++) {\r
1071       this.deleteChildRow(childList[i]);\r
1072     }\r
1073     parentList.remove(removeIndex);\r
1074     this.deleteRow(index);\r
1075     \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
1080       } else {\r
1081         updateRow.outlineNum = this.getParentRow(updateRow).outlineNum + '.' + (i + 1);\r
1082       }\r
1083       this.setOutline(parentList[i]);\r
1084     }\r
1085     this.setFontWeight(parentRow);\r
1086   },\r
1087   \r
1088   deleteChildRow : function(childRow) {\r
1089     var list = childRow.list;\r
1090     \r
1091     for (var i = 0; i < list.length; i++) {\r
1092       this.deleteChildRow(list[i]);\r
1093     }\r
1094     this.deleteRow(childRow.rowIndex);\r
1095   }, \r
1096   \r
1097   levelUp : function(row) {\r
1098     if (!row) {\r
1099       return;\r
1100     }\r
1101     var previousRow = row.previousSibling;\r
1102     if (row.outlineLevel == 1 || !previousRow) {\r
1103       return;\r
1104     }\r
1105     \r
1106     var parentRow = this.getParentRow(row);\r
1107     var currentList = parentRow.list;\r
1108     \r
1109     var newParentRow = this.getParentRow(parentRow);\r
1110     var targetList = newParentRow ? newParentRow.list : this.topLevelList;\r
1111     \r
1112     var currentIndex = currentList.indexOf(row);\r
1113     var targetIndex = targetList.indexOf(parentRow) + 1;\r
1114 \r
1115     row.outlineLevel -= 1;\r
1116     targetList.insert(targetIndex, row);\r
1117     currentList.remove(currentIndex);\r
1118     \r
1119     while (currentList[currentIndex]) {\r
1120       var moveRow = currentList[currentIndex];\r
1121       row.list.push(moveRow);\r
1122       currentList.remove(currentIndex);\r
1123     }\r
1124     \r
1125     if (row.outlineLevel != 1) {\r
1126       row.outlineNum = newParentRow.outlineNum + '.' + (targetIndex + 1);\r
1127     } else {\r
1128       row.outlineNum = targetIndex + 1;\r
1129     }\r
1130     \r
1131     this.setOutline(row);\r
1132 \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
1136       } else {\r
1137         targetList[i].outlineNum = i + 1;\r
1138       }\r
1139       this.setOutline(targetList[i]);\r
1140     }\r
1141 \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
1147   },\r
1148   \r
1149   levelDown : function(row) {\r
1150     if (!row) {\r
1151       return;\r
1152     }\r
1153     var previousRow = row.previousSibling;\r
1154     var parentRow = this.getParentRow(row);\r
1155     if (!previousRow || parentRow == previousRow) {\r
1156       return;\r
1157     }\r
1158     var currentList = (row.outlineLevel == 1) ? this.topLevelList : parentRow.list;\r
1159     var currentIndex = currentList.indexOf(row);\r
1160     \r
1161     row.outlineLevel += 1;\r
1162     \r
1163     var newParentRow = this.getParentRow(row);\r
1164     var targetList = newParentRow.list;\r
1165     var targetIndex = targetList.length;\r
1166     \r
1167     currentList.remove(currentIndex);\r
1168     targetList.push(row);\r
1169     \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
1175       } else {\r
1176         currentList[i].outlineNum = i + 1;\r
1177       }\r
1178       this.setOutline(currentList[i]);\r
1179     }\r
1180     \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
1184     }\r
1185     \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
1191     \r
1192   },\r
1193   \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
1197     \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
1204     }\r
1205   },\r
1206   \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
1215     }\r
1216     this.setOutlineIndent(row);  \r
1217   },\r
1218   \r
1219   setOutlineIndent : function(row) {\r
1220     var cell = row.cells[this.hierarchyColIndex];\r
1221     if (!cell) {\r
1222       return;\r
1223     }\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
1232   },\r
1233   \r
1234   setFontWeight : function(row) {\r
1235     if (row) {\r
1236       if (!row.list) return;\r
1237       if (row.list.length > 0){\r
1238         row.style.fontWeight = 'bold';\r
1239       } else {\r
1240         row.style.fontWeight = 'normal';  \r
1241       }\r
1242     }\r
1243   },\r
1244   \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
1250     \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
1257     } else {\r
1258       newParentRow = this.getParentRow(previousRow);\r
1259       newParentList = newParentRow ? newParentRow.list : this.topLevelList;\r
1260       insertIndex = newParentList.indexOf(previousRow) + 1;\r
1261     }\r
1262     var parentRow = this.getParentRowByIndex(row, this.targetRowIndex);\r
1263     var parentList = null;\r
1264 \r
1265     var outlineNumBase = '';\r
1266     if (parentRow) {\r
1267       parentList = parentRow.list;\r
1268       outlineNumBase = parentRow.outlineNum + '.';\r
1269     } else {\r
1270       parentList = this.topLevelList;\r
1271       if (!parentList) return;\r
1272     }\r
1273     var removeIndex = parentList.indexOf(row);\r
1274     \r
1275     if (parentList == newParentList && removeIndex < insertIndex) {  \r
1276       insertIndex -= 1;\r
1277       parentList.remove(removeIndex);\r
1278       parentList.insert(insertIndex, row);\r
1279       for (var i = removeIndex; i < parentList.length; i++) {\r
1280         try {\r
1281           parentList[i].outlineNum = outlineNumBase + (i + 1);\r
1282           this.setOutline(parentList[i]); \r
1283         } catch (e) {}\r
1284       }\r
1285     \r
1286     } else {\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
1292       }\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
1300       }\r
1301       this.setOutline(row);    \r
1302     }\r
1303     this.setFontWeight(row);\r
1304     this.setStateClass(row);\r
1305     if (parentRow) {\r
1306       this.setFontWeight(parentRow);\r
1307       this.setStateClass(parentRow);\r
1308     }\r
1309     if (newParentRow) {\r
1310       this.setFontWeight(newParentRow);\r
1311       this.setStateClass(newParentRow);\r
1312     }\r
1313     this.updateHierarchyRowLine(row);\r
1314   },\r
1315   \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
1323     }\r
1324     \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
1329       } else {\r
1330         cellBody.insertBefore(row.list[i], existingRow);\r
1331         idBody.insertBefore(this.getIdRow(row.list[i]), this.getIdRow(existingRow));\r
1332       }\r
1333       this.updateHierarchyRowLine(row.list[i], existingRow);\r
1334     }\r
1335   },\r
1336     \r
1337   getParentRow : function(row) {\r
1338     if (row.outlineLevel == 1) {\r
1339       return null;\r
1340     }\r
1341 \r
1342     var previousRow = row.previousSibling;\r
1343     if (!previousRow) {\r
1344       return null;\r
1345     }\r
1346     try {\r
1347       while (previousRow.outlineLevel != (row.outlineLevel - 1)) {\r
1348         previousRow = previousRow.previousSibling;\r
1349       }\r
1350       return previousRow;\r
1351     } catch (e) {}\r
1352   },\r
1353   \r
1354   getParentRowByIndex : function(row, index) {\r
1355     if (row.outlineLevel == 1) {\r
1356       return null;\r
1357     }\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
1363         }\r
1364       }\r
1365     }\r
1366     return null;\r
1367   },\r
1368   \r
1369   getPreviousRootRow : function(row) {\r
1370     var previousRow = row.previousSibling;\r
1371     if (!previousRow) {\r
1372       return;\r
1373     }\r
1374     while (previousRow.outlineLevel != 1) {\r
1375       previousRow = previousRow.previousSibling;\r
1376     }  \r
1377     \r
1378     return previousRow;\r
1379   },\r
1380   \r
1381   isParentRow : function(row, parentRow) {\r
1382     var temp = this.getParentRow(row);\r
1383     if (!temp) {\r
1384       return false;\r
1385     } else if (temp == parentRow) {\r
1386       return true;\r
1387     } else {\r
1388       return this.isParentRow(temp, parentRow);\r
1389     }\r
1390   }\r
1391 }\r