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

/* --- 大域変数 ------------------------------------------------------------ */
var _sjl_objDrop = new Object();
var _sjl_objDdManager = null;
var _sjl_Browser = '';

/* --- デバッグ関数 -------------------------------------------------------- */

function dout(el, id, mode)
{
 var str = '';
 for(var a in el) {
    str += a + '=' + el[a] + '<br>\x0a\x0d';
 }
 if(!mode) $(id).innerHTML = str;
 else $(id).innerHTML += str;
}

function dprint(str, id, mode)
{
 if(!mode) $(id).innerHTML = str;
 else $(id).innerHTML += str;
}

function da(el)
{
 var str = '';
 for(a in el) {
  str += a + '=' + el[a] + '\x0a\x0d';
 }
 alert(str);
}

function da2(el)
{
 var str = '';
 for(a in el) {
  if(el[a])
  str += a + '=' + el[a] + '\x0a\x0d';
 }
 alert(str);
}

/* --- 一般関数 ------------------------------------------------------------ */

// 指定した変数が存在しない場合、文字列長０の文字列を返す。存在する場合は
// 入力値をそのまま返す
function nzStr(val)
{
 return val ? val : '';
}

// 指定した変数が存在しない場合は０を返す。存在する場合は入力値をそのまま返す
function nz(val)
{
 return val ? val : 0;
}

// 指定した要素の中に含まれる最後のLI要素を返す
function lastLiChild(el)
{
 var out = el.lastChild;
 while(out && out.tagName != 'LI')
  out = out.previousSibling;
 return out;
}

// 指定した要素のpos番目のLI要素を返す
// pos個のLI要素が存在しない時はnullを返す
function posLiChild(el, pos)
{
  if(pos == -1) return null;
  var out = el.firstChild;
  var num = 0;
  while(out) {
    if(out.tagName == 'LI') {
      if(num == pos) return out;
      num++;
    }
    out = out.nextSibling;
  }
  return null;
}

// 指定したLI要素の前のLI要素を求める
function previousLi(el)
{
 var out = el.previousSibling;
 while(out && out.tagName != 'LI')
  out = out.previousSibling;
 return out;
}

// 指定したLI要素の次のLI要素を求める
function nextLi(el)
{
 var out = el.nextSibling;
 while(out && out.tagName != 'LI')
  out = out.nextSibling;
 return out;
}

// 指定したLI要素が、親要素の何番目のLI要素なのかを返す
function liPos(el)
{
  var el2 = el.parentNode.firstChild;
  var num = 0;
  while(el2) {
    if(el2.tagName == 'LI') {
      if(el2 == el) return num;
      num++;
    }
    el2 = el2.nextSibling;
  }
  return null;
}

// 要素を半透明にする
function styleOpacity(el, val)
{
  if (typeof el.style.opacity == "string") {         // Firefox, Opera
    el.style.opacity = val / 100.0;
  } else if (typeof el.style.filter == "string") {                 // IE
    el.style.filter = "Alpha(opacity=" + val + ")";
  }else {
    el.style.background = 'url(images/mesh.gif)';
  }
}

// 指定した要素テーブルにdisable属性を設定
function setDisabled(els, mode)
{
  for(var i = 0; i < els.length; i++) {
    if(!mode) els[i].disabled = null;
    else els[i].disabled = 'disabled';
  }
}

/* 
   第一パラメーターで指定した要素が第二パラメーターで指定した
   要素の子孫か自分自身なら真を返す 
*/
function isDescendant(el, parent) {
  var tmp = el;
  while(tmp != document.body) {
    if(tmp == parent) return true;
    tmp = tmp.parentNode;
  }
  return false;
}

var _sjl_unlink_body_count = 0;
var _sjl_unlink_body_tmp1 = null;
var _sjl_unlink_body_tmp2 = null;

// 現在のbody要素をdocumentツリーから切り放し、ダミーのbody要素を設置する
/*
 IEで大量のDOM操作を行う場合で、対象となる要素がdocumentの子要素である場合、
 非常に時間がかかる場合がある。そこでbody要素ごとdocumentから切り放しDOM
 操作を行う事で高速化を図れる場合がある。
 unlinkBodyとlinkBodyはセットになっており、unlinkBodyは何回でもコールする事
 ができる。unlinkBodyをコールした回数と同じだけlinkBodyがコールされた時、
 body要素は元に戻される。
 
 ※body要素がdocumentから切り放されている状態では、document.getElementById()
   等、重要な関数のいくつかが利用できないので注意する事。
*/

function unlinkBody()
{
  if(_sjl_Browser != 'IE') return;
  if(!_sjl_unlink_body_count) {
    _sjl_unlink_body_tmp1 = document.body;
    _sjl_unlink_body_tmp2 = document.createElement('body');
     document.body.parentNode.replaceChild(
       _sjl_unlink_body_tmp2, _sjl_unlink_body_tmp1);
  }
  _sjl_unlink_body_count++;
}

function linkBody()
{
  if(_sjl_Browser != 'IE') return;
  if(_sjl_unlink_body_count == 1) {
    document.body.parentNode.replaceChild(
      _sjl_unlink_body_tmp1, _sjl_unlink_body_tmp2);
  }
  _sjl_unlink_body_count--;
}

/* --- sjl初期化関数 -------------------------------------------------------- */
function sjlInitialize()
{
  // ユーザーエージェントの調査
  if(window.opera) {
    _sjl_Browser = 'Opera';
  } else if(navigator.appName.indexOf("Opera") >= 0){
    _sjl_Browser = 'Opera';
  } else if(navigator.appName.indexOf("Microsoft") >= 0){
    _sjl_Browser = 'IE';
  }else if(navigator.userAgent.indexOf("Firefox") >= 0){
    _sjl_Browser = 'Firefox';
  }else if(navigator.userAgent.indexOf("Safari") >= 0){
    _sjl_Browser = 'Safari';
  }else if(navigator.appName.indexOf("Netscape") >= 0){
    _sjl_Browser = 'Netscape';
  }

  // backgroundイメージのキャッシュ
  // IEの場合、スタイルシートで指定されたbackgroundイメージ
  // の上にマウスカーソルがホバーすると、再読み込みするという
  // 特性がある。このためマウスカーソルがちらつく事になるので
  // それを回避するための措置
  if (_sjl_Browser == 'IE' && document.execCommand) {
    document.execCommand("BackgroundImageCache", false, true);
  }

  // prototype.jsの拡張
  
  // コントロールキーが押されているかどうかを返す
  Event.ctrl = function(e) {
   return nz(e.ctrlKey) + nz(e.modifiers & 2);
  }

  // クラス名の変換
  // prototype.jsの実装では、IE6でのクラス名変換が重い。
  // この問題を回避するために高速化と正規表現に対応した関数を用意した。
  Element.addClass = function(el, className) {
    if(!el.className) {
      el.className = className;
      return;
    }
    re = new RegExp('(^|\\b)' + className + '($|\\b)');
    if(!el.className.match(re))
      el.className += ' ' + className;
  }
  
  Element.removeClass = function(el, className) {
    if(el.className)
      el.className = el.className.replace(className, ' ');
  }

  /*
   * イベントを発生させたエレメントがテキストエレメントの場合、
   * その親エレメントを返す。ネットスケープに対応させるために
   * 必要な処理で、Event.element()の変わりに利用する
   */
  Event.elementNoText = function(e) {
    var out = this.element(e);
    if(out.nodeName == '#text') out = out.parentNode;
    return out;
  }
}

