var Tabikobo = {};
Tabikobo.util = {};

/**
 * オブジェクトを指定selectのoptionとする。
 * 要素名がvalue、オブジェクト値がtextとなる。
 *
 * @param select_elem 対象select要素、idもしくはelem
 * @param obj         変換対象オブジェクト
 * @param init_all    変換前のoptionを全て初期化するか? falseの場合、先頭のoptionを残す
 */
Tabikobo.util.obj2options = function(select_elem, obj, init_all){
  var elem = YAHOO.lang.isString(select_elem) ? YAHOO.util.Dom.get(select_elem) : select_elem;
  while(elem.childNodes.length > (init_all ? 0 : 1)){
    elem.removeChild(elem.lastChild);
  }

  for(var p in obj){
    var opt_elem = document.createElement('option');
    opt_elem.setAttribute('value', p);
    opt_elem.innerHTML = obj[p];
    elem.appendChild(opt_elem);
  }
};

/**
 * selectで選択された要素を指定したselectへ追加する。
 * 追加先に既に登録されている場合は重複させない。
 *
 * @param src_id    コピー元select要素ID
 * @param dest_id   コピー先select要素ID
 */
Tabikobo.util.select_add = function(src_id,dest_id){
  var dest = YAHOO.util.Dom.get(dest_id);
  var arr_dest_id = [];
  for(var idx = 0; idx < dest.options.length; idx++){
    if(dest.options[idx].value){
      arr_dest_id[dest.options[idx].value] = dest.options[idx].text;
    }
  }

  var sel = YAHOO.util.Dom.get(src_id);
  for(idx = 0; idx < sel.options.length; idx++){
    if(sel.options[idx].selected && !(sel.options[idx].value in arr_dest_id)){
      var opt_elem = document.createElement('option');
      opt_elem.setAttribute('value', sel.options[idx].value);
      opt_elem.innerHTML = sel.options[idx].text;
      dest.appendChild(opt_elem);
    }
  }
};

/**
 * selectで選択された要素を削除する
 *
 * @param elem_id    select要素ID
 */
Tabikobo.util.select_remove = function(elem_id){
  var sel = YAHOO.util.Dom.get(elem_id);
  for(var idx = sel.options.length-1; idx >= 0; --idx){
    if(sel.options[idx].selected){
      sel.removeChild(sel.options[idx]);
    }
  }
};

/**
 * selectで選択された要素を上に上げる
 *
 * @param elem_id   select要素ID
 */
Tabikobo.util.select_up = function(elem_id){
  // 選択されている要素を探す
  var sel = YAHOO.util.Dom.get(elem_id);
  for(var idx = 0; idx < sel.options.length; idx++){
    if(!sel.options[idx].selected){ continue; }

    // 一番上だったら何もしない
    if(idx == 0){ return; }

    // それより下の要素で選択されている物があれば解除
    for(var i = idx+1; i < sel.options.length; i++){ sel.options[i].selected = false; }

    // 直前の要素の前へ挿入
    sel.insertBefore(sel.removeChild(sel.options[idx]), sel.options[idx-1]);
    return;
  }
};

/**
 * selectで選択された要素を下に下げる
 *
 * @param elem_id   select要素ID
 */
Tabikobo.util.select_down = function(elem_id){
  // 選択されている要素を探す
  var sel = YAHOO.util.Dom.get(elem_id);
  for(var idx = 0; idx < sel.options.length; idx++){
    if(!sel.options[idx].selected){ continue; }

    // 一番下だったら何もしない
    if(idx == sel.options.length-1){ return; }

    // それより下の要素で選択されている物があれば解除
    for(var i = idx+1; i < sel.options.length; i++){ sel.options[i].selected = false; }

    // 直後の要素の後へ挿入
    sel.insertBefore(sel.removeChild(sel.options[idx+1]), sel.options[idx]);
    return;
  }
};


Tabikobo.util.checkbox = {};

/**
 * 指定クラスのチェックボックスがすべてcheckedになっているかどうか
 *
 * @param classname     要素のクラス名
 * @param root          要素検索開始位置エレメント
 * @return  全部チェックされていたらtrue
 */
Tabikobo.util.checkbox.is_checked_all = function(classname, root){
  var ret = true;
  var elem_root = YAHOO.lang.isString(root) ? YAHOO.util.Dom.get(root) : root;
  YAHOO.util.Dom.getElementsByClassName(classname, 'input', root, function(elem){
    if(elem.getAttribute('type') == 'checkbox' && elem.checked == false){ ret = false; }
  });

  return ret;
};

/**
 * 指定クラスのチェックボックスをすべてonにする
 *
 * @param classname     要素のクラス名
 * @param root          要素検索開始位置エレメント
 * @return  全部チェックされていたらtrue
 */
Tabikobo.util.checkbox.check_all = function(classname, root){
  var elem_root = YAHOO.lang.isString(root) ? YAHOO.util.Dom.get(root) : root;
  YAHOO.util.Dom.getElementsByClassName(classname, 'input', root, function(elem){
    if(elem.getAttribute('type') == 'checkbox') { elem.checked = true; }
  });
};

/**
 * 指定クラスのチェックボックスをすべてoffにする
 *
 * @param classname     要素のクラス名
 * @param root          要素検索開始位置エレメント
 * @return  全部チェックされていたらtrue
 */
Tabikobo.util.checkbox.uncheck_all = function(classname, root){
  var elem_root = YAHOO.lang.isString(root) ? YAHOO.util.Dom.get(root) : root;
  YAHOO.util.Dom.getElementsByClassName(classname, 'input', root, function(elem){
    if(elem.getAttribute('type') == 'checkbox') { elem.checked = false; }
  });
};
