/*
 Spline Javascript Library
 Copyright (C) Spline Co.,Ltd.
*/

ElementAddClass = function(el, className) {
    el.className += ' ' + className;
    Element.addClass(el, className);
}

/* --- ツリー -------------------------------------------------------------- */

function sjlTreeView(id)
{
  var el = $(id);
  if(!el) return false;
  this.id = id;
  this.padding = 23;
  this.ctlHandling = true;
  this.ctlTop = 2;
  this.ctlLeft = 2;
  this.ctlWidth = 11;
  this.ctlHeight = 11;
  this.ctlCursor = 'pointer';
  this.dragMode = false;
  this.ids = new Object();
  this.rootUl = $(id);

  this.images = {
    'root' : new Image(),
    'rootOpen' :  new Image(),
    'rootClose' :  new Image(),
    'normal' :  new Image(),
    'normalOpen' :  new Image(),
    'normalClose' :  new Image(),
    'last' :  new Image(),
    'lastOpen' :  new Image(),
    'lastClose' :  new Image(),
    'first' :  new Image(),
    'firstOpen' :  new Image(),
    'firstClose' : new Image()
  }
  for(var n in this.images) {
    this.images[n].src = 'images/li_line_' + n + '.gif';
  }
  this.classReg = new RegExp;
  var classRegStr = '(^|\\b)(root|rootOpen|rootClose|normal|normalOpen|normalClose|last|lastOpen|lastClose|first|firstOpen|firstClose)($|\\b)';

  // 正規表現のコンパイルが出来ないブラウザ(safari等)に対応させる
  if(this.classReg.compile)
    this.classReg.compile(classRegStr);
  else{
    this.classReg = new RegExp(classRegStr);
  }
}

sjlTreeView.prototype.activate = function() {
  var lis = $(this.id).getElementsByTagName('li');
  var count = 0;
  for(i = 0; i < lis.length; i++) {
    var liid = lis[i].id;
    if(!liid) {
      liid = lis[i].id = this.id + '-li' + i;
    }
    this.ids[liid] = lis[i];
    lis[i].sjlTreeObj = this;
    if(!lis[i].sjl_class_org) lis[i].sjl_class_org = lis[i].className;
    uls = lis[i].getElementsByTagName('ul');
    if(uls.length) {
      var ulid = uls[0].id;
      if(!ulid){
        ulid = uls[0].id = liid + '-ul' + count;
        count++;
      }
      Event.stopObserving(lis[i], 'click', sjlTree_click, false);
      Event.observe(lis[i], 'click', sjlTree_click, false);
    }
    for (var j = 0; j < uls.length; j++) {
        uls[j].sjl_treeClose = uls[j].style.display == 'none';
    }
    if(this.ctlHandling) {
      Event.stopObserving(lis[i], 'mousemove', sjlTree_mousemove, false);
      Event.observe(lis[i], 'mousemove', sjlTree_mousemove, false);
    }
  }
  this.setClassAll(1);
}

sjlTreeView.prototype.setClassAll = function(cust) {
//  var lis_org = $(this.id).getElementsByTagName('li');
  var lis_org = this.rootUl.getElementsByTagName('li');
  var lis = new Array();
  for(i = 0; i < lis_org.length; i++) {
    lis[i] = lis_org[i];
  }
  for(i = 0; i < lis.length; i++) {
    uls = lis[i].getElementsByTagName('ul');
    if(uls.length) {
      if(uls[0].sjl_treeClose) {
        if(!i) {
          if(lastLiChild(lis[i].parentNode) == lis[0]){
            clsName = 'rootClose';
          } else {
            clsName = 'firstClose';
          }
        } else if(lastLiChild(lis[i].parentNode) == lis[i]) {
          clsName = 'lastClose';
        } else {
          clsName = 'normalClose';
        }
      } else {
        if(!i) {
          if(lastLiChild(lis[i].parentNode) == lis[0]){
            clsName = 'rootOpen';
          } else {
            clsName = 'firstOpen';
          }
        } else if(lastLiChild(lis[i].parentNode) == lis[i]) {
          clsName = 'lastOpen';
        } else {
          clsName = 'normalOpen';
        }
      }
      lis[i].sjl_ul = uls[0];
    } else {
      if(!i) {
        if(lastLiChild(lis[i].parentNode) == lis[0]){
          clsName = 'root';
        } else {
          clsName = 'first';
        }
      } else if(lastLiChild(lis[i].parentNode) == lis[i]) {
        clsName = 'last';
      } else {
        clsName = 'normal';
      }
      lis[i].sjl_ul = false;
    }
    lis[i].className = nzStr(lis[i].sjl_class_org) + ' ' + clsName;
    lis[i].style.backgroundImage = 'url(' + this.images[clsName].src + ')';
    if(cust) this.customize(lis[i], clsName);
  }
}

sjlTreeView.prototype.customize = function(elLi, clsName) {
}

sjlTreeView.prototype.setClass = function(el)
{
  Element.removeClass(el, this.classReg);
  if(!el.sjl_ul) {
    if(this.id == el.parentNode.id) {
      if(lastLiChild(el.parentNode) == el){
        className = 'root';
      } else {
        className = 'first';
      }
    } else if(lastLiChild(el.parentNode) == el) {
      className = 'last';
    } else {
      className = 'normal';
    }
  } else if(el.sjl_ul.sjl_treeClose) {
    if(this.id == el.parentNode.id) {
      if(lastLiChild(el.parentNode) == el){
        className = 'rootClose';
      } else {
        className = 'firstClose';
      }
    } else if(lastLiChild(el.parentNode) == el) {
      className = 'lastClose';
    } else {
      className = 'normalClose';
    }
  } else {
    if(this.id == el.parentNode.id) {
      if(lastLiChild(el.parentNode) == el){
        className = 'rootOpen';
      } else {
        className = 'firstOpen';
      }
    } else if(lastLiChild(el.parentNode) == el) {
      className = 'lastOpen';
    } else {
      className = 'normalOpen';
    }
  }
  el.style.backgroundImage = 'url(' + this.images[className].src + ')';
  Element.addClass(el, className);
  return className;
}

sjlTreeView.prototype.expand = function(el)
{
  if(!el.sjl_ul) return;
  if(!el.sjl_ul.sjl_treeClose) {
    el.sjl_ul.style.display = 'none';
    el.sjl_ul.sjl_treeClose = true;
  } else {
    el.sjl_ul.style.display = 'block';
    el.sjl_ul.sjl_treeClose = false;
  }
  this.setClass(el);
  this.onExpand();
}

sjlTreeView.prototype.onExpand = function()
{
}

function sjlTree_mousemove(e)
{
 if(Event.elementNoText(e).sjlTreeObj) {
  var el = Event.elementNoText(e);
  var mel = el.sjlTreeObj.element;
  if(!el.sjl_ul) return;
  var x = Event.pointerX(e) - el.offsetLeft - el.offsetParent.offsetLeft;
  var y = Event.pointerY(e) - el.offsetTop - el.offsetParent.offsetTop;
  mg = el.sjlTreeObj;
/*
  dprint(
   x
   + ':' + Event.pointerX(e)
   + ':' + el.offsetLeft
   + ':' + document.body.offsetLeft
   + ':' + mel.offsetLeft + '<br>'
   + y
   + ':' + Event.pointerY(e)
   + ':' + el.offsetTop
   + ':' + document.body.offsetTop
   + ':' + mel.offsetTop ,'debug');
*/
//dout(el,'debug',1);

  if(mg.ctlLeft <= x && x <= mg.ctlLeft + mg.ctlWidth
   && mg.ctlTop <= y && y <= mg.ctlTop + mg.ctlHeight) {
      el.style.cursor = mg.ctlCursor;
  } else {
      el.style.cursor = 'auto';
  }

 }
}

function sjlTree_click(e)
{
 if(Event.elementNoText(e).sjlTreeObj) {
  var el = Event.elementNoText(e);
  if(!el.sjl_ul) return;
  var mel = el.sjlTreeObj.element;

  var x = Event.pointerX(e) - el.offsetLeft;
  var y = Event.pointerY(e) - el.offsetTop;
  var oel = el.offsetParent;
  while(oel) {
    x -= oel.offsetLeft;
    y -= oel.offsetTop;
    oel = oel.offsetParent;
  }
  mg = el.sjlTreeObj;
  if(mg.ctlLeft <= x && x <= mg.ctlLeft + mg.ctlWidth
   && mg.ctlTop <= y && y <= mg.ctlTop + mg.ctlHeight) {
    Event.elementNoText(e).sjlTreeObj.expand(el);
    Event.stop(e);
  }
 }
 return false;
}

/* --- ドラッグオブジェクト ------------------------------------------------ */

function sjlDragObject(ddm, id)
{
  this.ddm = ddm;
  var el = $(id);
  this.id = el.id;
  this.element = el;
  this.dragOk = true;
  el._sjl_objDrag = this;
  el._sjl_init = false;
}

sjlDragObject.prototype.onDblClick = function() {
}

sjlDragObject.prototype.onClick = function(oDrag) {
}

sjlDragObject.prototype.createDragElement = function(elorg) {
  var el = elorg.cloneNode(true);
  el.id = '_sjl_mvel_' + elorg.id;
  styleOpacity(el, 50);
  Element.removeClass(el, this.ddm.clsSelected);
  Element.addClass(el, this.ddm.clsDraging);
  return el;
}

sjlDragObject.prototype.activate = function(elorg) {
  Element.addClass(this.element, this.ddm.dragOkCursor);
}

sjlDragObject.prototype.onDragStartElement = function(element) {
}

sjlDragObject.prototype.onDragStart = function() {
}

sjlDragObject.prototype.onDragStop = function() {
}

/* --- ドロップオブジェクト ------------------------------------------------ */

function sjlDropObject(ddm, id, dragEl)
{
  this.ddm = ddm;
  var el = $(id);
  this.id = el.id;
  this.element = el;
  el._sjl_dropObject = this;
  _sjl_objDrop[el.id] = this;
  this.top = 0;
  this.left = 0;
  this.width = 0;
  this.height = 0;
  this.clsDropOk = ddm.clsDropOk;
  this.dragEl = dragEl;
}

sjlDropObject.prototype.activate = function() {
  var el1 = document.createElement('span');
  el1.style.position = 'absolute';
  el1.style.cursor = 'pointer';
  var el2 = this.element.cloneNode(true);
  el2.id += '-drop';
  this.targetElement = el2;
  el2.style.visibility = 'hidden';
  /*
    ネットスケープの場合はposition=absoluteのオブジェクトの位置がずれるので補正
    しかし完全に補正する事は出来ない。
   */
  if(_sjl_Browser == 'Netscape') {
    el1.style.marginTop = '-1em';
  }

  /*
    IE6の場合、absoluteスタイルの要素は何か描画されていないと
    クリッカブルにならない。ダミーのURLスキーマでバッググラウ
    ンドイメージを指定する事で、要素内の矩形範囲全体をクリッカ
    ブルにする事ができる。
   */
  if(_sjl_Browser == 'IE')
    el1.style.backgroundImage='url(dummy://)';

  el1.style.zIndex = this.ddm.zStart + 100;
  Element.addClass(el1,'dragObj');
//el1.style.background = '#ffff00';
//el2.style.background = '#ff00ff';

  el1._sjl_dropObject = this;
  el1._sjl_targetid = this.element.id;
  el1._sjl_init = false;

  el1.appendChild(el2);
  this.element.parentNode.insertBefore(el1, this.element);

  Event.observe(el1,'mouseover', sjlDropObject_mouseover, false);
  Event.observe(el1,'mousedown', sjlDropObject_mousedown, false);
  Event.observe(el1, 'selectstart', sjlDropObject_selectstart, false);
  Event.observe(el1, 'mousemove', sjlDropObject_mousemove, false);
  Event.observe(el1, 'mouseup', sjlDropObject_mouseup, false);
}

sjlDropObject.prototype.activateOneself = function() {
  var el2 = this.element;
  this.targetElement = el2;
//  Element.addClass(el2,'dragObj'); // test時のみ有効にする
  el2._sjl_dropObject = this;
  el2._sjl_targetid = this.element.id;
  el2._sjl_init = false;
  Event.observe(el2,'mouseover', sjlDropObject_mouseover, false);
  Event.observe(el2,'mousedown', sjlDropObject_mousedown, false);
  Event.observe(el2, 'selectstart', sjlDropObject_selectstart, false);
  Event.observe(el2, 'mousemove', sjlDropObject_mousemove, false);
  Event.observe(el2, 'mouseup', sjlDropObject_mouseup, false);
}

function sjlDropObject_mousemove(e) {
}

function sjlDropObject_selectstart(e)
{
  Event.stop(e);
  return false;
}


function sjlDropObject_mouseover(e, id)
{
  var el = Event.elementNoText(e);
  if(!el._sjl_dropObject || !el._sjl_dropObject.ddm || !el._sjl_dropObject.ddm.dragObj) return;
  var ddm = el._sjl_dropObject.ddm;
  if(!el._sjl_init) {
    Event.observe(el,'mouseout', sjlDropObject_mouseout, false);
    Event.observe(el,'mouseup', sjlDropObject_mouseup, false);
    el._sjl_init = true;
  }
  var obj = el._sjl_dropObject;
  if(ddm.selected[el._sjl_targetid]) return;
  if(!obj.dropOk(ddm, ddm.dragObj, obj)) return;
  if (1 <= ddm.dragmode) obj.dropOkStyle($(el._sjl_targetid));
}

function sjlDropObject_mousedown(e, id)
{
  var el = Event.elementNoText(e);
  el._sjl_dropObject.dragEl.ddm.dragSetup(e, el._sjl_dropObject.dragEl);
  Event.stop(e);
}

function sjlDropObject_mouseout(e, id)
{
  var el = Event.elementNoText(e);
  if(!el._sjl_dropObject || !el._sjl_dropObject.ddm || !el._sjl_dropObject.ddm.dragObj) return;
  var obj = el._sjl_dropObject;
  var ddm = el._sjl_dropObject.ddm;
  if(ddm.selected[el._sjl_targetid]) return;
  if(!obj.dropOk(ddm, ddm.dragObj, obj)) return;
  obj.normalStyle($(el._sjl_targetid));
}

function sjlDropObject_mouseup(e, id)
{
  var el = Event.elementNoText(e);
  if(!el._sjl_dropObject || !el._sjl_dropObject.ddm || !el._sjl_dropObject.ddm.dragObj) return;

  var ddm = el._sjl_dropObject.ddm;

  var obj = el._sjl_dropObject;
  if(obj.element != ddm.dragObj.element
   && obj.dropOk(ddm, ddm.dragObj, obj))
    obj.doDrop(ddm, ddm.dragObj, obj);
  var dragmode_bk = ddm.dragmode;
  var dragmode_bk = ddm.dragmode;
  ddm.dragStop();
  obj.normalStyle($(el._sjl_targetid));
  if (dragmode_bk <= 1)
    ddm.selectSetup($(el._sjl_targetid), Event.ctrl(e), 1);
}

sjlDropObject.prototype.normalStyle = function(el) {
  Element.removeClass(el, this.clsDropOk);
}

sjlDropObject.prototype.dropOk = function(ddm, src, dist) {
   return true;
}

sjlDropObject.prototype.doDrop = function(ddm, src, dist) {
   return true;
}

sjlDropObject.prototype.dropOkStyle = function(el) {
  Element.addClass(el, this.clsDropOk);
}


/* --- ドラッグ＆ドロップマネージャー -------------------------------------- */

function sjlDdManager(id)
{
  this.rootElement = $(id);
  this.dragfield = document;
  this.dragmode = 0;
  this.dragObj = 0;
  this.backgroundPositionBackup = '0';
  this.zStart = 10;
  this.selected = new Object();
  this.dragOkCursor = 'dragOkCursor';
  this.dropOkCursor = 'dropOkCursor';
  this.clsDraging = 'draging';
  this.clsDropOk = 'dropOk';
  this.clsSelected = 'selected';
  this.multiSelect = false;
  var oDdm = this;

  Event.observe(document, 'mouseup', function(e) {
    if(!oDdm) return;
    Event.stop(e);
    oDdm.dragStop();
  }, false);

  Event.observe(this.rootElement, 'mousedown', function(e) {
    if(!oDdm) return;
    if(!oDdm.dragmode) {
      if(!oDdm.onSelectClear()) return;
      oDdm.selectClear();
    }
  }, false);

  Event.observe(document, 'mousemove', function(e) {
    if(!oDdm) return;
    if(oDdm.dragObj && !oDdm.dragObj.dragOk) return;
    if(oDdm.dragmode == 1) {
      oDdm.dragStart1(e);
    } if(oDdm.dragmode == 2) {
      oDdm.dragStart2(e);
    } else if(oDdm.dragmode == 3) {
      oDdm.dragMove(e);
    }
    if(oDdm.dragmode) {
      Event.stop(e);
    }
  }, false);
}

sjlDdManager.prototype.createDragObject = function(id) {
  return new sjlDragObject(this, id);
}

sjlDdManager.prototype.createDropObject = function(id, dragEl) {
  return new sjlDropObject(this, id, dragEl);
}

sjlDdManager.prototype.redraw = function () {
  if(_sjl_Browser != 'Netscape' && _sjl_Browser != 'Opera') return;
  /* 
    NetScapeの画面書き換えに問題があり、ドラッグ中のオブジェクトが
    複数表示されてしまう事がある。画面を強制的にリフレッシュさせる
    ために以下のコードを実行する。
    またOpera9の場合も画面のちらつきを以下のコードで押さえる事が可能。
    */
  var elb = document.body;
  var bk = elb.style.backgroundPosition;
  if(!bk) bk = this.backgroundPositionBackup;
  elb.style.backgroundPosition = '1px'
  elb.style.backgroundPosition = bk;
}

sjlDdManager.prototype.dragSetup = function(e, oDrag) {
  this.dragStop();
  if(this.dragmode) return;
  this.dragObj = oDrag;
  this.dragmode = 1;
  this.dragStartX = Event.pointerX(e);
  this.dragStartY = Event.pointerY(e);
}

sjlDdManager.prototype.isDragSetupComplete = function() {
  return this.dragmode == 1;
}

sjlDdManager.prototype.dragStart1 = function(e) {
  this.dragmode = 2;
}

sjlDdManager.prototype.dragStart2 = function(e) {
  this.selectSetup(this.dragObj.element, 2, 0);
  for(var id in this.selected) {
    if(this.selected[id]) {
      var mvel = this.dragObj.createDragElement(this.selected[id].el);
      this.selected[id].position_bk = this.selected[id].el.style.position;
      this.selected[id].el.style.position = 'relative';
      this.selected[id].el.appendChild(mvel);
      this.selected[id].mvel = mvel;
      this.selected[id].el.style.zIndex = this.zStart + 2;
      mvel.style.position = 'absolute';
      mvel.style.left = 0;
      mvel.style.top = 0;
      if(_sjl_Browser == 'Firefox') mvel.style.width = '100%';
      mvel.oDdm = this;
      this.dragmode = 3;
      this.selected[id].el._sjl_objDrag.onDragStartElement(this.selected[id].el);
    }
  }

//  Element.addClass(document.body, this.dragOkCursor);
//  Element.addClass(this.rootElement,'dragNow');

  this.dragObj.onDragStart();
}

sjlDdManager.prototype.dragMove = function(e) {
  for(var id in this.selected) {
    if(this.selected[id]) {
      this.selected[id].mvel.style.left = (Event.pointerX(e)- this.dragStartX) + 'px';
      this.selected[id].mvel.style.top = (Event.pointerY(e) - this.dragStartY) + 'px';
    }
  }
  this.redraw();
}

var tt = 0;

sjlDdManager.prototype.dragStop = function() {
$('t1').innerHTML = tt + ':' + this.dragmode;
tt++;
  if(1 < this.dragmode) {
    for(var id in this.selected) {
      if(this.selected[id]) {
        if(this.selected[id].mvel) {
          this.selected[id].el.removeChild(this.selected[id].mvel);
          this.selected[id].mvel = null;
        }
        this.selected[id].el.style.position = nzStr(this.selected[id].position_bk);
      }
    }
    this.dragmode = 0;

//    Element.removeClass(document.body, this.dragOkCursor);
//    Element.removeClass(this.rootElement,'dragNow');
    this.dragObj.onDragStop();
    this.dragObj = null;
  }
  this.dragmode = 0;
  this.redraw();
}

sjlDdManager.prototype.selectSetup = function(el, mode, mode2)
{
  if(!this.multiSelect) {
    this.selectClear();
    if(!this.selected[el.id]){ 
      this.selected[el.id] = new Object();
      this.selected[el.id].el = el;
    }
    Element.addClass(el, this.clsSelected);
  } else {
    if(mode) {
      if(this.selected[el.id]) {
        if(mode == 1) {
          this.selected[el.id] = null;
          Element.removeClass(el, this.clsSelected);
        }
      } else {
        if(!this.selected[el.id]){
         this.selected[el.id] = new Object();
         this.selected[el.id].el = el;
        }
        Element.addClass(el, this.clsSelected);
      }
    } else {
      if(!this.selected[el.id] || mode2 == 1) {
        this.selectClear();
        this.selected[el.id] = new Object();
        this.selected[el.id].el = el;
        Element.addClass(el, this.clsSelected);
      }
    }
  }
}

sjlDdManager.prototype.onSelectClear = function()
{
  return true;
}

sjlDdManager.prototype.selectClear = function()
{
  for(id in this.selected) {
    Element.removeClass(this.selected[id].el, this.clsSelected);
  }
  this.selected = new Object();
}

/* --- 編集可能ツリー ------------------------------------------------------ */

function sjlEditableTreeView(id, ddm) {
  this.__super = sjlTreeView;
  this.__super(id);
  this.constructor = sjlEditableTreeView;
  delete __super;

  if (ddm) this.ddm = ddm;
  else this.ddm = new sjlDdManager(id);

  this.ctrl = null;
  this.clsTopBar = 'topBar';
  this.clsBottomBar = 'bottomBar';
  this.dragMode = true;

}
sjlEditableTreeView.prototype = new sjlTreeView();

sjlEditableTreeView.prototype.customize = function(elLi, clsName) {

  /*
    IEではLI直後の最初の要素がrelativeな場合、要素左側に要素のマージン部分が
    存在してしまう場合がある。それを回避するためにダミーの要素を入れる
   */
  e0 = document.createElement('span');
  e0.style.position = 'absolute';
  e1 = document.createElement('span');
  e1.id = elLi.id + '-up';
  e1bar = document.createElement('span');

  // IE以外の場合はバーのラッパをblock型にする
  // IEではLI要素のfirstChildがブロック要素の場合、強制的に1emの高さを確保
  // されてしまうため、インライン要素にする。
  if(_sjl_Browser != 'IE') e1.style.display='block';
  Element.addClass(e1bar, this.clsTopBar);
  e1.style.position = 'relative';
  e1.style.zIndex = this.ddm.zStart + 102;
  e1.appendChild(e1bar);

  e2 = document.createElement('span');
  e2.id = elLi.id + '-main';
  var first = elLi.removeChild(elLi.firstChild);
  e2.appendChild(first);
  elLi.sjl_value = first.nodeValue;

  e3 = document.createElement('div');
  e3.id = elLi.id + '-down';
  e3.style.position = 'relative';
  e3.style.zIndex = this.ddm.zStart + 103;
  e3bar = document.createElement('div');
  Element.addClass(e3bar, this.clsBottomBar);
  e3.appendChild(e3bar);

//e1bar.style.background = '#ff0000';
//e3bar.style.background = '#0000ff';

  /*
    IE6の場合、absoluteスタイルの要素は何か描画されていないと
    クリッカブルにならない。ダミーのURLスキーマでバッググラウ
    ンドイメージを指定する事で、要素内の矩形範囲全体をクリッカ
    ブルにする事ができる。
   */
/*
  if(_sjl_Browser == 'IE') {
    e1bar.style.backgroundImage='url(dummy://)';
    e3bar.style.backgroundImage='url(dummy://)';
  }
*/

  elLi.insertBefore(e2, elLi.firstChild);
  elLi.insertBefore(e1, elLi.firstChild);
  elLi.insertBefore(e0, elLi.firstChild);
  elLi.appendChild(e3);

  var drag_e2 = this.ddm.createDragObject(e2)
  drag_e2.oTree = this;
  drag_e2.dragOk = this.dragMode;
  drag_e2.onDragStart = sjlEditableTreeView_onDragStart;
  drag_e2.onDragStop = sjlEditableTreeView_onDragStop;
  drag_e2.onDblClick = sjlEditableTreeView_element_onDblClick;
  drag_e2.activate();

  if(!this.dragMode) return;
  drag_e2.onClick = sjlEditableTreeView_element_onClick;

  var drop_e2 = this.ddm.createDropObject(e2, drag_e2);
  drop_e2.dropOk = sjlEditableTreeView_element_dropOk;
  drop_e2.doDrop = sjlEditableTreeView_element_doDrop;
  drop_e2.activate();
/*
  var drop_e1 = this.ddm.createDropObject(e1bar);
  drop_e1.dropOk = sjlEditableTreeView_topLine_dropOk;
  drop_e1.doDrop = sjlEditableTreeView_topLine_doDrop;
  drop_e1.clsDropOk = 'dropOkBar';
  drop_e1.activateOneself();

  var drop_e3 = this.ddm.createDropObject(e3bar);
  drop_e3.sjl_li = elLi;
  drop_e3.dropOk = sjlEditableTreeView_bottomLine_dropOk;
  drop_e3.doDrop = sjlEditableTreeView_bottomLine_doDrop;
  drop_e3.clsDropOk = 'dropOkBar';
  drop_e3.activateOneself();
*/
}

function sjlEditableTreeView_onDragStart()
{
/*
  this.activeTree_bk = this.element.parentNode.parentNode.parentNode;
  if(this.activeTree_bk) {
    Element.addClass(this.activeTree_bk,'activeTree');
  }
*/
}

function sjlEditableTreeView_onDragStop()
{
/*
  if(this.activeTree_bk) {
    Element.removeClass(this.activeTree_bk, 'activeTree');
  }
*/
}

function sjlEditableTreeView_topLine_dropOk(ddm, src, dist) {
   return true;
}

function sjlEditableTreeView_topLine_doDrop(ddm, src, dist) {
  if(src.oTree.ctrl) src.oTree.ctrl.insertBefore(src.element.parentNode.id,
    dist.element.parentNode.parentNode.id);
  else src.oTree.insertBefore(src.element.parentNode, dist.element.parentNode.parentNode);
  return true;
}

function sjlEditableTreeView_bottomLine_dropOk(ddm, src, dist) {
  return true;
}

function sjlEditableTreeView_bottomLine_doDrop(ddm, src, dist) {
  if(src.oTree.ctrl) src.oTree.ctrl.insertNext(src.element.parentNode.id,
    dist.element.parentNode.parentNode.id);
  else src.oTree.insertNext(src.element.parentNode, dist.element.parentNode.parentNode);
  return true;
}

function sjlEditableTreeView_element_dropOk(ddm, src, dist) {

  // 自分の子にはドロップできない
  for(var id in ddm.selected) {
    if(ddm.selected[id].el) {
      var srcEl = ddm.selected[id].el.parentNode;
      var el = dist.element.parentNode;
      while(el) {
        if(el == srcEl) return false;
        el = el.parentNode;
      }
    }
  }
  return true;
}

function sjlEditableTreeView_element_onDblClick(oDrag) {
  oDrag.oTree.expand(oDrag.element.parentNode);
}

function sjlEditableTreeView_element_onClick(oDrag) {
  oDrag.oTree.onClick(oDrag);
}

sjlEditableTreeView.prototype.onClick = function(oDrag) {
}

function sjlEditableTreeView_element_doDrop(ddm, src, dist)
{
  if(src.oTree.ctrl) src.oTree.ctrl.move(src.element.parentNode.id, dist.element.parentNode.id);
  else src.oTree.move(src.element.parentNode, dist.element.parentNode);
}

// 要素の移動
sjlEditableTreeView.prototype.move = function(srcLi, distLi) {
  var tmp = srcLi.parentNode.parentNode.sjl_ul.getElementsByTagName('li');
  var liCount = 0;
  for(var i = 0;i < tmp.length;i++)
    if(tmp[i].parentNode == srcLi.parentNode.parentNode.sjl_ul) liCount++;
  var srcIsOnlyNode = (liCount == 1) ? true : false;
  var srcIsLastNode = lastLiChild(srcLi.parentNode.parentNode.sjl_ul) == srcLi;
  var distHaveUl = distLi.sjl_ul ? true : false;
  var srcParent = srcLi.parentNode.parentNode;
  var sameParent = srcLi.parentNode.parentNode == distLi;
  srcParent.sjl_ul.removeChild(srcLi);
  if(srcIsOnlyNode && !sameParent) {
    srcParent.removeChild(srcParent.sjl_ul)
    srcParent.sjl_ul = null;
    this.setClass(srcParent);
  } else if(srcIsLastNode) {
    if(lastLiChild(srcParent.sjl_ul))
      this.setClass(lastLiChild(srcParent.sjl_ul));
  }
  if(!distHaveUl) {
    distLi.sjl_ul = document.createElement('ul');
    insertPoint = $(distLi.id + '-main').nextSibling;
    distLi.insertBefore(distLi.sjl_ul, insertPoint);
    Event.observe(distLi, 'click', sjlTree_click, false);
  }
  distLi.sjl_ul.insertBefore(srcLi, distLi.sjl_ul.firstChild);
  distLi.sjl_ul.style.display = 'block';
  distLi.sjl_ul.sjl_treeClose = false;
  this.setClass(srcLi);
  this.setClass(distLi);
}

// ある要素を指定要素の次に配置
sjlEditableTreeView.prototype.insertNext = function(srcLi, distLi) {
  if(srcLi == distLi || distLi.nextSibling == srcLi) return false;
  if(distLi == lastLiChild(distLi.parentNode)) {
    distLi.parentNode.appendChild(srcLi.parentNode.removeChild(srcLi));
  } else {
    distLi.parentNode.insertBefore(srcLi.parentNode.removeChild(srcLi),distLi.nextSibling);
  }
  this.setClass(srcLi);
  this.setClass(distLi);
  this.setClass(lastLiChild(distLi.parentNode));
  return true;
}

// ある要素を指定要素の前に配置
sjlEditableTreeView.prototype.insertBefore = function(srcLi, distLi) {
  if(srcLi == distLi || distLi == srcLi.nextSibling) return false;
  distLi.parentNode.insertBefore(srcLi.parentNode.removeChild(srcLi),distLi);
  this.setClass(srcLi);
  this.setClass(distLi);
  this.setClass(lastLiChild(distLi.parentNode));
  return true;
}

// 現在選択されている要素を返す（マルチセレクトの場合は最後に選択された要素）
sjlEditableTreeView.prototype.current = function() {
  var id = 0;
  var flg = false;
  var el = null;
  for(var tmp in this.ddm.selected) {
    el = this.ddm.selected[tmp].el.parentNode;
  }
  return el;
}

// 要素の削除
sjlEditableTreeView.prototype.remove = function(srcLi, flgUnset) {
  if(flgUnset) this.ddm.selectClear();
  if(!srcLi) {
    while(this.rootUl.firstChild)
      this.rootUl.removeChild(this.rootUl.firstChild);
    return;
  }

  var parentLi = srcLi.parentNode.parentNode;
  var previous = previousLi(srcLi);
  srcLi.parentNode.removeChild(srcLi);
  delete this.ids[srcLi.id];
  delete srcLi;
  if(previous) this.setClass(previous);
  if(parentLi && parentLi.sjl_ul && parentLi.sjl_ul.getElementsByTagName('li').length == 0) {
    parentLi.removeChild(parentLi.sjl_ul);
    parentLi.sjl_ul = null;
    this.setClass(parentLi);
  }
}

// 新しい要素の作成
// pos : 挿入位置(-1で一番最後)
sjlEditableTreeView.prototype.create = function(rootLi, pos, id, value, flgClsSet) {
  var ul;
  if(!rootLi) ul = this.rootUl;
  else {
    if(!rootLi.sjl_ul) {
      rootLi.sjl_ul = document.createElement('ul');
      Event.observe(rootLi, 'click', sjlTree_click, false);
      rootLi.insertBefore(rootLi.sjl_ul, rootLi.lastChild);
    }
    ul = rootLi.sjl_ul;
  }

  var pLi = posLiChild(ul, pos);
  var newLi = document.createElement('li');
  newLi.sjlTreeObj = this;
  if(id) newLi.id = id;
  newLi.appendChild(document.createTextNode(this.valueConvert(value)));
  ul.insertBefore(newLi, pLi);
  this.ids[newLi.id] = newLi;

  if(flgClsSet) {
    this.customize(newLi, this.setClass(newLi));
    var prev = previousLi(newLi);
    if(prev) this.setClass(prev);
    if(rootLi) this.setClass(rootLi);
  } else {
    this.customize(newLi, '');
  }
}

// 指定されたLI要素の親のLI要素を返す。指定要素がルートノードの場合はnullを返す
sjlEditableTreeView.prototype.parentLi = function(li) {
  if(li.parentNode == this.rootUl) return null;
  return li.parentNode.parentNode;
}

sjlEditableTreeView.prototype.value = function(li) {
  return li.sjl_value;
}

sjlEditableTreeView.prototype.valueConvert = function(v) {
  if(v.match(/^[ 　]*$/)) {
    return '[空白]';
  }
  return v;
}

sjlEditableTreeView.prototype.setValue = function(li, newValue) {
  if(newValue == li.sjl_value) return;

  var v = this.valueConvert(newValue);
  li.sjl_value = v;
  var el = $(li.id + '-main');
  if(el) el.replaceChild(document.createTextNode(v), el.firstChild);
  el = $(li.id + '-drop');
  if(el) el.replaceChild(document.createTextNode(v), el.firstChild);
}

