
var appName = window.navigator.appName;
var is_MS = (appName.toLowerCase().indexOf('explorer') >= 0);        // MSIE, Sleipnir
//var is_Netscape = (appName.toLowerCase().indexOf('netscape') >= 0);  // Firefox, Safari
var is_Opera = (appName.toLowerCase().indexOf('opera') >= 0);

function getNaviLanguage()
{
  var lang = window.navigator.systemLanguage;
  if (lang == null) {
    lang = window.navigator.language;
  }
  if (lang == null) {
    return "";
  } else {
    return lang;
  }
}

function fillLeft(str, ch, len)
{
  if (str == null) {
    str = "";
  }

  var org_len = str.length;
  for (var i=0; i < len - org_len; i++) {
    str = ch + str;
  }
  return str;
}

function addInputHidden(frm, id, name, value)
{
  if (frm.childNodes != null) {
    for (var i=0; i<frm.childNodes.length; i++) {
      child = frm.childNodes[i];
      if (child.name == name) {
        frm.removeChild(child);
      }
    }
  }
  var elem = document.createElement('input');
  elem.type = "hidden";
  if (id != null) {
    elem.id = id;
  }
  elem.name = name;
  elem.value = value;
  frm.appendChild(elem);
}

function removeElem(id)
{
  var elem=$(id);
  if (elem != null) {
    elem.parentNode.removeChild(elem);
  }
}

function openWindow(url, width, height, name)
{
  options = "directories=no, location=no, resizable=no";

  if (width > 0 && height > 0) {
    w = screen.availWidth/2;
    h = screen.availHeight/2;
    options += ",left="+(w-(width/2))+",top="+(h-(height/2));
    options += ", width="+width+",height="+height;
  }

  subwin=window.open(url, name, options);
  subwin.focus();
}

function replaceAll(str, from, to)
{
  var idx = str.indexOf(from);

  var base = "";
  var startIdx = idx;
  while (idx > -1) {
    str = str.replace(from, to); 
    idx = str.indexOf(from);
    if (idx < startIdx) {
      break;
    }
    startIdx = idx;
  }
  return str;
}

function removeArrayElements(ary, del_ary)
{
  for (var i=0; i < ary.length; i++) {
    for (k=0; k < del_ary.length; k++) {
      if (ary[i] == del_ary[k]) {
        ary.splice(i, 1);
        i--;
        break;
      }
    }
  }
  return ary;
}

function getListSelected(list)
{
  var sel_ary = new Array();
  for (var i=0; i<list.length; i++) {
    var option=list.options[i];
    if (option.selected == true) {
      sel_ary[sel_ary.length] = option.value;
    }
  }
  return sel_ary;
}

function addList(list, text, value, allowDuplex)
{
  if (!allowDuplex) {
    for (var i=0; i<list.length; i++) {
      var option=list.options[i];
      if (option.value == value) {
        return;
      }
    }
  }

  list.options[list.length++] = new Option(text, value);
}

function deleteList(list)
{
  var del_ary = new Array();
  for (var i=0; i < list.length; i++) {
    var option = list.options[i];
    if (option.selected == true) {
      del_ary[del_ary.length] = option.value;
      list.options[i] = null;
      i--;
    }
  }
  list.selectedIndex = -1;
  return del_ary;
}

function sortList(list, direction)
{
  var opts = new Array();
  for (var i=0; i < list.length; i++) {
    var option = list.options[i];
    opts.push(option);
  }
  list.length = 0;

  if (direction == "ASC") {
    opts.sort(_sortTextASC);
  } else {
    opts.sort(_sortTextDESC);
  }

  for (var i=0; i < opts.length; i++) {
    list.options[list.length++] = opts[i];
  }
}

function _sortTextASC(a, b)
{
  if (a.text == b.text) {
    return 0;
  }
  return (a.text > b.text)? 1 : -1;
}

function _sortTextDESC(a, b)
{
  return _sortTextASC(a, b) * (-1);
}

function moveList(src, dst)
{
  var ret_ary = new Array();
  for (var i=0; i < src.length; i++) {
    var option = src.options[i];
    if (option.selected == true) {
      var duplex = false;
      for (var k=0; k < dst.length; k++) {
        if (dst.options[k].value == option.value) {
          dst.options[k].text = option.text;
          duplex = true;
          break;
        }
      }
      if (!duplex) {
        dst.options[dst.length++] = new Option(option.text, option.value);
        ret_ary[ret_ary.length] = option.value;
      }
      src.options[i] = null;
      i--;
    }
  }
  src.selectedIndex = -1;
  return ret_ary;
}

function moveListWidhSuffix(src, dst, valSuffix, textSuffix)
{
  var ret_ary = new Array();
  for (var i=0; i<src.length; i++) {
    var option=src.options[i];
    if (option.selected == true) {
      var duplex = false;
      for (k=0; k<dst.length; k++) {
        if (dst.options[k].value == option.value+valSuffix) {
          dst.options[k].text = option.text+textSuffix;
          duplex = true;
          break;
        }
      }
      if (!duplex) {
        dst.options[dst.length++] = new Option(option.text+textSuffix, option.value+valSuffix);
        ret_ary[ret_ary.length] = option.value+valSuffix;
      }
      src.options[i]=null;
      i--;
    }
  }
  src.selectedIndex=-1;
  return ret_ary;
}

function moveListTrimSuffix(src, dst, valSeparator, textSeparator)
{
  var ret_ary = new Array();
  for (var i=0; i<src.length; i++) {
    var option=src.options[i];
    if (option.selected == true) {
      var duplex = false;
      for (k=0; k<dst.length; k++) {
        if (dst.options[k].value == option.value.split(valSeparator)[0]) {
          dst.options[k].text = option.text.split(textSeparator)[0];
          duplex = true;
          break;
        }
      }
      if (!duplex) {
        dst.options[dst.length++] = new Option(
                          option.text.split(textSeparator)[0],
                          option.value.split(valSeparator)[0]
                        );
        ret_ary[ret_ary.length] = option.value.split(valSeparator)[0];
      }
      src.options[i]=null;
      i--;
    }
  }
  src.selectedIndex=-1;
  return ret_ary;
}

function selectListAll(list)
{
  for (var i=0; i < list.length; i++) {
    list.options[i].selected = true;
  }
}

function getClientRegion()
{
  var obj = new Object();
  obj.width = window.innerWidth;
  obj.height = window.innerHeight;

  if (isNaN(obj.width))  {
    if (is_MS) {
      obj.width = document.documentElement.offsetWidth;
    } else {
      obj.width = document.documentElement.clientWidth;
    }
    if ((isNaN(obj.width) || obj.width == 0) && document.body != null)  {
      obj.width = document.body.clientWidth;
    }
  }
  if (isNaN(obj.height))  {
    if (is_MS) {
      obj.height = document.documentElement.offsetHeight;
    } else {
      obj.height = document.documentElement.clientHeight;
    }
    if ((isNaN(obj.height) || obj.height == 0) && document.body != null)  {
      obj.height = document.body.clientHeight;
    }
  }
  return obj;
}

function getDateString()
{
  var date = new Date();
  var ret = "";
  ret += date.getFullYear();
  var month = String(date.getMonth()+1);
  if (month.length <= 1) {
    month = "0" + month;
  }
  ret += "-"+month;
  var day = String(date.getDate());
  if (day.length <= 1) {
    day = "0" + day;
  }
  ret += "-"+day;

  return ret;
}

function getByteSize(str)
{
  var cnt = 0;
  for (var i=0; i<str.length; i++) {
    if (escape(str.charAt(i)).length < 4) {
      cnt++;
    } else {
      cnt += 2;
    }
  }
  return cnt;
}

function truncate(str, len)
{
  var cnt = 0;
  for (var i=0; i<str.length; i++) {
    if (escape(str.charAt(i)).length < 4) {
      cnt++;
    } else {
      cnt += 2;
    }
    if (cnt > len) {
      return str.substr(0, i)+"...";
    }
  }
  return str;
}

function trim(str)
{
  if (str == null) {
    return str;
  }

  var start = -1;
  var end = -1;
  for (var i=0; i < str.length; i++){
    if (str.charAt(i) != ' ' && str.charAt(i) != '\u3000') {
      start = i;
      break;
    }
  }
  for (var i=str.length -1; i >= 0; i--) {
    if (str.charAt(i) != ' ' && str.charAt(i) != '\u3000') {
      end = i + 1;
      break;
    }
  }
  if (start == -1){
    return '';
  }
  return str.substring(start, end);
}

function removeCtrlChar(str)
{
  if (str == null) {
    return(str);
  }

  for (var i=0; i < str.length; i++) {
    var ch = str.charAt(i);
    if (ch <= '\u001F' || ch == '\u007F') {
      str = str.replace(ch, '');
      i--;
    }
  }
  return str;
}

function within(elem, x, y)
{
  var elemPos = getElemPos(elem);
  var eX = elemPos.x;
  var eY = elemPos.y;
  var eWidth = elem.offsetWidth;
  var eHeight = elem.offsetHeight;

  return(x >= eX && x <= eX + eWidth && y >= eY && y <= eY + eHeight);
}

function getPos(elem)
{
  var obj = new Object();

  obj.x = elem.offsetLeft;
  obj.y = elem.offsetTop;

  while (elem.offsetParent) {
    elem = elem.offsetParent;
    obj.x += elem.offsetLeft;
    obj.y += elem.offsetTop;
  }
  return obj;
}

function getScroll(elem)
{
  var obj = new Object();
  obj.left = 0;
  obj.top = 0;

  while (elem.parentNode.tagName.toLowerCase() != "html") {
    elem = elem.parentNode;
    if (elem.tagName.toLowerCase() == "body"
        || (elem.style != null && 
            (elem.style.overflow=="scroll") || (elem.style.overflow=="auto"))) {
      obj.left += elem.scrollLeft;
      obj.top += elem.scrollTop;
    }
  }
  return obj;
}

function getBodyScroll()
{
  var obj = new Object();
  obj.left = 0;
  obj.top = 0;

  if (document.documentElement != null) {
     obj.left = document.documentElement.scrollLeft;
     obj.top = document.documentElement.scrollTop;
  }
  if (document.body != null) {
    if (isNaN(obj.left) || obj.left == 0) {
      obj.left = document.body.scrollLeft;
    }
    if (isNaN(obj.top) || obj.top == 0) {
      obj.top = document.body.scrollTop;
    }
  }
  return obj;
}

function isArray(x) { 
  return ((typeof x == "object") && (x.constructor == Array));
}

function restoreHTML(html) { 

  if (html == null || html.length <= 0) {
    return html;
  }
  return html.gsub('&lt;', '<').gsub('&gt;', '>').gsub('&amp;', '&');
}
