
//+============================================+
//|             Script: JavaScript             |
//|   БИБЛИОТЕКА ПРОЦЕДУР ОБЩЕГО НАЗНАЧЕНИЯ    |
//+--------------------------------------------+
//|     Copyright© NickStorm Software 2010     |
//|        Author: Strakhov Nickolai N.        |
//|          First Editing 02-12-2006          |
//|          Last  Editing 05-03-2010          |
//+============================================+
var javatrace_text=0;
var javatrace_tag=0;
var API_RunServerName='';

//+=====================================================+
//|     ASCII - АРИФМЕТИКА                              |
//+=====================================================+
var HEX_Symbols=new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');

// Перевод кода тетрады (0...15) в его ASCII ('0'...'F')
function TETR_2_STR(Data) {return HEX_Symbols[Data & 0x0F];}

// ASCII-кодирование одиночного байта
function JS_HexByte(Data)
{
  if (Data < 0) Data = 0;
  else if (Data > 255) Data = 255;
  return by=HEX_Symbols[(Data >> 4)&0x0F] + HEX_Symbols[Data&0x0F];
//  return by=TETR_2_STR(Data >> 4) + TETR_2_STR(Data);
}

// Преобразование триады (R, G, B) в код HTML-цвета #RGB
function RGB_Color(R, G, B)
{
  return '#'+JS_HexByte(R)+JS_HexByte(G)+JS_HexByte(B);
}

// Преобразование LONG значения цвета в HTML #RRGGBB строку
function DEC_Color(Color)
{
  var cc = new Array();
  for(var i=0; i < 6; ++i)
  {
    cc[i]=Color & 0x0F;
    Color >>= 4;
  }
  clr='#';
  for(i=5; i >=0; --i) clr+=HEX_Symbols[cc[i]&0xF];
  return clr;
}

// Преобразование кода буквы в букву
function ASCII_2_CHAR(AsciiCode)
{
  return String.fromCharCode(AsciiCode);
}

//+=====================================================+
//|                                                     |
//+=====================================================+
//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function HT_PageStartup(ServerName)
{
  API_RunServerName=ServerName;
  window.ht_window_type='ht_window';
//  alert(ServerName);
}

function HT_PageCloser()
{
return;
  if (API_RunServerName=='') return;
//  alert('Closer='+API_RunServerName);
  url=API_RunServerName+"/infolane/index.php";
  cmd='act=ajaxexec&mode=onmainwndclose';
  GPS_AjaxRequest(url, cmd);
  for (var n=0; n < 10000; ++n) a=1;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function JavaTracer(Text)
{
  if (!javatrace_text) return;
  var i = javatrace_text.length;
  javatrace_text[i]=Text;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function JavaTracerShow()
{
  if (!javatrace_text) return;
  var tN = javatrace_text.length;
  t_dib = document.getElementById(javatrace_tag);
  s="";
  for(n=0; n < tN; ++n)
  {
    s+=javatrace_text[n]+"<br>";
  }
//  alert(javatrace_tag+tN);
  t_dib.innerHTML=s;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function JavaTracer_Open()
{
  javatrace_tag='_javatracer_';
  javatrace_text=new Array();
//  JavaTracer('OPPENED');
}

//+-----------------------------------------------------+
//|     Переход на заданный адрес                       |
//+-----------------------------------------------------+
function JumpToURL(URL)
{
  document.location.href=URL;
}

//+-----------------------------------------------------+
//|    Output Alert on the Screen                       |
//+-----------------------------------------------------+
function LIB_Alert($Text)
{
  alert($Text);
}

//+-----------------------------------------------------+
//|   Дополнить лидирующий ноль                         |
//+-----------------------------------------------------+
function _leadZero(v)
{
  if (v < 0) v = -v;
  var o = "";
  if (v < 10) o+="0";
  return o+v;
}

//+-----------------------------------------------------+
//|     Взять календарную дату в виде строки            |
//+-----------------------------------------------------+
function DateString(dlm)
{
  var d = new Date();
  var s="";
  s += _leadZero(d.getDate()) + dlm;
  s += _leadZero((d.getMonth()) + 1) + dlm;
  var y=d.getYear();
  if (y < 1000) y+= 1900;
  s += y;
  return s;
}

//+-----------------------------------------------------+
//|    Взять календарное время в виде строки            |
//+-----------------------------------------------------+
function TimeString(dlm)
{
  var d = new Date();
  var s="";
  s += _leadZero(d.getHours()) + dlm;
  s += _leadZero(d.getMinutes()) + dlm;
  s += _leadZero(d.getSeconds());
  return s;
}

//+-----------------------------------------------------+
//|    Взять Float-значение с Input-поля формы          |
//+-----------------------------------------------------+
function GetInputFloatFalue(Id,ToCorrect,MaxVal)
{
  var e = document.getElementById(Id);
  if(!e || typeof(e) != "object") return 0;
  var v = parseFloat(e.value);
  if (isNaN(v) || v < 0) 
  {
    v = 0;
  }
  if(typeof(MaxVal) != "undefined")
  {
    if (v > MaxVal) v = MaxVal;
  }
  if (ToCorrect) e.value=v;
  return v;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function LIB_setWaitCursor(isset)
{
  var cursor = isset? "wait":"default";
  document.body.style.cursor=cursor;
}

//+-----------------------------------------------------+
//|    Универсальный вопрошатель с исполнением акций    |
//+-----------------------------------------------------+
function LIB_Question(Quest, ActionYes, ActionNo)
{
 // alert(ActionYes);
  if (Quest.charAt(0)=='#')
  {
    switch(Quest)
    {
    case '#editmsg':
      Quest = "Вызвать редактор для данного сообщения?";
      break;
    case '#delmsg':
      Quest = "ВНИМАНИЕ! Вы вызываете опасную команду\nудаления сообщения.\n\nПожалуйста, подтвердите своё намерение.\n\n           Удалить данное сообщение?\n";
      break;
    default:
      return false;
    }
  }
  if (confirm(Quest))
  {
    if (typeof(ActionYes)!='undefined')
    {
      eval (ActionYes);
    }
    return true;
  }
  if (typeof(ActionNo)!='undefined')
  {
    eval (ActionNo);
  }
  return false;
}

//+-----------------------------------------------------+
//|    Переход на URL при пложительном ответе           |
//+-----------------------------------------------------+
function LIB_JumpOnYes(Quest, URL, OnNoAnswer)
{
  OnNO = 0;
  if (typeof(OnNoAnswer)!='undefined') OnNO = OnNoAnswer;
  if (OnNO)
  {
    if (confirm(Quest)) return;
  }
  else
  {
    if (!confirm(Quest)) return;
  }
  document.location.href=URL;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function LIB_AskAndJump(Quest, NewUrl)
{
  if (confirm(Quest))
  {
    if (typeof(NewUrl)!='undefined')
    {
      window.document.location.href=NewUrl;
    }
    return true;
  }
  return false;
}

//+-----------------------------------------------------+
//|  Изменение состояние видимости на противоположное   |
//+-----------------------------------------------------+
function JS_DivToggler(Id, CallBackFunction)
{
  var dv = document.getElementById(Id);
  if (!dv) return;
  var stt=dv.style.display;
//  alert(stt);
  if (stt=='none')
  {
    dv.style.display='block';
  }
  else
  {
    dv.style.display='none';
  }
  if (typeof(CallBackFunction)=='undefined') return;
}

//+-----------------------------------------------------+
//|     Исполнитель для HTS_DivCouple                   |
//+-----------------------------------------------------+
function JS_DivCoupleToggleVisibility(Name, Index)
{
  Index &= 1;
  var id = Name + Index;
  var dv = document.getElementById(id);
  if (dv)
  {
    dv.style.display="none";
  }
  Index = 1-Index;
  id = Name + Index;
  dv = document.getElementById(id);
  if (dv && typeof(dv) == 'object')
  { 
    dv.style.display="block";
  }
}

//+-----------------------------------------------------+
//|   Установить видимость одного блока из группы       |
//| IdentName должен иметь поствиксы -v или -i для      |
//| видимого и невидимого элемента каждого блока        |
//+-----------------------------------------------------+
function JS_DivRadioVisibility(IdentName,ActiveNumber,TotalNumber)
{
  var invert=false;
  if (ActiveNumber < 0)
  {
    ActiveNumber=-ActiveNumber;
    invert=true;
  }
  if (!TotalNumber)
  {
    var tag=IdentName+'_'+ActiveNumber;
    var idv=tag+'-v';
    var idi=tag+'-i';
    var dvv = document.getElementById(idv); // Visible tag
    var dvi = document.getElementById(idi); // Visible tag
    if (invert) 
    {
      dvv.style.display="block";
      dvi.style.display="none";
    }
    else 
    {
      dvv.style.display="none";
      dvi.style.display="block";
    }
    return;
  }
  for(var n=0; n < TotalNumber; ++n)
  {
    var i=n+1;
    var tag=IdentName+'_'+i;
    var id=tag+'-v';
    var dv = document.getElementById(id); // Visible tag
    if(dv && typeof(dv) == 'object')
    {
      dv.style.display=(i==ActiveNumber)? "none":"block";
    }
    id=tag+'-i';
    dv = document.getElementById(id); // Invisible tag
    if(dv && typeof(dv) == 'object')
    {
      dv.style.display=(i==ActiveNumber)? "block":"none";
    }
  }
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function JS_SetDivTab(Ident,Index,MaxI)
{
//  alert("Id:"+Ident+" I:"+Index+" Max:"+MaxI);
  for(var i=0; i < MaxI; ++i)
  {
    var id=Ident+i;
    dv = document.getElementById(id);
    if (!dv) 
    {
      continue;
    }
    if (i==Index)
      dv.style.display="block";
    else
      dv.style.display="none";
  }
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function stdlib_StrRectArea(Width)
{
  if (!Width)
  {
    return "</table></td></tr></table>";
  }
  var t;
  var tabsty="<table  style='color:#007090;background-color:#EDF1F5;font-family:Arial;font-size:12px;";
  t = tabsty+"border-color:#8899BB;border-style:solid;border-right-width:3px;' align=\'center\' width=\'" + Width;
  t += "\'><tr><td>"+tabsty+"' width='100%'>";
  return t;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function DrawBar(td_percents, color, value)
{
  document.write('<table width="100%" border="0" cellpadding="4" cellspacing="1" style="border: 1 solid #F0F0F0; margin-bottom:5px;">');
  document.write('<tr><td width="' + td_percents + '%" align="right" valign="middle" bgcolor="' + color + '" style="border: 1 solid #999999;">');
	if (value==1001) document.write('<img src="/design/1x1.gif" width="1" height="1" border="0"><br>');
	else document.write('<span class="Aux"><font color="white"><b><nobr>' + value + '</nobr></b></font><br></span>');
	document.write('</td><td width="' + (100 - td_percents) + '%" bgcolor="#F5F5F5"><img src="/design/1x1.gif" width="1" height="1" border="0"><br></td></tr></table>');
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function stdlib_StrDrawBar(td_percents, color, value)
{
  var bar = '<table width=\"100%\" border=\"0\" cellpadding=\"4\" cellspacing=\"1\" style=\"border: 1 solid #F0F0F0; margin-bottom:5px;\">';
  bar += '<tr><td width=\"' + td_percents + '%\" align=\"right\" valign=\"middle\" bgcolor=\"' + color + '\" style=\"border: 1 solid #999999;\">';
	if (value==1001) bar += '<img src=\"/design/1x1.gif\" width=\"1\" height=\"1\" border=\"0\"><br>';
	else bar += '<span class=\"Aux\"><font color=\"white\"><b><nobr>' + value + '</nobr></b></font><br></span>';
	bar += '</td><td width=\"' + (100 - td_percents) + '%\" bgcolor=\"#F5F5F5\"><img src=\"/design/1x1.gif\" width=\"1\" height=\"1\" border=\"0\"><br></td></tr></table>';
  return bar;
}

// 
function DrawDichoBar(value, Height)
{
  var color = (value >= 0)? '#FF8383' : '#8388FF';
  var c0 = "#EEEEEE";
  var hv=Math.round(Math.abs(value*100) / 2);
  if (value > 0)
  {
    var p1=50;
    var p2=hv;
    var p3=50-hv;
  }
  else
  {
    var p1=50-hv;
    var p2=hv;
    var p3=50;
  }
  value = Math.round(value * 100) / 100;
  var img="<img src='/design/1x1.gif' width='1' height='"+Height+"' border='0'>";
  var dval = "<span class=\"Aux\"><font color=\""+color+"\"><b>"+value+"</span></b>";
  document.write("<table width=\"100%\" border=\"0\" cellspacing=\"0\" ><tr><td>");
  document.write('<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border: 1 solid #C0C0C0; margin-bottom:0px;"><tr>');
  document.write("<td width='"+p1+"%' bgcolor='"+c0+"'>"+img+"</td>");
  document.write("<td width='"+p2+"%' bgcolor='"+color+"'>"+img+"</td>");
  document.write("<td width='"+p3+"%' bgcolor='"+c0+"'>"+img+"</td>");
  document.write("</tr></table></td><td width='49' style='vertical-align:top;'><nobr>"+dval+"</nobr></td></td></table>\n");
}

// Рисование универсального горизонтального бара
function DrawVersatileBar(Value, Minimum, Maximum, Dichotomic, Width, Height)
{
  var dv = Maximum - Minimum;
  if (dv==0) return;
  var v=0;
  var v1=0;
  if (dv < 0)
  {
    var v=Minimum; Minimum=Maximum; Maximum=v;
  }
  if (Value > Maximum) Value = Maximum;
  else if (Value < Minimum) Value = Minimum;
  v = Math.round((Value - Minimum) * Width / dv);
  v1 = Width - v;
  if (!v) v=1;
  var c0 = "#EEEEEE";
  var cP = '#8388FF';
  var img="<img src='/design/1x1.gif' width='1' height='"+Height+"'>";
  var sty= "style=''";
  document.write("<table width='"+Width+"' border='0' cellspacing='0'  cellpadding='0' border='1'><tr style='background-color:"+c0+"' height='"+Height+"'>");
  document.write("<td width='"+v+"' style='background-color:"+cP+"'>"+img+"</td><td>"+img+"</td>");
  document.write("</tr></table>");
}


//+-----------------------------------------------------+
//|    Отсечь передние пустые символы                   |
//+-----------------------------------------------------+
function LTrim(String)
{
  if (!String || String=='') return '';
  var ln=String.length;
  for(var i=0; i < ln; ++i)
  {
    if (String.charAt(i) > ' ') break; 
  }
  if (!i) return String;
  return String.substring(i);
}

//+-----------------------------------------------------+
//|    Отсечь задние пустые символы                     |
//+-----------------------------------------------------+
function RTrim(String)
{
  if (!String || String=='') return '';
  var ln=String.length;
  for(var i=ln-1; i >= 0; --i)
  {
    if (String.charAt(i) > ' ') break; 
  }
  if (i==ln-1) return String;
  return String.substring(0, i+1);
}

//+-----------------------------------------------------+
//|    Отсечь передние и задние пустые символы          |
//+-----------------------------------------------------+
function Trim(String)
{
  return RTrim(LTrim(String));
}

//+-----------------------------------------------------+
//|   Replace set of chars in Find to Replace-text      |
//+-----------------------------------------------------+
function char_replace(String, Find, Replace)
{
  var len = String.length;
  if (!len) return String;
  var fl = Find.length;
  if (!fl) return String;
  var s='';
  var n, i, ok;
  for(n=0; n < len; ++n)
  { 
    var c = String.charAt(n);
    ok=0;
    for(i=0;i<fl;++i)
    {
      var f = Find.charAt(i);
      if (f==c)
      {
        ok=1;
        break;
      }
    }
    if (ok)
    {
      if (Replace) s+=Replace;
      continue;
    }
    s += c;
  }
  return s;
}

function JS_Password_Valid(password)
{
  var regexp=/^[a-z0-9_]{1,}$/gi;
  var index=passwd.search(regexp);
  var valid=(index==0);
  return valid;
}

//+-----------------------------------------------------+
//|    Preloading of the Images in <head> tag           |
//+-----------------------------------------------------+
function GPS_Preload()
{
  var argV=arguments.length;
//  alert("GPS_Preload("+argV+")");
  for(var n=0; n < argV; ++n)
  {
    var p=arguments[n];
    var o = new Image();
    o.src=p;
  }
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function RemoveSpecialChars(String)
{
  var len = String.length;
  if (!len) return String;
  var s='';
  var n;
  for(n=0; n < len; ++n)
  { 
    var c = String.charAt(n);
    if (c=='/' || c=='?' || c==' ' || c=='&' || c=='=' || c=='+' || c=='-' || c=='.') c = '_';
    else
    {
      if (c=='!' || c=='%' || c=='#' || c=='~' || c=='*' || c=='^' || c==':') continue;
    }
    s += c;
  }
  return s;
}

function GPS_SetText(Text)
{
  document.write(Text);
}

//+-----------------------------------------------------+
//|  Закрыть popup окно и перечитать родительское       |
//+-----------------------------------------------------+
function GPS_Close()
{
  self.opener.parent.document.location.reload(true);
  window.close();
}

//+-----------------------------------------------------+
//|  Простейшее Всплывающее окно с задаваемым размером  |
//+-----------------------------------------------------+
function GPS_OpenPopup(Wdt,Hdt,name,mode)
{
  if (typeof(mode)=='undefined') mode = 'scrollbars=yes,resizable=yes';
  var sw = window.screen.width - 10;
  var sh = window.screen.height - 80;
  if (Wdt <= 0) Wdt = sw + Wdt;
  if (Hdt <= 0) Hdt = sh + Hdt;
  var opts = 'width='+Wdt + ',height='+Hdt + ',' + mode;
  var wname = RemoveSpecialChars(name);
  if (wname.length==0) wname='popup';
  var newWindow = window.open(name,wname, 'width='+Wdt + ',height='+Hdt + ','+mode);
  newWindow.focus();
  return newWindow;
}

//+-----------------------------------------------------+
//|      Всплывающее окно с задаваемыми параметрами     |
//| S-scrols;R-resize;T-Tools;U-StatUs;M-Menu;L-Locatn  |
//+-----------------------------------------------------+
function GPS_OpenWindow(Wdt,Hdt,name,Options)
{
//  var opts = 'width='+Wdt + ',height='+Hdt + ',scrollbars=yes,resizable=yes,toolbar=yes,status=yes,menubar=no,location=yes';
//  var opts = 'width='+Wdt + ',height='+Hdt + ',scrollbars=yes,resizable=yes,toolbar=no,status=no,menubar=no';
  var opts = 'width='+Wdt + ',height='+Hdt;
  if (typeof(Options)=='undefined') opts += ',scrollbars=yes,resizable=yes';
  else
  {
    if (Options.indexOf("L") != -1) opts += ',location=yes';
    if (Options.indexOf("S") != -1) opts += ',scrollbars=yes';
    if (Options.indexOf("R") != -1) opts += ',resizable=yes';
    if (Options.indexOf("T") != -1) opts += ',toolbar=yes';
    if (Options.indexOf("U") != -1) opts += ',status=yes';
    if (Options.indexOf("M") != -1) opts += ',menubar=yes';
  }
  var wname = RemoveSpecialChars(name);
//  alert (wname);
  var newWindow = window.open(name,wname, opts);
//  newWindow.document.onUnload="parent.document.location.reload(1)";
  newWindow.focus();
}

var CFormScript_Stars = Array();

function CheckFormReady(onForm)
{
  var fN = onForm.length;
//  var text = "From ".onForm.name."\n";
  var text = "";
  var index = -1;
  var n;
  var sN = CFormScript_Stars.length;
  for(n=0; n < sN; ++n)
  {
    var s = CFormScript_Stars[n];
    var id = s[0];
    var help = s[1];
    e = document.getElementById(id);
    if(!e || typeof(e) != 'object') continue;
    var t = e.type;
    if (t=='checkbox' || t=='radio') 
    {
      if (e.checked) 
      {
        continue;
        text += "##"+help+"\n";
      }
      continue;
    }
    var v = Trim(e.value);
    if (v != '') continue;
    text += help + "\n";
//    alert(t+"\n"+v);
  }
  if (text=='')
  {
    onForm.submit();
    return false;
  }

  alert("Вы обязательно должны заполнить следующие поля формы:\n\n"+text);
  onForm.focus();
  return true;
}

// Блинкующая иконка
var LibImagePath="../_lib/img";

function JS_IconBlink(image, ifile)
{
 image.src = LibImagePath+"/"+ifile;
}

//+-----------------------------------------------------+
//|   Submit формы с модификатором                      |
//+-----------------------------------------------------+
function FormModifiedSubmit(FormName, ModifierID, Mode)
{
  if (typeof(ModifierID)!='undefined')
  {
    var dv = document.getElementById(ModifierID);
    if (typeof(dv)!='undefined')
    {
      dv.value = Mode;
    }
  }
  eval(FormName+'.submit()');
}

//+-----------------------------------------------------+
//|     Установить значения чек-боксов на всём листе    |
//+-----------------------------------------------------+
function JS_SetCheckMarkers(ListLen, CheckPrefix, OnOff, Invert)
{
  if (typeof(Invert)=='undefined') Invert = false;
  for(var n=0; n < ListLen; ++n)
  {
    e = document.getElementById(CheckPrefix+n);
    if(typeof(e) != 'object') continue;
    if (Invert) e.checked = !e.checked;
    else e.checked = OnOff;
  }
}

//+-----------------------------------------------------+
//|    Взять массов зачекенных записей с формы          |
//+-----------------------------------------------------+
function JS_GetCheckedIndexes(ListLen, CheckPrefix, NamePrefix, MaxNameList)
{
  var ret=new Object;
  ret.csv = '';
  ret.array = Array();
  ret.namelist='';
  ret.length = 0;
  if (typeof(NamePrefix)=='undefined') NamePrefix = '';
  if (typeof(MaxNameList)=='undefined') MaxNameList = 0;
  for(var n=0; n < ListLen; ++n)
  {
    e = document.getElementById(CheckPrefix+n);
    if(typeof(e) != 'object') continue;
    var ch = e.checked;
    if (!ch) continue;
    if (ret.length) ret.csv+=',';
    ret.csv+=n;
    ret.array[ret.length]=n;
    if (NamePrefix != '')
    {
      if (MaxNameList > 0) 
      {
        if (ret.length>=MaxNameList)
        {
          if (ret.length==MaxNameList) ret.namelist+="   . . .\n";
          ++ret.length;
          continue;
        }
      }
      var nm=document.getElementById(NamePrefix+n);
      if(typeof(nm) != 'object') continue;
      var name = nm.innerHTML;
      ret.namelist += (n+1)+'. '+name+"\n";
    }
    ++ret.length;
  }
  if (ret.length)
  {
    ret.namelist+='    ВСЕГО: '+ret.length;
  }
  return ret;
}

//+=====================================================+
//|          Рисование специальных элементов            |
//+=====================================================+
//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function API_DrawGrayScale(DataArray, Height, MinColor, MaxColor)
{
  var s="<table width='100%' cellpadding='0' cellspacing='0' border='0'><tr valign='top' style='font-size:1;background-color:#FFFFFF' height='"+Height+"'>\n";
  var sty="border-style:solid;border-width:1px;border-top-color:#0;";
  var k = (MaxColor- MinColor) / 100; 
  var c0 = 0;
  var c1 = 0;
  for(var n=0; n < DataArray.length; ++n)
  {
    var v=Math.round(DataArray[n]);
    var dc=Math.round(k * v);
    c0=c1;
    c1+=dc;
    var cc=Math.round((c1 + c0) / 2) + MinColor;
    if (cc>255) cc=255;
    var c = RGB_Color(cc, cc, cc);
    s+="<td width='"+v+"%' style='"+sty+";background-color:"+c+"'>&nbsp;</td>\n";
  }
  s+="</tr></table>\n";
  return s;
}

//+-----------------------------------------------------+
//|    Рисование Прогресс-бара                          |
//+-----------------------------------------------------+
function JS_ProgressBar(w, h, percent, ClrOn, ClrOff)
{
//  percent *= 100;
  var value = Math.round(percent);
	html = '<table width="100%" border="1" cellpadding="4" cellspacing="1" style="border: 1 solid #F0F0F0; margin-bottom:5px;">';
  html += '<tr><td width="' + percent + '%' + '" align="right" valign="middle" bgcolor="' + ClrOn + '" style="border: 1 solid '+ClrOff+'";">';
	if(value !== false) html += '<span class="Aux"><font color="white"><b><nobr>' + value + '%</nobr></b></font><br></span>';
	else html += '<img src="/design/1x1+gif" width="1" height="1" border="0"><br>';
	html += '</td><td width="' + (100 - percent) + '%' + '" bgcolor="#F5F5F5"><img src="/design/1x1+gif" width="1" height="1" border="0"><br></td></tr></table>';
  return html;
}

//+=====================================================+
//|       РАБОТА С КАЛЕНДАРНОЙ ДАТОЙ                    |
//+=====================================================+
//+-----------------------------------------------------+
//|   Расщепить текстовую дату DD.MM.YYYY в массив      |
//|   Пустая дата - сегодня                             |
//+-----------------------------------------------------+
function DATE_Split(Date)
{
  if (!Date || typeof(Date)=='undefined' || Date=='')
  {
    Date = CALENDAR_ToDay();
  }
  Date = char_replace(Date, '-/:_', '.');
  var dt = Date.split('.');
  var d = Array();
  d[0] = parseInt(dt[0],10);
  d[1] = parseInt(dt[1],10);
  d[2] = parseInt(dt[2],10);
  if (d[2] < 99)
  {
   d[2] += 2000;
  }
  if (d[0] < 1) d[0] = 1;
  if (d[1] < 1) d[1] = 1;
  if (d[1] > 12) d[1] = 12;
  var d_max = CALENDAR_DaysInMonth(d[1], d[2]);
  if (d[0] > d_max) d[0] = d_max;
  return d;
}

//+-----------------------------------------------------+
//|Собрать текстовую строку из десятичного представления|
//+-----------------------------------------------------+
function DATE_Printf(Day,Mon,Yer)
{
  var out='';
  if (Day < 10) out+='0';
  out+=Day+'.';
  if (Mon < 10) out+='0';
  out+=Mon+'.';
  if (Yer < 99) Yer+=2000;
  out+=Yer;
  return out;
}

//+-----------------------------------------------------+
//|  Нормализовать Строку с датой в каноническую строку |
//+-----------------------------------------------------+
function CALENDAR_Normalyze(StringDate)
{
  var d = DATE_Split(StringDate);
  return DATE_Printf(d[0],d[1],d[2]);
}

//+-----------------------------------------------------+
//|    Упаковать строку с датой в двоичный формат       |
//+-----------------------------------------------------+
function DATE_ToBin(StringDate)
{
  var d = DATE_Split(StringDate);
  return d[0] | (d[1] << 5) | (d[2] << 9);
}

//+-----------------------------------------------------+
//|  Распаковать двоичную дату в нормированноу строку   |
//+-----------------------------------------------------+
function DATE_ToString(BinDate)
{
  var d = BinDate & 0x1F;
  var m = (BinDate >> 5) & 0x0F;
  var y = (BinDate >> 9) & 0xFFF;
  return DATE_Printf(d,m,y);
}

//+-----------------------------------------------------+
//|    Является ли $Year високосным годом?              |
//+-----------------------------------------------------+
function IsLeapYear(Year)
{
  if ((!(Year & 3)) && (Year % 100) || (!(Year % 400))) return 1;
  return 0;
}

//+-----------------------------------------------------+
//|      Число дней в месяце                            |
//+-----------------------------------------------------+
function CALENDAR_DaysInMonth(Month, Year)
{
  var days = new Array(31,1,31,30,31,30,31,31,30,31,30,31,0);
  if (Month < 1) Month = 1;
  else if (Month > 12) Month = 12;
  var d = days[Month-1];
  if (d==1)
  {
    d=28;
    if (IsLeapYear(Year)) ++d;
  }
  return d;
}

//+-----------------------------------------------------+
//|    Индекс начального дня месяца 0...6               |
//+-----------------------------------------------------+
function CALENDAR_MonthStartDay(Month, Year)
{
  var std = new Array(0,1,2,4,5,6,0,2,3,4,5,0,1,2,3,5,6,0,1,3,4,5,6,1,2,3,4,6,0,1,2); // Since 1990
  // 2021=4:  2022=5;  2023=6;  2024=0;  2025=2:
  // 1980=1; 1981=3; 1982=4; 1983=5; 1984=6; 1985=1; 1986=2; 1987=3; 1988=4; 1989=6; 
  var ys = -1;
  if (Year >= 1990 && Year <= 2020)
  {
    ys = std[Year-1990];
  }
  else if (Year < 1990)
  {
    ys = std[0]-1;
    for(y=1990; y > Year; --y)
    {
      ys += 365;
      if (IsLeapYear(y-1)) ++ys;
    }
    ys %= 7; 
    ys = 6-ys;
  }
  else
  {
    ys = std[30];
    for(y=2020; y < Year; ++y)
    {
      ys += 365;
      if (IsLeapYear(y)) ++ys;
    }
  }

  var shift = new Array(0,31,59,90,120,151,181,212,243,273,304,334,365);
  if (Month < 1) Month = 1;
  else if (Month > 12) Month = 12;
  ys += shift[Month-1];
  if (Month > 2 && IsLeapYear(Year)) ++ys;
  return ys % 7;
}

//+-----------------------------------------------------+
//|    Имя месяца по индексу 1...12                     |
//+-----------------------------------------------------+
function CALENDAR_MonthName(Month, ShortForm, English)
{
  if (Month < 1) Month = 1;
  else if (Month > 12) Month = 12;
  var r_long = new Array("","Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь","");
  return r_long[Month];
}

//+-----------------------------------------------------+
//|    Имя месяца по индексу 1...12                     |
//+-----------------------------------------------------+
function CALENDAR_DayName(Day, English)
{
  var d_rus=new Array("ПН","ВТ","СР","ЧТ","ПТ","СБ","ВС","");
  Day %= 7;
  return d_rus[Day];
}

//+-----------------------------------------------------+
//|   Вернуть строку с сегоднящней датой                |
//+-----------------------------------------------------+
function CALENDAR_ToDay()
{
  var da = new Date();
  var d = da.getDate();
  var m = da.getMonth()+1;
  var y = da.getYear();
  if (y < 500) y += 1900;
  return DATE_Printf(d,m,y);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function _calendar_click(Ident,Yer,Mon,Day,OnDateChange,CloseButt)
{
  var da = DATE_Printf(Day,Mon,Yer);
//  alert("Click("+OnDateChange+")=>"+da);
  document.getElementById("_calendar").innerHTML = CALENDAR_Print(da,"_calendar",CloseButt);
  if (OnDateChange) OnDateChange(da);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function _calendar_Yclick(Ident,Yer,Mon,Day,dir,OnDateChange,CloseButt)
{
  Yer+=dir;
  var da = DATE_Printf(Day,Mon,Yer);
  var e = document.getElementById("_calendar").innerHTML = CALENDAR_Print(da,"_calendar",CloseButt);
  if (OnDateChange) OnDateChange(da);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function _calendar_Mclick(Ident,Yer,Mon,Day,dir,OnDateChange,CloseButt)
{
//document.write('Butt='+CloseButt+'<br>');
  Mon+=dir;
  if (Mon < 1) Mon=12; 
  else if (Mon > 12) Mon=1;
  var da = DATE_Printf(Day,Mon,Yer);
  var e = document.getElementById("_calendar").innerHTML = CALENDAR_Print(da,"_calendar",CloseButt);
  if (OnDateChange) OnDateChange(da);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function _mk_mon_yer_button(Ident,Yer,Mon,Day,type,dir,OnDateChange,CloseButt)
{
  var out = "";
//document.write(CloseButt+'('+OnDateChange+')<br>');
//  var shape=(dir < 0)? "v":"^";
  var shape=(dir < 0)? "<img src=\"/_lib/img/tsmall_d.gif\"":"<img src=\"/_lib/img/tsmall_u.gif\"";
  shape+=" width=\"7\">";
  if (type)
  {
    out+="_calendar_Yclick("+Ident+","+Yer+","+Mon+","+Day+","+dir+","+OnDateChange+","+CloseButt+")";
  }
  else
  {
    out+="_calendar_Mclick("+Ident+","+Yer+","+Mon+","+Day+","+dir+","+OnDateChange+","+CloseButt+")";
  }
//document.write("==="+out+"<br>");
  return '<td width="7" onClick="'+out+'">'+shape+'</td>';
}

//+-----------------------------------------------------+
//| Выдать HTML-скрипт рисования статического календаря |
//|  для текущей даты. Пустая дата - на сегодня         |
//+-----------------------------------------------------+
function CALENDAR_Print(ForDate,Ident,OnDateChange,CloseButt)
{
  var out='';
//out=''+CloseButt+'<br>';
  if (!Ident || Ident=='') Ident="_calendar";
  var da = DATE_Split(ForDate);
  var calendar_day = da[0];
  var calendar_mon = da[1];
  var calendar_yer = da[2];
//  if (calendar_mon > 12) calendar_mon = 12;
//  else if (calendar_mon < 1) calendar_mon = 1;
  var days_in_month = CALENDAR_DaysInMonth(calendar_mon, calendar_yer);
  var start_day = CALENDAR_MonthStartDay(calendar_mon, calendar_yer);
  var d_name = (start_day + calendar_day - 1) % 7;
  d_name=CALENDAR_DayName(d_name, 0);
  var m_name = CALENDAR_MonthName(calendar_mon, false, false);
  out+="<div id=\""+Ident+"\">";
  out+="<table class=\"Calendar\" border=\"1\"  cellspacing=\"0\" cellpadding=\"0\" align=\"center\">";
  out+="<tr><td><table class=\"Calendar\" width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
  out+=_mk_mon_yer_button(Ident,calendar_yer,calendar_mon,calendar_day,0,-1,OnDateChange,CloseButt);
  out+=_mk_mon_yer_button(Ident,calendar_yer,calendar_mon,calendar_day,0,1,OnDateChange,CloseButt);
  out+="<td align=\"left\">"+m_name+", "+calendar_day+" ("+d_name+")</td>";
  out+="<td align=\"right\">"+calendar_yer+"</td>";
  out+=_mk_mon_yer_button(Ident,calendar_yer,calendar_mon,calendar_day,1,-1,OnDateChange,CloseButt);
  out+=_mk_mon_yer_button(Ident,calendar_yer,calendar_mon,calendar_day,1,1,OnDateChange,CloseButt);
  if (CloseButt && CloseButt!='' && CloseButt!=undefined)
  {
    out+="<td align=\"left\" width=\"16\"><img src=\"/_lib/img/sbutt_close.gif\"</td>";
  }
  out+="</tr></table></td></tr>";
  out+="<tr><td><table class=\"Calendar\"  border=\"0\" cellspacing=\"0\" cellpadding=\"1px\" align=\"center\">";
  var dat = 1;
  for(var d=0,row=0; row < 6; ++row)
  {
    if (dat > days_in_month) break;
    out+='<tr>';
    for(var day=0; day < 7; ++day, ++d)
    {
      var type=0;
      var txt = "-";
      var clc="";
      if (d >= start_day)
      {
        if (dat <= days_in_month)
        {
          txt = dat;
          clc=" onClick=\"_calendar_click("+Ident+","+calendar_yer+","+calendar_mon+","+dat+","+OnDateChange+","+CloseButt+");\"";
          type=(dat==calendar_day)? 2 : 1;
          if (day > 4) type += 2;
          ++dat;
        }
      }
      sty="class=\"CalendarC"+type+"\""+clc;
      out+="<td "+sty+" align=\"center\" width=\"22\">";
      out+=txt;
      out+='</td>';
    }
    out+="</tr>\n";
  }
  out+='</table></td></tr>';
  out+='</table></div>';
  return out;
}

//+-----------------------------------------------------+
//| Выдать HTML-скрипт рисования статического календаря |
//|  для текущей даты. Пустая дата - на сегодня         |
//+-----------------------------------------------------+
function CALENDAR_Set(ForDate,Ident,OnDateChange,CloseButt)
{
  document.write(CALENDAR_Print(ForDate,Ident,OnDateChange,CloseButt));
}

// OnMouse callbacks for StdButtons
function stdbTurn_over(name) 
{
	if (document.images != null) 
  {
    var src = LibImagePath+'/'+document[name].name+'1.jpg';
		document[name].src = src;
//    alert ("Src:"+src);
	}
}
function stdbTurn_off(name) 
{
	if (document.images) 
  {
    var src = LibImagePath+'/'+document[name].name+'.jpg';
		document[name].src = src;
	}
}
// OnMouse callbacks for StdTextButtons
function stdtbTurn_over(id,cls) 
{
//    alert ("Src:"+name);
  if (typeof(cls)=='undefined') cls="TextButton1";
  document.getElementById(id).className=cls;
}
function stdtbTurn_off(id,cls) 
{
  if (typeof(cls)=='undefined') cls="TextButton";
  document.getElementById(id).className=cls;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function ColorsetTable()
{
  var fixed="B";
  var left="R";
  var upper="G";
  value=Array;
  value[0]="N/A";
  value[1]="00";
  value[2]="33";
  value[3]="66";
  value[4]="99";
  value[5]="CC";
  value[6]="FF";


for (fixedamount=1; fixedamount<=6; fixedamount++)
{
  fixedvalue=value[fixedamount];
  document.write("<table border=0><tr><td>")

  for (row=0; row<=6; row++)
 { document.write("<tr>");
   for (table=1; table<=3; table=table+1)
   {
    if (table==1) {fixed="B"; left="R";  upper="G";}
    if (table==2) {fixed="R"; left="G";  upper="B";}
    if (table==3) {fixed="G"; left="B";  upper="R";}

    for (column=0; column<=6; column++)
    {
     if (fixed=="R") {redvalue=fixedvalue; fixedcolor="#CC0000"};
     if (fixed=="G") {greenvalue=fixedvalue; fixedcolor="#009900"};
     if (fixed=="B") {bluevalue=fixedvalue; fixedcolor="#0000CC"};
     if (left=="R") {redvalue=value[row]; leftcolor="#CC0000"};
     if (left=="G") {greenvalue=value[row]; leftcolor="#009900"};
     if (left=="B") {bluevalue=value[row]; leftcolor="#0000CC"};
     if (upper=="R") {redvalue=value[column]; uppercolor="#CC0000"};   
     if (upper=="G") {greenvalue=value[column]; uppercolor="#009900"};   
     if (upper=="B") {bluevalue=value[column]; uppercolor="#0000CC"};   

     if (column==0 && row==0) {document.write("<td bgColor="+fixedcolor+"><font color='#FFFFFF' size='1'>"+value[fixedamount]+"</font></td>")};
     if (column==0 && row!=0) {document.write("<td bgColor="+leftcolor+"><font color='#FFFFFF'  size='1'>"+value[row]+"</font></td>")};
     if (column!=0 && row==0) {document.write("<td bgColor="+uppercolor+"><font color='#FFFFFF' size='1'>"+value[column]+"</font></td>")};
     hexcolortext="#"+redvalue+greenvalue+bluevalue+"          ";
     hexcolorwords="Шестнадцетеричный цвет #RRGGBB: ";   pixelstring="<a href='#' alt='Click to see the hexcode' onClick=\"alert('"+hexcolorwords+hexcolortext+"');return false\">   </a>";
     if (column!=0 && row!=0){document.write("<td bgColor=#"+redvalue+greenvalue+bluevalue+">"+pixelstring+"</td>")};
    } if (table<3) {document.write("<td bgColor=#f0f0f0>    </td>")};
   }
   document.write("</font></tr>");
   } 
   document.write("</td></tr></table>");
 }
}

//+-----------------------------------------------------+
//|    Референции для рассыльщика почты                 |
//+-----------------------------------------------------+
function MAILER_MakeAddressReference(Index, Clicker)
{
  if (Index < 0 || Index >= MAILBOOK_AN) return "";
  var o = '';
  var ref = MAILBOOK_A[Index];
  if (!ref || typeof(ref)=="undefined") return "";
  if (!ref.length) return "";
  var type = ref.charAt(0);
  var title='e-mail адрес';
  switch(type)
  {
  case '[':
    title='Гуппа адресной книги';
    break;
  case '(':
    title='Сообщество. В контакты не добавлять!';
    break;
  }
  var tit = " title='"+title+"'";
  click = ' onClick=\"'+Clicker+'(' + Index+');\"';
  o = '&nbsp;<span class=\"Reference\"'+click+tit+'>' + ref + '</span>&nbsp;<br>';
  return o;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function MailerNormalResponce(Resp)
{
  var rsp = Resp.responseText;
  if (rsp=='Ok')
  {
    alert("Ноавя группа добавлена\nв адресную книгу.");
    return;
  }
  alert("ОШИБКА!\nГруппа не добавлена!");
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function MAILER_AjaxAddReference(NewReference, Login)
{
  var url = "?act=ajaxexec&mode=newaddrgroup&login="+Login;
  var data = "data="+NewReference;
  var trf = new Ajax.Request(url, 
  {
    method: 'get', 
    parameters: data,
    onComplete: MailerNormalResponce
  }
  );
}

//+=====================================================+
//|                                                     |
//+=====================================================+
var AJAX_Feilds=0;
var AJAX_Url="";
var AJAX_Login="";
var AJAX_User="";

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function AJAX_Initiate(Url, Login, UserIP)
{
  AJAX_Feilds = Array();
  AJAX_Url=Url;
  AJAX_Login=Login;
  AJAX_User=UserIP;
//  alert(Url); alert(Login);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function AJAX_Executor(Mode)
{
  return AJAX_Url+"&mode="+Mode+"&login="+AJAX_Login+"&user_ip="+AJAX_User;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function AJAX_AddField(Name, Type, Action)
{
  if (!AJAX_Feilds) AJAX_Feilds = Array();
  AJAX_Feilds[AJAX_Feilds.length]=Array(Name, Type, Action);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function AJAX_FindField(Name)
{
  if (!AJAX_Feilds) return 0;
  var len = AJAX_Feilds.length;
  for(var n=0; n < len; ++n)
  {
    var f = AJAX_Feilds[n];
    var name = f[0];
    if (name==Name) return f;
//    alert(name);
  }
  return 0;
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function AJAX_FieldCall(Name, Type, Action, Value)
{
  if (Value==true) Value=1; else Value=0;
  var url = AJAX_Url+Action+"&name="+Name+"&value="+Value+"&login="+AJAX_Login;
  var trf = new Ajax.Request(url, 
  {
    method: 'get'
  }
  
  );
//  alert(url);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function AJAX_CheckBox(Tag)
{
  var name=Tag.name;
  var f = AJAX_FindField(name);
  if (!f) return;
  var chk=Tag.checked;
  AJAX_FieldCall(f[0], f[1], f[2], chk);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function AJAX_ClickCheck(CheckCell, Service, Command, Annonce)
{
  if (Annonce) alert(Annonce);
  var chk=CheckCell.checked;
  Command+='&check=';
  Command+=(chk)? '1':'0';
  var trf = new Ajax.Request(Service, 
  {
    method: 'get',
    parameters: Command
  }
);
//alert('check='+chk+"\n"+Service+"\n"+Command);
}

//+-----------------------------------------------------+
//|                                                     |
//+-----------------------------------------------------+
function GPS_IsAJAX()
{
  return (typeof(Ajax)=='object')? true:false;
}

//+-----------------------------------------------------+
//|  Пустой отклик на AJAX-запрос                       |
//+-----------------------------------------------------+
function __TestNormalResponceEmpty(Resp)
{
}

//+-----------------------------------------------------+
//|   Универсальный запрос по каналу AJAX               |
//+-----------------------------------------------------+
function GPS_AjaxRequest(url, Command, TestNormalResponceCallBack)
{
  if (typeof(TestNormalResponceCallBack)=='undefined') TestNormalResponceCallBack=__TestNormalResponceEmpty;
  var trf = new Ajax.Request(url, 
  {
    method: 'get', 
    parameters: Command,
    onComplete: TestNormalResponceCallBack
  }
  );
}

//+==============================+
//|    AJAX KEY-EVENT TRAPPER    |
//+==============================+
var GPS_key_status=false
var ___key_trapper=0;
// F1...F12 = 112...123; go_left=27; go_right=39; go_up=38; go_down=40;
// Tab=9; Enter=13; Esc=27; Insert=45; Delete=46; Home=36; End=35; PgUp=33; PgDown=34;
function __onDocumentKeyDownAjax(event)
{
  var key=event.keyCode;
  if (key==91)
  {
    return;
  }
  if (key==16) {GPS_key_status|=1; return;} // ctrl
  if (key==17) {GPS_key_status|=2; return;} // shift
  if (key==18) {GPS_key_status|=4; return;} // alt
  if (key==20) {GPS_key_status^=8; return;} // alt
  if (key==144) {GPS_key_status^=16; return;} // numlock
//  if (key >= 48 && key <= 57) key-= 48;
  if (key >= 96 && key <= 105) key-= 48;
  if (!___key_trapper)
  {
    return false;
  }
  var ret=false;
  var s='ret='+___key_trapper+'('+key+');';
  eval (s);
//alert (ret);
  if (ret) Event.stop(event);
}
function __onDocumentKeyUpAjax(event)
{
  var key=event.keyCode;
  if (key==16) {GPS_key_status&=~1; return;}
  if (key==17) {GPS_key_status&=~2; return;}
  if (key==18) {GPS_key_status&=~4; return;}
}

//+-----------------------------------------------------+
//|     Установть имя ф-ции перехвата клавиатуры        |
//+-----------------------------------------------------+
//function MyKeytrap(key){ return true/false;}
//GPS_SetKeyTrap('MyKeytrap');
function GPS_SetKeyTrap(KeyTrapper)
{
  if (!GPS_IsAJAX()) return;
  if (!KeyTrapper)
  {
    ___key_trapper=0;
    return;
  }
  ___key_trapper=KeyTrapper;
  window.document.observe("keydown",__onDocumentKeyDownAjax);
  window.document.observe("keyup",__onDocumentKeyUpAjax);
}

