// opens new window
function openInNewWindow(href, width, height, extpar, name)
{
  var par = (extpar &&
      extpar.toString().length) ? ',' + extpar : '';
  var hl;
  if (width)
      par += ',width=' + width;
  if (height)
      par += ',height='  + height;
  name = !name ? '' : name.toString();
  hl = window.open(href, name, 'status=yes' + par);
  if (!hl)
      alert('Please, enable POP-UPs');
  return hl;
}

// opens new window with scrollbars
function openInNewWindowScrollbars(href, width, height, name)
{
  return openInNewWindow(href, width, height, 'scrollbars=yes');
}

function openInNewWindowCentered(href, width, height, extpar, name)
{
  if (!extpar)
      extpar = 'scrollbars=yes';
  var w = (width &&
      (screen.availWidth - 50) > width) ? width : screen.availWidth - 50;
  var h = (height &&
      (screen.availHeight - 50) > height) ? height : screen.availHeight - 100;
  var x = (screen.availWidth) ? parseInt((screen.availWidth - w) / 2) : 100;
  var y = (screen.availHeight) ? parseInt((screen.availHeight - h) / 2) - 10 : 100;
  if (extpar &&
      extpar.length)
      extpar += ',';
  extpar += 'left=' + x + ',top=' + y;
  var hl = openInNewWindow(href, w, h, extpar, name);
  return hl ? hl : false;
}

// checks if checkboxes are selected
function isCheckboxesSelected(prefix, cnt)
{
  var i = 0;
  var el;
  for (i = 0; i < cnt; i ++)
    if ((el = document.getElementById(prefix + i)) &&
        el.checked)
        break;
  return (i == cnt) ? false : true;
}

function selectAllCboxes(prefix, f_state)
{
    var i = 0;
    var el;
    while (el = document.getElementById(prefix + i++))
        el.checked = f_state ? true : false;
}

// function to handle 'select all checkboxes'
function onSelectAllCbClick(prefix)
{
  var i = 0;
  var el;
  while (el = document.getElementById(prefix + i++))
      el.checked = true;
  return false;
}

// function to handle 'clear all checkboxes'
function onClearAllCbClick(prefix)
{
  var i = 0;
  var el;
  while (el = document.getElementById(prefix + i++))
      el.checked = false;
  return false;
}

// function to handle 'invert all checkboxes'
function onInvertAllCbClick(prefix)
{
  var i = 0;
  var el;
  while (el = document.getElementById(prefix + i++))
      el.checked = el.checked ? false : true;
  return false;
}

// function to handle help button pressing
function onHelpButtonClick(id, closeId)
{
  var par;
  var newState = true;
  if (par = document.getElementById('helpArea_'  + id))
  {
      newState = (!par.style.display ||
          'none' == par.style.display) ? 'block' : 'none';
      par.style.display = newState;
  }
  if (par = document.getElementById('helpAreaParent_'  + id))
  {
      par.style.display = newState;
  }
  if (closeId &&
      (par = document.getElementById('helpArea_' + closeId)))
  {
      if ('none' != par.style.display)
          par.style.display = 'none';
      if (par = document.getElementById('helpAreaParent_' + closeId) &&
          'none' != par.style.display)
          par.style.display = 'none';
  }
  return false;
}

// inArray :)
function inArray(arr, val)
{
  for (var i = 0; i < arr.length; i ++)
      if (arr[i] == val)
          return i;
  return -1;
}

function random_word(lnum)
{
  var randomString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  var maxpos = randomString.length - 1;
  if (!lnum)
      lnum = 10;
  var res = '';
  for (var i = 0; i < lnum; i ++)
  {
      while ((cpos = Math.round(Math.random() * 100) - 1) > maxpos);
      res += randomString.charAt(cpos);
  }
  return res;
}

// errors handling
function handleErrors(allErrors, errors)
{
  var el, f_found = false;
  for (var i = 0; i < allErrors.length; i ++)
      if (el = document.getElementById('ea_' + allErrors[i]))
      {
          if (inArray(errors, allErrors[i]) >= 0)
          {
              el.style.display = 'block';
              f_found = true;
          }
          else
              el.style.display = 'none';
      }
  if (f_found)
      alert(errorsMessage());
}

function str2float(str)
{
  if (!str)
      return 0;
  var res = '';
  var mult = 0;
  str = str.toString();
  for (var i = 0; i < str.length; i ++)
  {
      if (str.charAt(i).match(/[0-9]/))
          res += str.charAt(i);
      if (!mult &&
          str.charAt(i) == '-')
          mult = -1;
  }
  res = res.length ? parseInt(res) : false;
  return (!mult) ? res : mult * res;
}

function str2int(str)
{
  if (!str)
      return 0;
  var res = '';
  var mult = 0;
  str = str.toString();
  for (var i = 0; i < str.length; i ++)
  {
      if (str.charAt(i).match(/[0-9]/))
          res += str.charAt(i);
      if (!mult &&
          str.charAt(i) == '-')
          mult = -1;
  }
  res = res.length ? parseInt(res) : false;
  return (!mult) ? res : mult * res;
}

function addcslashes(str, ch)
{
  var s;
  if (ch == '.')
      ch = '\\' + ch;
  eval('s = str.toString().replace(/' + ch + '/g, \'\\\\' + ch + '\')');
  return s;
}

function js_escape(str)
{
  return str.replace(/'/g, "\\'").replace(/script>/g, "script'+'>").replace(/\r\n|\n/g, "\\\n");
}

function js_escapedq(str)
{
  if (!str)
      return '';
  return str.replace(/"/g, '\\"').replace(/script>/g, 'script"+">').replace(/\r\n|\n/g, "\\\n");
}

// adds htmlspecialchars
function htmlchars(str)
{
  if (!str)
      return '';
  return str.replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

function strescape(str, ch)
{
  if (!str)
      return '';
  return str.toString().replace(ch, '\\' + ch);
}

function htmlquotes(str)
{
  if (!str.toString().length)
      return '';
  return str.toString().replace(/"/g, '&quot;');
}

// clones everything :)
function clone_array(arr)
{
  var res = new Array();
  for (i in arr)
    if (typeof arr[i] == 'object')
        res[i] = clone_array(arr[i]);
    else
        res[i] = arr[i];
    return res;
}

// swap indexes
function array_swap(arr, id1, id2)
{
  var tmp = arr[id1];
  arr[id1] = arr[id2];
  arr[id2] = tmp;
  return arr;
}

function array_implode(ch, arr)
{
  var str = '';
  for (var i = 0; i < arr.length; i ++)
  {
      if (i > 0)
          str += ch;
      str += arr[i];
  }
  return str;
}

// inserts array element
function array_insert(arr, el, index)
{
  var tmp = new Array();
  var j = 0;
  var f_set = false;
  for (var i = 0; i < arr.length; i ++)
  {
      if (i == index)
      {
          tmp[j ++] = el;
          f_set = true;
      }
      tmp[j ++] = arr[i];
  }
  if (!f_set)
      tmp[j ++] = el;
  return tmp;
}

// deletes array element
function array_delete(arr, index)
{
  var tmp = new Array();
  var j = 0;
  for (var i = 0; i < arr.length; i ++)
      if (i != index)
          tmp[j ++] = arr[i];
  return tmp;
}

// in_array :)
function in_array(arr, val)
{
  for (var i = 0; i < arr.length; i ++)
      if (arr[i] == val)
          return i;
  return -1;
}

function in_subarray(arr, sub, val)
{
  for (var i = 0; i < arr.length; i ++)
      if (arr[i][sub] == val)
          return i;
  return -1;
}

function std_onButtonBackClick(url)
{
  window.location.href = url;
  return false;
}

// named arrays class
function CNamedArray()
{
  this.arr = new Array();
  this.init = CNamedArray_init;
  this.set = CNamedArray_set;
  this.setr = CNamedArray_setr;
  this.get = CNamedArray_get;
  this.getr = CNamedArray_getr;
  this.unset = CNamedArray_unset;
  this.unsetr = CNamedArray_unsetr;
  this.isset = CNamedArray_isset;
  this.issetr = CNamedArray_issetr;
  this.keys = CNamedArray_keys;
  this.keysr = CNamedArray_keysr;
  this.print = CNamedArray_print;
  this.str = CNamedArray_str;
  this.create = CNamedArray_create;
  this.clone = CNamedArray_clone;
  this.tostring = CNamedArray_tostring;
  this.length = 0;
}

function CNamedArray_init(values)
{
  this.arr = new Array();
  if (values)
      for (var i = 0; i < values.length; i ++)
          this.arr[this.arr.length] = new Array(values[i][0], values[i][1]);
  return this;
}

function CNamedArray_set(key, val)
{
  var i;
  for (i = 0; i < this.arr.length; i ++)
      if (this.arr[i][0] == key)
           break;
  if (i == this.arr.length)
  {
      this.arr[i] = new Array();
      this.length ++;
  }
  this.arr[i][0] = key;
  this.arr[i][1] = val;
}

function CNamedArray_setr(key, key1, val)
{
  var p;
  if (!this.isset(key))
      this.set(key, p = new CNamedArray());
  else
      p = this.get(key);
  p.set(key1, val);
}

function CNamedArray_get(key)
{
  var i;
  for (i = 0; i < this.arr.length; i ++)
      if (this.arr[i][0] == key)
          return this.arr[i][1];
  return false;
}

function CNamedArray_getr(key, key1)
{
    var p = this.get(key);
    if (!p ||
        !p.isset(key1))
        return false;
    return p.get(key1);
}

function CNamedArray_unset(key)
{
  var i, newArr = new Array(), j = 0;
  for (i = 0; i < this.arr.length; i ++)
      if (this.arr[i][0] != key)
          newArr[j ++] = this.arr[i];
  if (newArr.length != this.arr.length)
  {
      this.length --;
      this.arr = newArr;
      return true;
  }
  return false;
}

function CNamedArray_unsetr(key, key1)
{
  var p = this.get(key);
  if (p)
      p.unset(key1);
}

function CNamedArray_isset(key)
{
  var i;
  for (i = 0; i < this.arr.length; i ++)
      if (this.arr[i][0] == key)
           return true;
  return false;
}

function CNamedArray_issetr(key, key1)
{
  var p = this.get(key);
  return (!p ||
      !p.isset(key1)) ? false : true;
}
                    
function CNamedArray_keys()
{
  var arr = new Array();
  for (var i = 0; i < this.arr.length; i ++)
      arr[i] = this.arr[i][0];
  return arr;
}

function CNamedArray_keysr(key)
{
  return this.isset(key) ? this.get(key).keys() : false;
}

function CNamedArray_print()
{
  alert(this.str(this.arr));
}

function CNamedArray_str(arr, level)
{
  var i, j, str = '';
  for (i = 0; i < arr.length; i ++)
  {
      if (i > 0)
          str += "\n";
      for (j = 0; j < level * 2; j ++)
          str += ' ';
      str += arr[i][0] + ' => ' + arr[i][1];
  }
  return str;
}

function CNamedArray_create(values)
{
  res = new CNamedArray();
  return res.init(values);
}

function CNamedArray_clone()
{
  res = new CNamedArray();
  for (i = 0; i < this.arr.length; i ++)
      res.set(this.arr[i][0], this.arr[i][1]);
  return res;
}

function CNamedArray_tostring()
{
  var res = '';
  if (this.arr.length)
      for (var i = 0; i < this.arr.length; i ++)
      {
          if (res.length)
              res += ',';
          res += this.arr[i][0] + '=>\'' + this.arr[i][1] + '\'';
      }
  return '(' + res + ')';
}

messages = new CNamedArray();



// LISTBOXES FUNCTIONS
// сдвигает листбокс вниз на 1 позицию
function shiftListDown(lst, pos)
{
  pos = (pos <= 0) ? 0 : parseInt(pos);
  for (var i = lst.length - 1; i > pos ; i --)
      if (lst[i - 1].value >= 0)
      {
          lst[i].value = lst[i - 1].value;
          lst[i].text = lst[i - 1].text;
          lst[i].selected = (lst[i - 1].selected) ? true : false;
          lst[i - 1].selected = false;
      }
}

// удаляет заданный элемент листбокса
function deleteListEl(lst, pos)
{
  pos = (pos <= 0) ? 0 : parseInt(pos);
  for (var i = pos; i < lst.length - 1; i ++)
  {
      lst[i].value = lst[i + 1].value;
      lst[i].text = lst[i + 1].text;
      lst[i].selected = (lst[i + 1].selected) ? true : false;
  }
}

var onTitledListClick_state;
function onTitledListClick(l, val)
{
    if (!onTitledListClick_state)
        onTitledListClick_state = new CNamedArray();
    var prev = -1;
    var lid = l.name ? l.name : l.id;
    for (var i = 0; i < l.length; i ++)
        if (l[i].value == val)
        {
            if (l[i].selected)
            {
                l[i].selected = false;
                var j;
                for (j = i + 1; j < l.length; j ++)
                    if (l[j].value != val)
                        break;
                if (j < l.length)
                    l[j].selected = true;
                else if (prev >= 0)
                    l[prev].selected = true;
                break;
            }
            else
            {
                if (l[i + 1] &&
                    l[i + 1].value != val)
                    prev = i + 1;
            }
        }
}

function trim(str)
{
    return str.replace(/^[ ]+/, '').replace(/[ ]+$/, '');
}

function rtrim(str)
{
    return str.replace(/[ ]+$/, '');
}

function validate_email(email)
{
    return email.toString().match(/^[-_A-Za-z0-9][A-Za-z0-9\._-]*[A-Za-z0-9_]*@([A-Za-z0-9]+([A-Za-z0-9-]*[A-Za-z0-9]+)*\.)+[A-Za-z]+$/) ? true : false;
}

function validate_login(login)
{
  return login.toString().match(/^[A-Za-z][A-Za-z0-9_]{2,15}$/i) ? true : false;
}

function validate_code(code)
{
    return code.toString().match(/^[A-Za-z0-9]{1,16}$/i) ? true : false;
}

function validate_url(url, noproto)
{
    if (url.toString().match(/^(http|https|ftp):\/\/[-\.A-Za-z0-9]+\.[A-Za-z]+/) ||
        noproto &&
        url.toString().match(/^[-\.A-Za-z0-9]+\.[A-Za-z]+/))
        return true;
    return false;
}

function radioListSelectedIndex(lst)
{
  if (!lst ||
      !lst.length)
      return -1;
  for (var i = 0; i < lst.length; i ++)
      if (lst[i].checked)
           return i;
  return -1;
          
}

function radioListSelectedValue(lst)
{
  var i = radioListSelectedIndex(lst);
  return (i < 0) ? i : lst[i].value;
}

function ListSelectedIndex(lst)
{
  if (!lst ||
      !lst.length)
      return -1;
  for (var i = 0; i < lst.length; i ++)
      if (lst[i].selected)
          return i;
  return -1;
}

function ListSelectedValue(lst)
{
  var i = ListSelectedIndex(lst);
  return (i < 0) ? i : lst[i].value;
}

function SetListboxOption(lst, val)
{
  for (var i = 0; i < lst.length; i ++)
  {
      if (lst[i].value.toString() == val.toString())
      {
          lst[i].selected = true;
          lst.value = val;
      }
      else
          lst[i].selected = false;
  }
}

function GetListboxSelText(lst)
{
  for (var i = 0; i < lst.length; i ++)
      if (lst[i].selected)
          return lst[i].text;
  return lst[0].text;
}

function ListBoxToText(lst)
{
  var max = 0, txt = '';
  for (var i = 0; i < lst.length; i ++)
  {
      if (lst[i].selected)
          txt = lst[i].text;
      if (lst[i].text.length > max)
          max = lst[i].text.length;
  }
  if (max > txt.length)
      for (var i = max - txt.length; i > 0; i --)
          txt += '&nbsp;&nbsp;';
  return txt + '&nbsp;&nbsp;&nbsp;&nbsp;';
}

function GetOffsetTop(el)
{
  var val = 0;
  while ('BODY' != el.tagName &&
      el)
  {
      val += el.offsetTop;
      el = el.offsetParent;
  }
  return val;
}

function GetOffsetLeft(el)
{
  var val = 0;
  while ('BODY' != el.tagName &&
      el)
  {
      val += el.offsetLeft;
      el = el.offsetParent;
  }
  return val;
}

function str2color(str)
{
  if (!str.match(/^rgb\([0-9]{1,3},[ ]*[0-9]{1,3},[ ]*[0-9]{1,3}\)$/))
      return str;
  var res = '#';
  var arr = str.match(/\(([0-9]{1,3})/);
  if (parseInt(arr[1]) < 16)
      res += '0';
  res += parseInt(arr[1]).toString(16);
  arr = str.match(/,[ ]*([0-9]{1,3}),/);
  if (parseInt(arr[1]) < 16)
      res += '0';
  res += parseInt(arr[1]).toString(16);
  arr = str.match(/([0-9]{1,3})\)/);
  if (parseInt(arr[1]) < 16)
      res += '0';
  res += parseInt(arr[1]).toString(16);
  return res;
}

function GetKeyCode(event)
{
  return (event &&
      event.keyCode) ? event.keyCode : false;
}

AV_COLORS = Array(Array('aliceblue', 'f0f8ff'), Array('antiquewhite', 'faebd7'),
  Array('aqua', '00ffff'), Array('aquamarine', '7fffd4'),
  Array('azure', 'f0ffff'), Array('beige', 'f5f5dc'), Array('bisque', 'ffe4c4'),
  Array('black', '000000'), Array('blanchedalmond', 'ffebcd'),
  Array('blue', '0000ff'), Array('blueviolet', '8a2be2'), Array('brown', 'a52a2a'),
  Array('burlywood', 'd9b887'), Array('cadetblue', '5f9ea0'),
  Array('chartreuse', '7fff00'), Array('chocolate', 'd2691e'),
  Array('coral', 'ff7f50'), Array('cornflowerblue', '6495ed'),
  Array('cornsilk', 'fff8dc'), Array('crimson', 'dc143c'), Array('cyan', '00ffff'),
  Array('darkblue', '00008b'), Array('darkcyan', '008b8b'),
  Array('darkgoldenrod', 'b8860b'), Array('darkgray', 'a9a9a9'),
  Array('darkgreen', '006400'), Array('darkkhaki', 'bdb76b'),
  Array('darkmagenta', '8b008b'), Array('darkolivegreen', '556b2f'),
  Array('darkorange', 'ff8c00'), Array('darkorchid', '9932cc'),
  Array('darkred', '8b0000'), Array('darksalmon', 'e9967a'),
  Array('darkseagreen', '8fbc8f'), Array('darkslateblue', '483d8b'),
  Array('darkslategray', '2f4f4f'), Array('darkturquoise', '00c9d1'),
  Array('darkviolet', '9400d3'), Array('deeppink', 'ff1493'),
  Array('deepskyblue', '00bfff'), Array('dimgray', '696969'),
  Array('dodgerblue', '1e90ff'), Array('firebrick', 'b22222'),
  Array('floralwhite', 'fffaf0'), Array('forestgreen', '228b22'),
  Array('fuchsia', 'ff00ff'), Array('gainsboro', 'dcdcdc'),
  Array('ghostwhite', 'f8f8ff'), Array('gold', 'ffd700'),
  Array('goldenrod', 'daa520'), Array('gray', '808080'), Array('green', '0080ff'),
  Array('greenyellow', 'adff2f'), Array('honeydew', 'f0fff0'),
  Array('hotpink', 'ff69b4'), Array('indianred', 'cd5c5c'),
  Array('indigo', '4b0082'), Array('ivory', 'fffff0'),
  Array('khaki', 'f0e6fc'), Array('lavender', 'e6e6fa'),
  Array('lavenderblush', 'fff0f5'), Array('lawngreen', '7cfc00'),
  Array('lemonchiffon', 'fffacd'), Array('lightblue', 'add8e6'),
  Array('lightcoral', 'f08080'), Array('lightcyan', 'e0ffff'),
  Array('lightgoldenrodyellow', 'fafad2'), Array('lightgreen', '90ee90'),
  Array('lightgrey', 'd3d3d3'), Array('lightpink', 'ffb6c1'),
  Array('lightsalmon', 'ffa07a'), Array('lightseagreen', '20b2aa'),
  Array('lightskyblue', '87cefa'), Array('lightslategray', '778899'),
  Array('lightsteelblue', 'b0c4de'), Array('lightyellow', 'fffe0'),
  Array('lime', '00ff00'), Array('limegreen', '32cd32'), Array('linen', 'faf0e6'),
  Array('magenta', 'ff00ff'), Array('maroon', '800000'),
  Array('mediumaquamarine', '66cdaa'), Array('mediumblue', '0000cd'),
  Array('mediumorchid', 'ba55d3'), Array('mediumpurple', '9370db'),
  Array('mediumseagreen', '3cb371'), Array('mediumslateblue', '7b68ee'),
  Array('mediumspringgreen', '00fa9a'), Array('mediumturquoise', '48d1cc'),
  Array('mediumvioletred', 'c71585'), Array('midnightblue', '191970'),
  Array('mintcream', 'f5fffa'), Array('mistyrose', 'ffe4e1'),
  Array('moccasin', 'ffe4b5'), Array('navajowhite', 'ffdead'),
  Array('navy', '000080'), Array('oldlace', 'fdf5e6'), Array('olive', '808000'),
  Array('olivedrab', '6b8e23'), Array('orange', 'ffa500'),
  Array('orangered', 'ff4500'), Array('orchid', 'da70d6'),
  Array('palegoldenrod', 'eee8aa'), Array('palegreen', '98fb98'),
  Array('paleturquoise', 'afeeee'), Array('palevioletred', 'db7093'),
  Array('papayawhip', 'ffefd5'), Array('peachpuff', 'ffdab9'),
  Array('peru', 'cd853f'), Array('pink', 'ffc0cb'), Array('plum', 'dda0dd'),
  Array('powderblue', 'b0e0e6'), Array('purple', '800080'),
  Array('red', 'ff0000'), Array('rosybrown', 'bc8f8f'),
  Array('royalblue', '4169e1'), Array('saddlebrown', '8b4513'),
  Array('salmon', 'fa8072'), Array('sandybrown', 'f4a460'),
  Array('seagreen', '2e8b57'), Array('seashell', 'fff5ee'),
  Array('sienna', 'a0522d'), Array('silver', 'c0c0c0'),
  Array('skyblue', '87ceeb'), Array('slateblue', '6a5acd'),
  Array('slategray', '708090'), Array('snow', 'fffafa'),
  Array('springgreen', '00ff7f'), Array('steelblue', '4682b4'),
  Array('tan', 'd2b48c'), Array('teal', '008080'),
  Array('thistle', 'd8b8d8'), Array('tomato', 'ff6347'),
  Array('turquoise', '40e0d0'), Array('violet', 'ee82ee'),
  Array('wheat', 'f5deb3'), Array('white', 'ffffff'),
  Array('whitesmoke', 'f5f5f5'), Array('yellow', 'ffff00'),
  Array('yellowgreen', '9acd32'));

function IsColor(col)
{
  return (col.match(/^rgb\([ ]*[0-9]{1,3}[ ]*,[ ]*[0-9]{1,3}[ ]*,[ ]*[0-9]{1,3}[ ]*\)$/) ||
      col.match(/^#[0-9a-f]{3}$/) ||
      col.match(/^#[0-9a-f]{6}$/) ||
      in_subarray(AV_COLORS, 0, col) >= 0) ? true : false;
}

function ColorColors(col)
{
    var tmp, res = new Array();
    if (col.match(/^rgb\([ ]*[0-9]{1,3},[ ]*[0-9]{1,3}[ ]*,[ ]*[0-9]{1,3}[ ]*\)$/))
    {
        tmp = col.match(/\([ ]*[0-9]{1,3}[ ]*,/);
        tmp = trim(tmp[0].substr(1, tmp[0].length - 2));
        res[0] = parseInt(tmp);
        tmp = col.match(/,[ ]*[0-9]{1,3}[ ]*,/);
        tmp = trim(tmp[0].substr(1, tmp[0].length - 2));
        res[1] = parseInt(tmp);
        tmp = col.match(/,[ ]*[0-9]{1,3}[ ]*\)/);
        tmp = trim(tmp[0].substr(1, tmp[0].length - 2));
        res[2] = parseInt(tmp);
    }
    else if (col.match(/^#[0-9a-f]{3}$/))
    {
        res[0] = parseInt('0x' + (tmp = col.substr(1, 1)) + (tmp.length == 1 ? tmp : ''));
        res[1] = parseInt('0x' + (tmp = col.substr(2, 1)) + (tmp.length == 1 ? tmp : ''));
        res[2] = parseInt('0x' + (tmp = col.substr(3, 1)) + (tmp.length == 1 ? tmp : ''));
    }
    else if (col.match(/^#[0-9a-f]{6}$/))
    {
        res[0] = parseInt('0x' + col.substr(1, 2));
        res[1] = parseInt('0x' + col.substr(3, 2));
        res[2] = parseInt('0x' + col.substr(5, 2));
    }
    else if ((tmp = in_subarray(AV_COLORS, 0, col)) >= 0)
    {
        return ColorColors('#' + AV_COLORS[tmp][1]);
    }
    else
        res = false;
    return res;
}

function ColorHex(col)
{
    var t = ColorColors(col);
    if (!t)
        return false;
    var c;
    return '#' + (c = t[0].toString(16)) + (c.length == 1 ? c : '') +
        (c = t[1].toString(16)) + (c.length == 1 ? c : '') +
        (c = t[2].toString(16)) + (c.length == 1 ? c : '');
}

function PureStrLen(str)
{
  return str.replace(/\r\n|\n/, '').length;
}

function print_obj(obj, f_str)
{
    var str = '';
    var j = 0;
    for (var i in obj)
    {
        str += i + ' => ';
        eval ('str += obj.' + i);
        str += "\n";
        if (j++ > 30)
        {
            alert(str);
            j = 0;
            str = '';
        }
    }
    if (f_str)
        return str;
    if (str.length)
        alert(str);
}

function substr_count(str, sstr)
{
    var cnt = 0;
    for (var i = 0; i < str.length; i ++)
        if (str.charAt(i) == sstr)
            cnt ++;
    return cnt;
}

function mfn_strlen_rel(str)
{
  return str.length + parseInt(substr_count(str, 'W') * 0.65);
}

function mfn_iftoolong(str, maxlen, postfix)
{
  if (!postfix)
      postfix = '...';
  if (mfn_strlen_rel(str) <= maxlen)
      return str;
  var tmp = '';
  var i = 0;
  var len = str.length;
  while (mfn_strlen_rel(tmp) < maxlen &&
      i < len)
      tmp += str.substr(i++, 1);
  postfix.replace(/%l/g, str.length - tmp.length);
  return tmp + postfix;
}

var h_onBodyKeyDown;
function def_onBodyKeyDown(event)
{
  if (h_onBodyKeyDown)
      return h_onBodyKeyDown(event);
}

function onMultiListChange(lst, title)
{
    var f_add = false;
    var i;
    for (i = 0; i < lst.length; i ++)
        if (lst[i].value.length &&
            lst[i].selected)
        {
            f_add = true;
            break;
        }
    var str = lst.outerHTML;
    var str1 = str.match(/<select[^>]*>/i);
    str1 = str1[0];
    if (f_add)
    {
        if (!lst[0].value.length ||
            !lst[0].value)
            return;
        str =  str1 + '<option>' + title + '</option>' +
            str.substr(str1.length, str.length - str1.length);
        lst.outerHTML = str;
        return;
    }
    if (lst[0].value.length ||
        lst[0].value)
        return;
    for (i = 1; i < lst.length; i ++)
        lst[i].selected = false;
    var str2 = trim(str.substr(str1.length)).match(/^<option[^>]*>[^<]*/i);
    if (!str2)
        return;
    str2 = str.substr(str1.length + str2[0].length);
    var cmp = '</option>';
    if (str2.substr(0, cmp.length).toLowerCase() == cmp)
        str2 = str2.substr(cmp.length);
    str = trim(str1 + str2);
    lst.outerHTML = str;
}

function window_frame(frameName, wobj)
{
    var w = !wobj ? window : wobj;
    if (!w.frames.length)
        return false;
    for (var i = 0; i < w.frames.length; i ++)
    {
        if (w.frames[i].name != frameName)
            continue;
        return w.frames[i];
    }
    return false;
}

function client_window_width()
{
    return window.innerWidth ? window.innerWidth : document.body.offsetWidth;
}

function client_window_height()
{
    return window.innerHeight ? window.innerHeight : document.body.offsetHeight;
}

function getEl(id)
{
    return document.getElementById(id);
}

function strlength(s)
{
    var l;
    return s.length - ((l = s.split("\r\n").length) > 1 ? l - 1 : 0); 
}

function procPrintClick(areaId)
{
    var el;
    if (!(el = getEl(areaId)))
        return false;
    el.style.display = 'none';
    window.print();
    el.style.display = 'block';
    return true;
}

function is_float(v, dcnt)
{
    var r;
    eval('r = v.toString().match(/^[-+]{0,1}[0-9]+$/) ||\
        v.toString().match(/^[-+]{0,1}[0-9]+[\.,][0-9]{1,' + (dcnt ? dcnt : 10) + '}$/) ? true : false');
    return r;
}

var bgColorOver = '#ffffaa';
var bgColorOut = '';
var bgColorSelected = '#ffff99';
var bgColorSelectedOver = '#ffff77';
INIT_STD_LOADED = 1;
