﻿var gWndw_OnResizeArr = new Array(); // Список функций на onresize
var gWndw_OpenWindow = null; //Объект открытого окна

//==================================================================
function checkbox(objElement,objAction)
{
  var defaultValue = objElement.getAttribute('defaultValue');
  if ((objElement.value == '' ) && (objAction=='check')) 
  {
    objElement.style.color = "#999";
    objElement.value= defaultValue;
  };

  if ((objElement.value == defaultValue) && (objAction=='clear'))
  {
    objElement.value='';
    objElement.style.color = "#000";
  };
};

//==================================================================
function getselection(objElement) 
{
   var obj='';
}

// Проверка, что барузер IE
function IsIE()
{
  // Проверка на браузер "Опера"
  var is_opera = /opera/i.test(navigator.userAgent);
  
  // Проверка на браузер "Опера" с учетом маскировки
  var is_ie = ( /msie/i.test(navigator.userAgent) && !is_opera );

  return is_ie;
}

//==================================================================
// Получение абсолютных позиций объекта
// <- ar[0]=top; ar[1]=left; ar[2]=body
function GetBodyOffset(obj)
{
  var top = 0;
  var left = 0;
  var theObj=obj
  while (obj && (obj != document.body)) 
  {
    top += obj.offsetTop;
    left += obj.offsetLeft;
    obj = obj.offsetParent;
  }

  // Цикл для определения прокрутки внутри какого-либо DIV
  obj = theObj
  while (obj && (obj != document.body)) 
  {
    top = top - obj.scrollTop;
    obj = obj.parentNode;
  }

  var values = new Array();
  values[0] = top;
  values[1] = left;
  values[2] = obj;
  return values
}

/* ------- WINDOW ------- */

// =======================================================================================
//DIV с IFRAME для скрытия <select> при наложении поверх него каких-либо окон в IE
function ShowWCH(w,h,t,l,DivId)
{
  if (!IsIE()) {return};
  if (typeof(DivId)=='object')
  {
    if (DivId.id != '') {DivId = DivId.id + 'WCH';}
    else (DivId = '');
  }
  if (!DivId) {DivId = 'wchDiv';};

  WCH = document.getElementById(DivId);
  if (!WCH) {return};

  WCH.style.width = w;
  WCH.style.height = h;
  WCH.style.top = t;
  WCH.style.left = l;

  WCH.style.display = 'inline';
  WCH.firstChild.style.height = h; //Изменение высоты вложенного IFRAME

}

// =======================================================================================
// Выключить WCH
function HideWCH(id)
{
  if (!IsIE()) {return};
  if (!id) {id = 'wchDiv';};

  WCH = document.getElementById(id);
  if (!WCH) {return};
  WCH.style.display = 'none';
}

// =======================================================================================
// Получение DIV WCH по ид. Если нет такого, то создается новый.
// zIndex - можно устанавливать величину
function Wndw_GetWCH(id,zIndex) 
{
  if (!id) id = 'wchDiv';
  var div = document.getElementById(id);

  //Нет такого DIV - создание
  if (!div)
  {
    div = document.createElement('DIV');
    document.body.appendChild(div);
    div.className = 'wchDiv';
    div.id = id;
    div.innerHTML = '<IFRAME style="width:100%; height:100%;"></IFRAME>';
  }

  if (zIndex) div.style.zIndex = zIndex;
  return div;
}

// =======================================================================================
// Получение скрывающего DIV'a.  Если нет такого, то создается новый.
// zIndex - можно устанавливать величину
function Wndw_GetHideDiv(id,zIndex)
{
  if (!id) id = 'WindowHider';
  var div = document.getElementById(id);

  //Нет такого DIV - создание
  if (!div)
  {
    div = document.createElement('DIV');
    document.body.appendChild(div);
    div.className = 'WindowHider';
    div.id = id;
  }

  if (zIndex) div.style.zIndex = zIndex;
  return div;
}

// =======================================================================================
// Показать окно
// -> DivId - ид. DIV с содержимым окна
// -> InputId - ид. элемента, в который необходимо вернуть значние (опционально)
// -> Resize - [0|1|2]: 1 - только пересчитать размер; 2 - сохранить позицию по вертикали
// -> Width - ширина окна (строка: 100px; 20em и т.п.)
// -> param - доп. параметры в виде массива [название]=значение
// --> 'top' - фикс. позиция сверху
// --> 'right' - фикс. позиция с права
// --> 'copyType' - 0: innerHTML, 1: cloneNode для первого вложенного элемента в копируемый DIV
// -----------
// Можно передать в DivId объект окна, но только в режиме resize > 0. Тогда будет использован этот объект
// При этом с ним автоматически будут связаны Shadow, Hider, Wch - по ид. объекта, переданного в DivId!!!
function ShowWindow(DivId, InputId, resize, width, param)
{
  if (resize == undefined) resize = 0;
  if (param == undefined) param = new Array;


  //PARAM: Start
  if (param['copyType']== undefined) 
  {
    var copyType = 0;  
  }
  else
  {
    var copyType = param['copyType'];
  }
  

  if (param['top']== undefined) 
  {
    var topPARAM = undefined;
  }
  else
  {
    var topPARAM = param['top'];
  }

  if (param['right']== undefined) 
  {
    var rightPARAM = undefined;
  }
  else
  {
    var rightPARAM = param['right'];
  }
  //PARAM: End  

  if (!resize) CloseWindow('');
  
  if ((resize > 0)&&(typeof(DivId) == 'object')) // Если Resize и передан объект окна
  {
    var DIV = DivId;
  }
  else
  {
    var DIV=document.getElementById('WindowDiv'); // Рабочее окно
  }

  if (!resize) 
  {
    var CDIV=document.getElementById(DivId); // Содержание окна, которое скопировать
    if (!CDIV) {return};
  }

  // Перенос в окно содержания (из CDIV в DIV)
  if (!resize) 
  {
    if (copyType == 0)
    {
      DIV.innerHTML = CDIV.innerHTML;
    }
    else if (copyType == 1)
    {
      var fChild = CDIV.firstChild;
      if (fChild.nodeName == '#text') fChild = fChild.nextSibling;
      var newBlock = fChild.cloneNode(true);
      DIV.innerHTML = '';
      DIV.appendChild(newBlock);
      Wndw_CopyInputValues(DIV, CDIV);
    }
    else
    {
      return;
    }
  }

  // Вычисление позиции DIV
  //_Включение DIV, получение размеров, Выключение
  if (width) DIV.style.width = width;
  DIV.style.display = 'inline';
  var CWidth = DIV.offsetWidth;
  var CHeight = DIV.offsetHeight;
  if (!resize) DIV.style.display = 'none';

  //Получение свободного места
  var WHeight = document.body.clientHeight; // Высота видимой области
  var WWidth = document.body.clientWidth; // Ширина видимой области

  //alert(WHeight + ' | ' + WWidth + ' // ' + CHeight + '|' + CWidth);
  
  // Проверка на свободное место: Вертикаль
  if (resize < 2)
  {
    var TopPos = (WHeight - CHeight)/2;
    if (WHeight < CHeight) TopPos = 5;
  }
  else
  {
    TopPos = DIV.style.top;
    TopPos = TopPos.match(/\d*/)[0]; // Получение тольк числа, без "px"
  }
  
  // Проверка на свободное место: Горизонталь
  var LeftPos = (WWidth - CWidth)/2;
  if (WWidth < CWidth) LeftPos = 5;

  if (resize < 2) TopPos = TopPos + document.body.scrollTop;
  
  //alert(TopPos + ' / ' + LeftPos + ' / ' + document.body.scrollTop);
  
  if (topPARAM !=undefined) TopPos = topPARAM;
  if (rightPARAM !=undefined) LeftPos = WWidth - rightPARAM;

  DIV.style.top = TopPos;
  DIV.style.left = LeftPos;
  DIV.style.display = 'inline';
 
  if (typeof(DivId) == 'object')
  {
    DrawMyShadow(TopPos,LeftPos,DivId);
  }
  else
  {
    DrawMyShadow(TopPos,LeftPos);
  }
  
  // Включение Hider и WCH
  if ((resize > 0)&&(typeof(DivId) == 'object'))
  {
    ShowHider(DivId);
    ShowWCH(CWidth, CHeight-10, TopPos+5, LeftPos, DivId);
  }
  else
  {
    ShowHider();
    ShowWCH(CWidth, CHeight-10, TopPos+5, LeftPos );
  }

  if (resize > 0) return;

  // Перепозиционирование окна при смене размера страницы
  var fnc;
  //if (!InputId) InputId = undefined;
  //if (InputId != undefined ) fnc = 'ShowWindow(\'' + DivId + ',\'' + InputId + ',1);';
  //if (InputId == undefined ) fnc = 'ShowWindow(\'' + DivId + '\',null,1);';
  fnc = function() {ShowWindow(DivId, InputId, resize, width, param);};
  Wndw_RegOnResize('WNDW', fnc);
}

// =======================================================================================
// Включение Тени окна
function DrawMyShadow( topPos, leftPos, mainId)
{
  var shDivId = 'WindowDivShadow';
  if (typeof(mainId) == 'object') // Если передали объект окна
  {
    var mainDIV = mainId;
    // Получение Body этого окна, чтобы найти окно тени
    var docObj = mainDIV.ownerDocument;
    
    // Ид. блока тени
    if (mainDIV.id != '') shDivId = mainDIV.id + 'Shadow';
    var DIV=docObj.getElementById(shDivId);
  }
  else if (mainId == undefined)
  {
    var mainDIV=document.getElementById('WindowDiv');
    var DIV=document.getElementById('WindowDivShadow');
  }
  else //mainId= <ид.окна>
  {
    var mainDIV=document.getElementById(mainId);
    var shDivId = mainId + 'Shadow';
    var DIV=document.getElementById(shDivId);
  }

  // создание, если нет такого DIV
  if (!DIV)
  {
    DIV = document.createElement('DIV');
    document.body.appendChild(DIV);
    DIV.style.display = 'none';
    DIV.className = 'WindowDivShadow';
    DIV.id = shDivId;
  }
  
  // рисование скругленной тени
  var shStr = '';
  var shStrAngTop = '<div class="windowBorder1">&nbsp;</div><div class="windowBorder2">&nbsp;</div><div class="windowBorder3">&nbsp;</div><div class="windowBorder4">&nbsp;</div>';
  var shStrAngBot = '<div class="windowBorder4">&nbsp;</div>  <div class="windowBorder3">&nbsp;</div><div class="windowBorder2">&nbsp;</div><div class="windowBorder1">&nbsp;</div>';

  shStr = shStr + shStrAngTop;
  shStr = shStr + '<div style="height:'+(mainDIV.offsetHeight-9)+'">&nbsp;</div>';
  shStr = shStr + shStrAngBot;
  DIV.innerHTML = shStr;

  
  topPos = +topPos; // Перевод в число
  DIV.style.top = topPos + 5;
  DIV.style.left = leftPos + 5;
  DIV.style.width = mainDIV.offsetWidth;
  DIV.style.height = mainDIV.offsetHeight;
  DIV.style.display = 'inline';
}

// ===================================================================
// Включение DIV, выключающего доступ к BODY сайта
function ShowHider(DivId)
{
  // Определение окна Hider
  if (typeof(DivId)=='object') // Если передан объект основного окна
  {
    var hDivId = 'WindowHider';
    if (DivId.id != '') hDivId = DivId.id + 'Hider';
    var HDIV = document.getElementById(hDivId);
  }
  else if (DivId == undefined) 
  {
    var HDIV = document.getElementById('WindowHider');
  }
  else // id = <ид. объекта>
  {
    var HDIV = document.getElementById(DivId);
  }
   
  var SizeDIV = document.getElementById('MainDiv'); //Вычисление полного размера страницы
  var ar = Wndw_GetPageSize();
  HDIV.style.height = ar[0];
  HDIV.style.width = ar[1];
  HDIV.style.display = 'inline';
}

// ===================================================================
// Получение реального размера страницы (body)
// Возвращает массив: ar[0]=height; ar[1]=width;
function Wndw_GetPageSize()
{
  var SizeDIV = document.getElementById('MainDiv'); //Вычисление полного размера страницы
  var HWidth = document.body.clientHeight;
  if (HWidth < SizeDIV.offsetWidth) {HWidth = SizeDIV.offsetWidth;};
  var HHeight = document.body.clientHeight;
  if (HHeight < SizeDIV.offsetHeight) {HHeight = SizeDIV.offsetHeight};
  
  var ar = new Array();
  ar[0] = HHeight;
  ar[1] = HWidth;

  return ar;
}


// ===================================================================
// Получение реального размера страницы (content)
// Возвращает массив: ar[0]=height; ar[1]=width;
function Wndw_GetContSize()
{
  var SizeDIV = document.getElementById('MainDiv'); //Вычисление полного размера страницы
  var ar = new Array();
  ar[0] = SizeDIV.offsetHeight;
  ar[1] = SizeDIV.offsetWidth;

  return ar;
}

// ===================================================================
// Принудительное растягивание страницы на всю высоту видимой области (подвал вниз)
function Wndw_FullHeight()
{
  // сброс высоты
  var div = document.getElementById('footerSizer');
  if (!div) {return;}
  div.style.height=0;
  
  var ar = Wndw_GetContSize();
  var cHeight = document.body.clientHeight;
  
  //alert(ar[0] + ' / ' + cHeight);
    
  // Нужно опустить подвал
  if (ar[0]<cHeight)
  {
      div.style.height = cHeight-ar[0]-0;
  }
 
  // регистрация на пересчет при OnResize
  Wndw_RegOnResize('footerSizer', Wndw_FullHeight, 0);
}


// ===================================================================
// Закрытие окна
function CloseWindow(winId)
{
  if (!winId) winId = 'WindowDiv';
  var scId = winId + 'Shadow'

  // Скрытие окна
  var DIVL1 = document.getElementById(winId);
  var DIVL1S = document.getElementById(scId);
  var HDIV = document.getElementById('WindowHider');

  DIVL1.style.display = 'none';
  DIVL1.style.width = '';
  DIVL1S.style.display = 'none';
  HDIV.style.display = 'none';
  SelectedObj = '';
  HideWCH();

  Wndw_UnRegOnResize('WNDW');
}

// ---------------------------------------------------
// Показ окна под объектом (BETA)
// Копирование DIV в окно не выполняется!
// obj - относительно кого отображается
// DivInfo либо ид. объекта, либо объект
// param['direct']=[left|right] относительно объекта
function ShowWindowAtPos(DivInfo,obj,param)
{
  if (param == undefined) param='';
  var CDIV;
  if (typeof(DivInfo)=='object')
  {
    CDIV = DivInfo;
  }
  else
  {
    CDIV = document.getElementById(DivInfo);
  }
  if (!CDIV) return;

  // Корректирующие значения
  var corPosLeft = 1; //Корректировка длины
  var corPosTop = 0; //Корректировка отступа сверху
  if (!IsIE())
  {
    corPosLeft = 2;
    corPosTop = 1;
  }
  
  // Получение размера DIV
  // Включение DIV, получение размеров, Выключение
  CDIV.style.display = 'inline';
  var CWidth = CDIV.offsetWidth;
  var CHeight = CDIV.offsetHeight;
  CDIV.style.display = 'none';

  // Получение координат относительно body для obj
  var offAr = GetBodyOffset(obj);
  var oTextTop = offAr[0];
  var oTextLeft = offAr[1];

  //Получение свободного места
  var TopHeight = oTextTop - document.body.scrollTop; // свободное место над объектом
  var BotHeight = document.body.clientHeight - (TopHeight + obj.offsetHeight) ; // свободное место под объектом
 
  //Расчет позиции от правого края
  var PosLeft = (oTextLeft + obj.offsetWidth) - CWidth + corPosLeft;
  if (PosLeft < 0) {PosLeft = oTextLeft}; //Если слева мало места

  PosTop = TopHeight + obj.offsetHeight + 1 + corPosTop;  //Верхний угол 

  //Если снизу места мало, то высчитывается место сверху и выбирается большее
  if (BotHeight < CHeight) //Сверху окно не поместится
  {
    //Высоты достаточно или Если места везде не хватает, но сверху его больше
    if ((TopHeight > CHeight) || ((TopHeight < CHeight)&&(BotHeight < TopHeight))) 
    {
      var PosTop = TopHeight - CHeight - 1; //Верхний угол
    };
  };

  // Включение фонового экрана
  var HDIV = Wndw_GetHideDiv('WindowHider'); //(CDIV.id + 'Hider');
  var SizeDIV = document.getElementById('MainDiv'); //Вычисление полного размера страницы
  
  // _ Вычисление размера:
  var HWidth = document.body.clientWidth;
  if (HWidth < SizeDIV.offsetWidth) {HWidth = SizeDIV.offsetWidth;};
  HDIV.style.width = HWidth;

  var HHeight = document.body.clientHeight;
  if (HHeight < SizeDIV.offsetHeight) {HHeight = SizeDIV.offsetHeight};
  HDIV.style.height = HHeight;
   
  HDIV.style.display = 'inline';
  
  // Включение окна
  PosTop = PosTop + document.body.scrollTop;
  CDIV.style.width = CWidth;
  CDIV.style.top = PosTop;
  CDIV.style.left = PosLeft;
  CDIV.style.display = 'inline';
  
  //Отображение тени
  /*
  var ShadowDIV = document.getElementById(CDIV.id+'Shadow');
  if (!ShadowDIV) ShadowDIV = document.getElementById('WindowDivShadow');
  ShadowDIV.style.width = CWidth;
  ShadowDIV.style.height = CHeight;
  ShadowDIV.style.top = PosTop + 5;
  ShadowDIV.style.left = PosLeft + 5;
  ShadowDIV.style.display = 'inline';
  */
  
  DrawMyShadow(PosTop,PosLeft,CDIV);

  //Включение WCH
  ShowWCH(CWidth, CHeight, PosTop, PosLeft, CDIV.id+'WCH');
  
  gWndw_OpenWindow = CDIV;
}


/* ============================== ONRESIZE ========================= */

// ===================================================================
// Регистрация функции на событие onresize
// prior - приоритет. Чем ниже, тем раньше выполняется. По умолч = 10;
function Wndw_RegOnResize(idx, fnc, prior)
{
  if (!prior) prior = 10;
  if (typeof(fnc) == 'string') fnc = new Function(fnc);
  
  if (typeof(gWndw_OnResizeArr[prior])!= 'object') gWndw_OnResizeArr[prior] = new Array();
  gWndw_OnResizeArr[prior][idx] = fnc;

}

// ===================================================================
// Снятие Регистрации функции на событие onresize
function Wndw_UnRegOnResize(idx,prior)
{
  if (!prior) prior = 0;
  if (gWndw_OnResizeArr[prior])
  {
    gWndw_OnResizeArr[prior][idx] = null;
  }
}

// ===================================================================
// Вызов всех функций по событию onresize
function Wndw_ExecOnResize()
{
  var prior;
  var idx;

  for (prior in gWndw_OnResizeArr)
  {
    for (idx in gWndw_OnResizeArr[prior])
    {
      if (gWndw_OnResizeArr[prior][idx]) gWndw_OnResizeArr[prior][idx]();
    }
  }
}

// ===================================================================
// Выполнение какой-либо зарегистрированной функции по idx
function Wndw_ExecOnResizeById(idx,prior)
{
  if (!prior) prior = 0;
  if (!gWndw_OnResizeArr[prior][idx]) return;
  if (gWndw_OnResizeArr[prior][idx]) gWndw_OnResizeArr[prior][idx]();
}

/* ============================== MENU ========================= */


// ============ INIT ======= //
window.onresize = Wndw_ExecOnResize;
window.onload = Wndw_FullHeight;