/*------------------------------------------ functions for edit / create / view object  ---------------------------------------------*/

var displayDialog = false;
var closeWinFlag = true;
var doWinCloseFlag = false;
var refreshbuttonsPressed = false;
var closebuttonsPressed = false;
var isBreakSearchData = false;
var isFormValidated = false;
/**
 * Добавляем в функцию поиска возможность использования объектного запроса
 * @param attrName атрибут который заполняем
 * @param refClass класс в котором ищем
 * @param page страница для поиска
 * @param objQuery id объектного запроса для фильтрования результатов поиска
 * @param objectId параметр #objectID#, который может быть использован в объектном запросе(тип параметра - любой)
 */
function getSearchObjWithObjQuery(attrName, refClass, page, objQuery, objectId, prefix) {
  if (prefix==null) prefix="";
 // alert(prefix+"\nsearchFrame_" +prefix+ attrName);
  var sFrame=document.getElementById("searchFrame_" +prefix+ attrName);
  if (!sFrame) {
		alert("Frame searchFrame_" +prefix+attrName + " not found");
		return;
  }
  var valueObj = document.getElementById("title_" + prefix+ attrName);
  var idObj = document.getElementById("id_" + prefix+ attrName);
  if (idObj) {
		idObj.value = "";
  }
  if (valueObj) {
		var selectDiv = document.getElementById("searchDiv_" + prefix+ attrName);
		if (selectDiv != null && window.attachEvent) { // необходимо только для IE; в Mozzilla selectDiv сразу находится снизу...
/*			var coord = findPos(null, 20, valueObj);
			selectDiv.style.left = coord[0] + "px";
			selectDiv.style.top = coord[1] + "px";*/
			var left=valueObj.offsetWidth+((isNaN(parseInt(valueObj.style.marginRight)))?0:parseInt(valueObj.style.marginRight))+4; //4 - ширина левого+ правого  бордюра поля
			selectDiv.style.margin = valueObj.offsetHeight+"px 0 0 -"+left+"px";
		}

		var url = baseUrl + page + '.htm?attr=' + attrName + '&cmd=search&defaultForm=easySearch&cls=' + refClass + '&condAll=start&valueAll=' + valueObj.value;
		if (objQuery && objectId) {
			url = url + "&paramQuery=" + objQuery + "&paramObject=" + objectId + "&selCls=" + refClass;
		}

		sFrame.src = "about:blank";
		sFrame.src = url;

  }
}

function getSearchObj(attrName, refClass, page, prefix) {
  return getSearchObjWithObjQuery(attrName, refClass, page, null, null, prefix);
}

function setSearchObj(selectObj, attrName, className, prefix) {
  if (prefix==null) prefix="";
  var valueObj = document.getElementById("title_" + prefix+ attrName);
  var idObj = document.getElementById("id_" + prefix+ attrName);
  var tvalueObj = document.getElementById("ttitle_" + prefix+ attrName);
  var tidObj = document.getElementById("tid_" + prefix+ attrName);
  var selectDiv = document.getElementById("searchDiv_" + prefix+ attrName);
  if (selectObj && valueObj && idObj && selectObj.selectedIndex != -1) {
    var selectOption = selectObj.options[selectObj.selectedIndex];
    if (selectOption) {
      valueObj.value = selectOption.value;
      idObj.value = selectOption.link;
      if (tidObj) {
        tidObj.value = selectOption.link;
      }
      if (tvalueObj) {
        tvalueObj.value = selectOption.value;
      }
    }
    selectDiv.style.display = 'none';
    valueObj.className = className;
  }
}

function breakSearchData(attrName,prefix) {
  if (prefix==null) prefix="";
  isBreakSearchData = true;
  var divObj = document.getElementById("searchDiv_" + prefix+ attrName);
  var valueObj = document.getElementById("title_" + prefix+ attrName);
  if (valueObj && divObj) {
    valueObj.focus();
    divObj.style.display = 'none';
  }
}

function blurSearchData(attrName,prefix) {
  if (prefix==null) prefix="";
  var divObj = document.getElementById("searchDiv_" + prefix+ attrName);
  var valueObj = document.getElementById("title_" + prefix+ attrName);
  if (valueObj && divObj) {
    divObj.style.display = 'none';
    valueObj.focus();
  }
}

function clearTitle(input) {
  if (input) {
    if (input.value == 'объект не выбран') {
      input.value = '';
    }
  }
}

function blurSearchFocus(attrName, className, prefix) {
  if (prefix==null) prefix="";
  var divObj = document.getElementById("searchDiv_" + prefix+attrName);
  var valueObj = document.getElementById("title_" + prefix+attrName);
  var idObj = document.getElementById("id_" + prefix+attrName);
  var tvalueObj = document.getElementById("ttitle_" + prefix+attrName);
  var tidObj = document.getElementById("tid_" + prefix+attrName);
  var searchSelect = document.getElementById("search_" + prefix+attrName);
  if (idObj && valueObj && tvalueObj && divObj && (divObj.style.display == 'none' || searchSelect.length == 1)) {
    if (tidObj) {
      if (idObj.value == tidObj.value && valueObj.value != tvalueObj.value) {
        valueObj.value = tvalueObj.value;
      }
      if (idObj.value == "") {
        valueObj.value = tvalueObj.value;
        idObj.value = tidObj.value;
      }
    } else {
      if (valueObj.value != tvalueObj.value) {
        idObj.value = '';
        tvalueObj.value = valueObj.value;
      }
    }
    valueObj.className = className;
    valueObj.blur();
  }
}

// verify the data from form fields for correctness 
function validateElem(obj) {
  var element = {
    value: obj.value,
    attrTitle: (obj.getAttribute('attrTitle') != null) ? "'" + obj.getAttribute('attrTitle') + "'" : "",
    attrType: obj.getAttribute('attrType'),
    mandatory: obj.getAttribute('isMandatory'),
    validate: function() {
      if (this.mandatory) {
        if (this.mandatory == "true"
                && (this.value == null
                || this.value == ""
                || this.value == "объект не выбран"
                || trim(this.value) == "")) {
          alert("Обязательное поле " + this.attrTitle + " не заполнено");

          return false;
        }
      }
      return true;
    }
  };
  return element;
}

function validate(form, passwordError) {
  if (form.cmd.value == "delete") {
    disableButtons(form);
    isFormValidated = true;
    return true;
  }

  var textAreas = form.getElementsByTagName('TEXTAREA');
  var inputs = form.getElementsByTagName('INPUT');
  var selectTags = form.getElementsByTagName('SELECT');

  var prevPass = null;

  if (cals && calendarConvert && cals.length > 0) {
    for (var i = 0; i < cals.length; i++) {
      if (!calendarConvert(cals[i].name)) {
        return false;
      }
    }
  }

  if (selectTags) {
    for (var i = 0; i < selectTags.length; i++) {
      var element = validateElem(selectTags.item(i));
      if (!element.validate()) return false;
    }
  }

  if (textAreas) {
    for (var i = 0; i < textAreas.length; i++) {
      var element = validateElem(textAreas.item(i));
      if (!element.validate()) return false;
    }
  }

  if (inputs) {
    for (var i = 0; i < inputs.length; i++) {
      elementType = inputs.item(i).getAttribute('TYPE');
      if (!elementType) continue;

      var element = validateElem(inputs.item(i));
      if (!element.validate()) return false;

      if (element.value) {
        if (element.attrType == "2") {
          if (!checkinteger(element.value)) {
            alert("Поле " + element.attrTitle + " может содержать только целые числа");
            return false;
          }
        } else if (element.attrType == "3") {
          if (!checknumber(element.value) && !checkinteger(element.value)) {
            alert("Поле " + element.attrTitle + " может содержать только вещественные значения");
            return false;
          }
        }
      }

      switch (elementType.toUpperCase()) {
        case "PASSWORD":
          if (prevPass != null) {
            if (prevPass.value != element.value) {
              alert((passwordError ? passwordError : "Повторите ввод пароля"));
              return false;
            } else {
              prevPass = null;
            }
          } else {
            prevPass = element;
          }
          break;

        case "FILE": break;
        case "TEXT": var maska = inputs.item(i).getAttribute("mask");
          if (maska != null) {
            if (self.parseMask) maska = parseMask(maska);
            if (inputs.item(i).value == maska)  inputs.item(i).value = "";
          }
          break;
        case "HIDDEN":
          break;
        default:
        //Take no actions
          break;
      }
    }
  }
  disableButtons(form);
  isFormValidated = true;
  return true;
}

function checkEmail(email) {
  if (!email && (email.indexOf("@") < 0 || email.indexOf("@") > email.length)) {
    alert("Некорректный e-mail")
    return false;
  }
  return true;
}
function wfmsQuery() {
  if (getChanged() == "false" || (getChanged() == "true" && confirm("Попытка выполнить действия с несохраненными данными. Продолжить?")))
    return true;
  return false;
}


var refreshbuttonsPressed = false;
var closebuttonsPressed = false;

function saveQuery(form, e) {
  var ev = window.event ? window.event : e;
  //	alert("dD="+displayDialog+"\nmodified="+ form.modified.value+"\nisRefresh="+isRefresh+"\ncY= "+ev.clientY+"\nkey="+ev.keyCode);
  if (ev.clientY > 0 && !closebuttonsPressed) closeWinFlag = false;
  else setTimeout('closeWinFlag=false', 100);
  //alert(closeWinFlag);
  if (displayDialog == true && form != null && form.modified != null && form.modified.value == "true") {
    //			displayDialog = false;
    ev.returnValue = "В форме были произведены изменения. Выйти без сохранения?";
  }
  //    return true;
}

function doCloseWin(hideShadow) {
  closeWinFlag = false;
  displayDialog = false;
  var changed = getChanged();
  if (changed == "true") {
    if (!(window.confirm("Информация была изменена.\n\nПри закрытии окна несохраненная информация будет потеряна!\n\nВы уверены, что хотите закрыть окно?"))) return false;
    doWinCloseFlag = true;
	if (hideShadow) {
		var wo=self.opener;
		if(wo && wo!=self && !wo.closed && wo.hideShadowForAll) wo.hideShadowForAll();
	}
    window.close();
  }
  else {
    doWinCloseFlag = true;
	if (hideShadow) {
		var wo=self.opener;
		if(wo && wo!=self && !wo.closed && wo.hideShadowForAll) wo.hideShadowForAll();
	}
    window.close();
  }
}

function getChanged() {
  try {
    return document.getElementById("modified").value;
  } catch(e) {
    return "false";
  }
}
function setChanged(flag) {
  try {
    displayDialog = true;
    var field = document.getElementById("modified");
    if (field) {
      field.value = "true";
      if (flag == false) {
        field.value = "false";
      }
    }
  } catch(e) {
  }

  //    return true;
}

function disableButtons(form) {
  if (form == null) return;
  for (var i = 0; i < form.elements.length; i++) {
    var item = form.elements[i];
    if (item.type != "submit") continue;
    if (item.getAttribute("disabled") == null || item.getAttribute("disabled") == false) item.setAttribute("disabled", "true");
  }
}

function enableButtons(form) {
  if (form == null) return;
  for (var i = 0; i < form.elements.length; i++) {
    var item = form.elements[i];
    if (item.type != "submit") continue;
    if (item.getAttribute("disabled") != null) item.removeAttribute("disabled");
  }
}


function create(form) {
  form.cmd.value = "create";
  return true;
}
function update(form, cmd) {
  if (!cmd)
    cmd = "update";
  form.cmd.value = cmd;
  return true;
}
function del(frm,objClassTitle,_opener) {
  var submitFlag = false;
  if (typeof(frm) == "object" && frm.tagName == "FORM") form = frm;
  else {
    form = (frm == null || document.forms[frm] == null) ? document.forms[document.forms.length - 1] : document.forms[frm];
    submitFlag = true;
  }
	var warning="Вы собираетесь удалить";
	warning +=" объекты "+((objClassTitle!=null && objClassTitle!="")?'класса "'+objClassTitle+'"':"");
	warning +=" !\nВы уверены?";
	if (!confirm(warning)) return getFalse();

    if (form.elements["id"] != null) var elId = form.elements["id"].value;
    else var elId = null;
	if (_opener!=null && typeof(_opener)=="object"){
		if (_opener.delLinksOnDelete) _opener.delLinksOnDelete(_opener, elId);
	}
	else {
	    if (window.opener && !window.opener.closed && window.opener.delLinksOnDelete != null) window.opener.delLinksOnDelete(window, elId);
	}
    if (form.cmd != null) form.cmd.value = "delete";
    if (submitFlag) form.submit();
    else return true;
}


function onPerformUnload(win, func) {
  var root = win.addEventListener || win.attachEvent ? win : win.document.addEventListener ? win.document : null;
  if (root) {
    if (root.addEventListener) root.addEventListener("unload", func, false);
    else if (root.attachEvent) root.attachEvent("onunload", func);
  }
}

function newGrp(curTag, grp, field) {
  closeWinFlag = false;
  window.onunload = null;
  if (field == null || isNaN(field))  field = "agrp";
  var form = getForm(curTag);
//  var form = document.forms["formMain"];
  if (form.cmd) form.cmd.value = "prepare";
  if (form[field] != null) {
    form[field].value = grp;
    var isFormValid = true;
    if (form.onsubmit != null) {
      isFormValid = form.onsubmit();
    }
    if (isFormValid) {
      form.submit();
    }
  }
  return true;
}
var lastGroup;
var lastParentID;
var lastSubGroupKeys = new Array();
var lastSubGroupValues = new Array();

function showGrp(curTag, grpID, defaultGrpID, hideChilds, parentID, skipResize) {
  if (!document.getElementById(grpID)) return;
  closeWinFlag = false;
  if (lastGroup == null) {
    lastGroup = defaultGrpID;
  }
  if (grpID == lastGroup) return;

  if (parentID != null) {
    lastParentID = parentID;
  }
  if (document.getElementById(lastGroup)) {
    document.getElementById(lastGroup).style.display = 'none';
    var tdToHide = document.getElementById("td" + lastGroup);
    if (tdToHide.className == "tabA") {
      tdToHide.className = "tabP";
    } else {
      if (tdToHide.className == "tabALeft") {
        tdToHide.className = "tabPLeft";
      }
    }
  }
document.getElementById(grpID).style.display = '';
  if (curTag.className == 'tabP') {
    curTag.className = 'tabA';
  } else {
    if (curTag.className == 'tabPLeft') {
      curTag.className = 'tabALeft';
    }
  }
  if (hideChilds) {
    if (lastParentID == null) {
      hideChildGroups(lastGroup);
    } else {
      hideChildGroups(lastParentID);
    }
    showChildGroups(grpID);
    var agrp = document.getElementById("agrp");
    var agrpChld = document.getElementById("agrpChld");
    if (agrp) {
      agrp.value = grpID;
      agrpChld.value = '';
    }
  } else {
    var agrp = document.getElementById("agrpChld");
    if (agrp) {
      agrp.value = grpID;
    }
  }
  lastGroup = grpID;
  if (!skipResize) {
		try {
			resize();
		} catch (e) {}
  }
}

function hideChildGroups(parentId) {
  var topTable = document.getElementById("topButtonsTable");
  if (topTable != null) {
    var tds = topTable.getElementsByTagName("td");
    if (tds != null) {
      for (i = 0; i < tds.length; i++) {
        var tdName = tds[i].getAttribute("name");
        if (tdName != null && tdName.indexOf("childTdWithParentId") > -1) {
          tds[i].style.display = 'none';
        }
      }
    }
  }
  var leftTable = document.getElementById("leftButtonsTable");
  if (leftTable != null) {
    var trs = leftTable.getElementsByTagName("tr");
    if (trs != null) {
      for (i = 0; i < trs.length; i++) {
        var trName = trs[i].getAttribute("name");
        if (trName != null && trName.indexOf("childTrWithParentId") > -1) {
          trs[i].style.display = 'none';
        }
      }
    }
  }
}


function changeActiveSubGroup(groupId) {
  var scroTop = window.document.body.scrollTop;
  var subGroup = document.getElementById(groupId);
  if (subGroup != null) {
    parentId = subGroup.getAttribute("parentGroupId")
    count = 0;
    flag = false;
    while (count < lastSubGroupKeys.length && !flag) {
      if (lastSubGroupKeys[count] == parentId)
        flag = true;
      else
        count++;
    }
    oldGroupId = lastSubGroupValues[count];
    var oldGroupElem = document.getElementById(oldGroupId);
    if (oldGroupElem != null) {
      oldGroupElem.style.display = 'none';
      var tabButton = document.getElementById('td' + oldGroupId);
      if (tabButton != null)
        tabButton.className = "tabP";
    }

    var tabButton = document.getElementById('td' + groupId);
    if (tabButton != null)
      tabButton.className = "tabA"
    subGroup.style.display = '';
    lastSubGroupValues[count] = groupId;
    var selectSubGroup = document.getElementById('selectSubGroup');
    if (selectSubGroup != null)
      selectSubGroup.value = lastSubGroupValues.toString();
    var selectSubGroupParent = document.getElementById('selectSubGroupParent');
    if (selectSubGroupParent != null)
      selectSubGroupParent.value = lastSubGroupKeys.toString();
  }
  window.document.body.scrollTop = scroTop;

}

function showChildGroups(parentId) {
  var topTable = document.getElementById("topButtonsTable");
  if (topTable != null) {
    var tds = topTable.getElementsByTagName("td");
    if (tds != null) {
      for (i = 0; i < tds.length; i++) {
        var tdName = tds[i].getAttribute("name");
        if (tdName != null && tdName == "childTdWithParentId" + parentId) {
          tds[i].style.display = '';
        }
      }
    }
  }
  var leftTable = document.getElementById("leftButtonsTable");
  if (leftTable != null) {
    var trs = leftTable.getElementsByTagName("tr");
    if (trs != null) {
      for (i = 0; i < trs.length; i++) {
        var trName = trs[i].getAttribute("name");
        if (trName != null && trName == "childTrWithParentId" + parentId) {
          trs[i].style.display = '';
        }
      }
    }
  }
}


// set the values for checkboxes (for checkboxes list)
function setCheckBoxListValue(attrName)
{    // alert(attrName);
  var Hid = document.getElementById("id_" + attrName);
  // куда писать
  var idAll = document.getElementById("idAll_" + attrName);
  // all Id
  var ar = idAll.value.split(",");
  Hid.value = "";
  for (i = 0; i < ar.length; i++)
  {
    if (ar[i].length != 0)
    { // alert(ar[i]);
      var CheckField = document.getElementById("check_" + attrName + "_" + ar[i]);
      // alert(CheckField.checked);
      if (CheckField.checked)
      {
        Hid.value = Hid.value + "," + ar[i];
      }
    }
  }
}

// set the choosen checkboxes on (for checkboxes list)
//устанавливает флажки для выбранных чекбоксов для списка чекбоксов
function setCheckedBoxList(attrName) {
  var Hid = document.getElementById("id_" + attrName);
  // откуда брать текущие значения
  var ar = Hid.value.split(",");
  for (i = 0; i < ar.length; i++)
  {
    if (ar[i].length != 0)
    { // alert(ar[i]);
      var CheckField = document.getElementById("check_" + attrName + "_" + ar[i]);
      // alert(CheckField.checked);
      CheckField.checked = true;
    }
  }
}


/* ------------------------------ Sorting -------------------------------- */
var smon = new Array("январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь");
var img_dir = baseUrl + "admin/images/";
// folder with images
var sort_case_sensitive = false;
// sort type (case sensitive or no)

// set the algoritm of sorting
function _sort(a, b) {
  var a = a[0];
  var b = b[0];
  if (a.match("^[0-9]{1,2}.[0-9]{2}.[0-9]{4}")) return sort_dates(a, b);
  if (contains(smon, a.toLowerCase())) return sort_months(a, b);
  if (Number(a) && Number(b)) return sort_numbers(a, b);
  else if (!sort_case_sensitive) return sort_insensitive(a, b);
  else return sort_sensitive(a, b);
}
function sort_months(a, b) {
  var m1 = contains(smon, a.toLowerCase(), true);
  var m2 = contains(smon, b.toLowerCase(), true);
  if (m1 == -1 && m2 == -1) return 0;
  else if (m1 == -1) return -1;
  else if (m2 == -1) return 1;
  else {
    if (m1 > m2) return 1;
    if (m1 < m2) return -1;
    return 0;
  }
}
//Убогий метод кастануть строку в дату
//todo: Переписать метод или использовать стандартные средства
//todo: Обрати внимание на затраеный эксепшен))
function getOurDate(str) {
  if (str == null) return null;
  if (str.length > 9 && str.match("^[0-9]{1,2}.[0-9]{2}.[0-9]{4}")) {
    try {
      var days = str.substring(0, 2);
      var months = str.substring(3, 5) - 1;
      var years = str.substring(6, 10);
      var hours = 0;
      var minutes = 0;
      var seconds = 0;
      if (str.match("[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$")) {
        //   if (str.length > 17 && str.indexOf(":") == 13 && str.lastIndexOf(":") == 16) {
        hours = str.substring(11, 13);
        minutes = str.substring(14, 16);
        seconds = str.substring(17, str.length);
      }
      var d = new Date(years, months, days, hours, minutes, seconds);
      return (isNaN(d)) ? null : d;
    } catch (e) {
      return null;
    }

  }
  return null;
}

function sort_dates(a, b) {
  //Сортируем 2 даты.
  //Применяем наш убогий способ кастануть строку в дату
  var newa = getOurDate(a);
  var newb = getOurDate(b);
  if (newa == null || newb == null) {
    if (newb != null) {
      return -1;
    } else if (newa != null) {
      return 1;
    } else return 0;
  }
  if (newa.getTime() > newb.getTime())
    return 1;
  if (newa.getTime() < newb.getTime())
    return -1;
  return 0;
}

// set the number sort algoritm
function sort_numbers(a, b) {
  return a - b;
}

// set not case sensitive alroritm
function sort_insensitive(a, b) {
  var anew = a.toLowerCase();
  var bnew = b.toLowerCase();
  if (anew < bnew) return -1;
  if (anew > bnew) return 1;
  return 0;
}

// set case sensitive alroritm
function sort_sensitive(a, b) {
  if (a < b) return -1;
  if (a > b) return 1;
  return 0;
}

// get text from child nodes
function getConcatenedTextContent(node) {
  var _result = "";
  if (node == null) {
    return _result;
  }
  var childrens = node.childNodes;
  var i = 0;
  while (i < childrens.length) {
    var child = childrens.item(i);
    switch (child.nodeType) {
      case 1: // ELEMENT_NODE
      case 5: // ENTITY_REFERENCE_NODE
        _result += getConcatenedTextContent(child);
        break;
      case 3: // TEXT_NODE
      case 2: // ATTRIBUTE_NODE
      case 4: // CDATA_SECTION_NODE
        _result += child.nodeValue;
        break;
      case 6: // ENTITY_NODE
      case 7: // PROCESSING_INSTRUCTION_NODE
      case 8: // COMMENT_NODE
      case 9: // DOCUMENT_NODE
      case 10: // DOCUMENT_TYPE_NODE
      case 11: // DOCUMENT_FRAGMENT_NODE
      case 12: // NOTATION_NODE
      // skip
        break;
    }
    i++;
  }
  return _result;
}

// main script
function sort(e) {
  var e = window.event ? window.event : e;
  var el = window.event ? e.srcElement : e.currentTarget;
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
  if (el.tagName == "IMG") el = el.parentNode;
  var a = new Array();
  var name = el.lastChild.nodeValue;
  var dad = el.parentNode;
  var table = dad.parentNode.parentNode;
  var up = table.up;
  var node, arrow, curcol;
  for (var i = 0; (node = dad.getElementsByTagName("th").item(i)); i++) {
    if (node.lastChild.nodeValue == name) {
      curcol = i;
      if (node.className == "curcol") {

        //arrow = node.firstChild;
        arrow = node.firstChild;

        table.up = Number(!up);

        //arrow.src = img_dir + table.up + ".gif";
        arrow.src = img_dir + table.up + ".gif";
      } else {
        node.className = "curcol";
        //arrow = node.insertBefore(document.createElement("img"),node.firstChild);
        arrow = node.insertBefore(document.createElement("img"), node.firstChild);

        table.up = 0;

        //arrow.src = img_dir + Number(table.up) + ".gif";
        arrow.src = img_dir + Number(table.up) + ".gif";
      }
    } else {
      if (node.className == "curcol") {
        node.className = "";

        //if (node.firstChild) node.removeChild(node.firstChild);
        if (node.firstChild) node.removeChild(node.firstChild);
      }
    }
  }

  var tbody = table.getElementsByTagName("tbody").item(0);
  for (var i = 0; (node = tbody.getElementsByTagName("tr").item(i)); i++) {
    a[i] = new Array();
    a[i][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(curcol));
    a[i][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));
    a[i][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0));
    a[i][3] = node;
  }
  a.sort(_sort);
  if (table.up) a.reverse();
  for (var i = 0; i < a.length; i++) {
    tbody.appendChild(a[i][3]);
  }
  var Hid = document.getElementById("id_" + tbody.parentNode.getAttribute("attrName"));
  gridToHidden(Hid, tbody);
}

// init of all process
function init(e) {
  if (!document.getElementsByTagName) return;
  for (var j = 0; (thead = document.getElementsByTagName("thead").item(j)); j++) {
    var node;
    for (var i = 0; (node = thead.getElementsByTagName("th").item(i)); i++) {
      if (node.addEventListener) node.addEventListener("click", sort, false);
      else if (node.attachEvent) node.attachEvent("onclick", sort);
      node.title = "Click to title to sort col.";
      // set alt for header
    }
    thead.parentNode.up = 0;
  }
}

// start init() on load
if (root) {
  if (root.addEventListener) root.addEventListener("load", init, false);
  else if (root.attachEvent) root.attachEvent("onload", init);
}

/*--------------------------/---------end of sorting --------------------------------------*/

/*------------------------------------ grid filters --------------------------------------*/
function showHideFilterRow(attrName) {
	if (attrName==null) return;
	var filterRow=document.getElementById("filterRow_"+attrName);
	if (filterRow==null) return;
	if (filterRow.style.display=="none") filterRow.style.display="";
	else filterRow.style.display="none";
}

function initGridFilters(rowName,len) {
	var _columnFilterArray = eval("_columnFilterArray_"+rowName); 
	if (_columnFilterArray==null) return;
	var tr=$("filterRow_"+rowName);
	if (tr==null) return;
	var tds=tr.getElementsByTagName("TD");
	var fSel=null;
	for (var i=1;i<=len ; i++) {
		var arr= _columnFilterArray[(i-1)];
		if (typeof(arr)!="object" || arr==-1) continue;
		if (arr.length==0) continue;
		var _fSel=tds[i].getElementsByTagName("SELECT");
		if (_fSel==null) continue;
		else fSel=_fSel[0];
		if (arr.length>0){
	//		alert(i+") "+fSel.name+"\nlen="+arr.length+"\n"+arr);
			for (var j=0;j<arr.length;j++ ) {
				var txt = val = "";
				if (arr[j]=="" || arr[j]=="&nbsp;") {
					txt="- пусто -";
					val="empty";
				}
				else {
					txt=arr[j];
				}
				addOption(fSel,val,txt,null,true);
			}
			fSel.style.display="";
		}
	}
}

function applyGridFilter(sel,colNum) {
	if (sel==null || sel.tagName.toUpperCase() !="SELECT") return;
	if (colNum==null) return;
	var table=sel.offsetParent.parentNode.parentNode.parentNode;
	if (table==null) return;
	var trs=table.getElementsByTagName("tbody")[0].getElementsByTagName("tr");
	if (trs==null || trs.length==0) return;
	
	var showAll=(sel.options[sel.selectedIndex].value=="all");
	var pattern=sel.options[sel.selectedIndex].text;
	var isEmpty = (sel.options[sel.selectedIndex].value=="empty");

	for (var i=0;i<trs.length ;i++ ) {
		var tr=trs[i];
		if (showAll) {
			tr.style.display="";
			continue;
		}
		
		var tds=tr.getElementsByTagName("td");
		if (tds==null || typeof(tds[colNum])=="undefined") continue;
		var td=tds[colNum];
//		alert(pattern+"\n|"+td.innerHTML+"|");
		if (isEmpty) {
			if (!emptyTagInnerHTML(td)) tr.style.display="none";
			else tr.style.display="";
		}
		else {
			if (td.innerHTML.indexOf(pattern)==-1) tr.style.display="none";
			else tr.style.display="";
		}
	}

}

/*--------------------------/---------end of grid filters --------------------------------------*/



/*------------------------------------ edit/create grid rows --------------------------------------*/
var currentManagedGrid="";
var currentGridObjPrefix="";
var currentGridObjEditPage="";
var commonCreateObjAttrs=null;

	function doCreateGridRow(attrName, id, refClass, refAttr, createPage, ds, updFunc, refLink, addParams, popupCreatePage, editPage) {
		var dsStr = "";
		if (ds && ds != "null") {
			dsStr = "&ds=" + ds;
		}
		var linkStr = "";
		if (refLink) linkStr = "&link=" + refLink;
		if (!addParams) addParams = "";

		var iframe=document.getElementById("gridTempleFrame_"+attrName);
		if (!iframe) return;
		currentManagedGrid=attrName;
		currentGridObjPrefix="";
		currentGridObjEditPage=(editPage!=null)?editPage:"";
		iframe.setAttribute("currentObj",refAttr);
		iframe.src=baseUrl + createPage + '.htm?id=' + id + '&cls=' + refClass + '&ra=' + refAttr + dsStr + linkStr + addParams;

		commonCreateObjAttrs=new Array(attrName,id,refClass,refAttr, popupCreatePage, ds, updFunc, refLink, addParams);
	}

	function doEditGridRow(name, newPage, prefix, editPage, addParams) {
		if (prefix=="" || prefix==null) prefix="title";
		var el = document.getElementById(prefix+"_"+name);
		if (!el)return;
		var link = el.value;
		if (link.length == 0) return false;
		var iframe=document.getElementById("gridTempleFrame_"+name);
		if (!iframe) return;
		currentManagedGrid=name;
		currentGridObjPrefix=prefix;
		currentGridObjEditPage=(editPage!=null)?editPage:"";
		iframe.setAttribute("currentObj",link);
		if (!addParams) addParams = "";
		iframe.src=baseUrl + newPage + '.htm?id=' + link+ addParams;
	}

	function countTRCells(tr, returnArray) {
		if (tr==null) return (!returnArray)?0:null;
		var amount=0;
		var cellsArray= new Array();
		for (var i = 0; i < tr.childNodes.length; i++) {
			var cell=tr.childNodes[i];
			if (cell.nodeType!=1) continue;
			if (cell.tagName.toLowerCase()=="td" || cell.tagName.toLowerCase()=="th") {
				amount++;
				cellsArray[cellsArray.length]=cell;
			}
		}
		return (!returnArray)?amount:cellsArray;
	}

	function copyTRCells(tr1,tr2,create,showResults,createdObjId) {
		if (tr1 == null || tr2==null) return false;
	//		alert(tr1.outerHTML+"\n=======================================================\n"+tr2.outerHTML);
		var cellsArray=countTRCells(tr1,true);
		if (!create){
			var cellsArray2=countTRCells(tr2,true);
			if (cellsArray.length!=cellsArray2.length) return false;
		}
		for (var x = 0; x < cellsArray.length; x++) {
			var cell=cellsArray[x];
			if (create) {
				if (cell.tagName.toLowerCase()=="th") {
					var newCell = document.createElement("th");
				}
				else {
					var newCell = document.createElement("td");
				}
				var attrArray=cell.attributes;
				for(var y=0; y<attrArray.length;y++) {
					var attr=attrArray[y];
					if (attr.specified) {
						switch (attr.nodeName.toLowerCase()) {
							case "class":newCell.className=attr.nodeValue; break;
							case "onblur": newCell.onblur=new Function(attr.nodeValue);break;
							case "onchange":newCell.onchange=new Function(attr.nodeValue);break;
							case "onkeypress":newCell.onkeypress=new Function(attr.nodeValue);break;
							case "onkeydown":newCell.onkeydown=new Function(attr.nodeValue);break;
							case "onkeyup":newCell.onkeyup=new Function(attr.nodeValue);break;
							case "onclick":newCell.onclick=new Function(attr.nodeValue);break;

							default: newCell.setAttribute(attr.nodeName,attr.nodeValue);
						}
					}
				}
			}
			else {
				var newCell=cellsArray2[x];
			}

			if (showResults && x==0) {
				if (create) {
					if (currentManagedGrid!="" && currentGridObjEditPage!="" && createdObjId!=null && createdObjId!="") {
						newCell.innerHTML='<button tabindex="-1" class="lnk" onClick="canselGridRowEdit();gridSelect(null,null, \''+currentManagedGrid+'\', \''+createdObjId+'\', \'silver\',\'gridRow\');viewObj(\'title_'+currentManagedGrid+'\', \''+currentGridObjEditPage+'\',null,null);return getFalse(event);" ><img src="admin/images/arrow_blue_gr.gif" class="icon"/></button>';
					}
					else {
						newCell.innerHTML="&nbsp;";
					}
				}
			}
			else { newCell.innerHTML=cell.innerHTML; }

	//		alert(cell.innerHTML+"\n=======================================================\n"+newCell.innerHTML);
			
			if (create) {
				 tr2.appendChild(newCell);
			}
		}
	
		if (tr1.addEventListener && !showResults) { // Для мозилы переносим значения полей формы из ифрейма ..... (при переносе через innerHTML значения полей теряются под Мозиллой)
			var f1=getForm(tr1);
			var f2=getForm(tr2);
			for (var i=0; i < f1.elements.length; i++ ) {
				var el= f1.elements[i];
				if (f2.elements[el.name]!=null && typeof(f2.elements[el.name])!="undefined" && f2.elements[el.name].type==el.type) {
//					alert(el.name+"->"+el2.name);
					var el2=f2.elements[el.name];
					switch(el.type) {
						case "text": 
						case "textarea": el2.value=el.value; break;
						case "CHECKBOX":
						case "RADIO":
							if (el.checked) {
								el2.checked=true;
							}
							break;

						case "select-one":el2.selectedIndex=el.selectedIndex; break;
						case "select-multiple":
							for (var j = 0; j < el.options.length; j++) {
								if (el.options[j].selected) {
									if (el2.options[j]!=null && typeof(el2.options[j])!="undefined") {
										el2.options[j].selected=true;
									}
								}
							}
							break;
					}
				}
				
			}
		}
		return true;
	}

	function gridrowErrorHandler(errCode) {
		switch(errCode) {
			case 1: alert("Не указан Id строки с формой редактирования в IFRAME");break;
			case 2: alert("Не удалось получить кодовое имя аттрибута с гридовым представлением");break;
			case 3: alert("Не удается получить объект iframe");break;
			case 4: alert("Не удается получить ID редактируемого объекта - строки в гридовой таблице");break;
			case 5: alert("Не удается найти объект гридовой таблицы! Искомое кодовое имя грида должно быть:"+currentManagedGrid);break;
			case 6: alert("Не удается получить объект(TR) строки гридовой таблицы с указанным ID!");break;
			case 7: alert("Не удается получить объект(TR) из IFRAME !");break;
			case 8: alert("Количество ячеек таблицы не совпадает!");break;
			case 9: alert("Не удалось скопировать строку с формой редактирования!");break;
		}
		var iframe= document.getElementById("gridTempleFrame_"+currentManagedGrid);
		if (iframe) iframe.src="about:blank";
	}

	function doCommonModify(doCreate,showAlert) {
		if (showAlert) gridrowErrorHandler(8);
		if (doCreate) {
			if (commonCreateObjAttrs!=null ) {
				createObj( 
					((typeof(commonCreateObjAttrs[0])!="undefined")? commonCreateObjAttrs[0]:null),
					((typeof(commonCreateObjAttrs[1])!="undefined")? commonCreateObjAttrs[1]:null),
					((typeof(commonCreateObjAttrs[2])!="undefined")? commonCreateObjAttrs[2]:null),
					((typeof(commonCreateObjAttrs[3])!="undefined")? commonCreateObjAttrs[3]:null),
					((typeof(commonCreateObjAttrs[4])!="undefined")? commonCreateObjAttrs[4]:null),
					((typeof(commonCreateObjAttrs[5])!="undefined")? commonCreateObjAttrs[5]:null),
					((typeof(commonCreateObjAttrs[6])!="undefined")? commonCreateObjAttrs[6]:null),
					((typeof(commonCreateObjAttrs[7])!="undefined")? commonCreateObjAttrs[7]:null),
					((typeof(commonCreateObjAttrs[8])!="undefined")? commonCreateObjAttrs[8]:null)
				);
			}
		}
		else {
			if (currentGridObjPrefix!="" && currentGridObjEditPage!="" ) {
				viewObj(currentGridObjPrefix+"_"+currentManagedGrid, currentGridObjEditPage);
			}
		}
		return false;
	}

	function manageGridRowModifying(formHolder,showResults,doCreate,createdObjId) {
		if (formHolder==null) {
			gridrowErrorHandler(1);
			return false;
		}
		if (currentManagedGrid=="") {
			gridrowErrorHandler(2);
			return false;
		}
		var iframe= document.getElementById("gridTempleFrame_"+currentManagedGrid);
		var iframeDoc=(iframe.Document)?iframe.Document:iframe.contentDocument;
		if (iframe==null || iframeDoc==null) {
			gridrowErrorHandler(3);
			return false;
		}
		var gridTable_arr=getObjectByAttr(self.document, "table", "attrName", currentManagedGrid, 1);
		var gridTable=gridTable_arr[0];
		if (gridTable==null) {
			gridrowErrorHandler(5);
			return false;
		}

		if (doCreate) {
			var tr_arr=gridTable.getElementsByTagName("thead")[0].getElementsByTagName("tr");
		}
		else {
			var currentObjID=iframe.getAttribute("currentObj");
			if (currentObjID==null) {
				gridrowErrorHandler(4);
				return false;
			}
			var tr_arr=getObjectByAttr(gridTable, "tr", "objId", currentObjID, 1);
		}
		var tr=tr_arr[0];
		if (tr==null) {
			gridrowErrorHandler(6);
			return false;
		}
		var trCols = countTRCells(tr);

		var fh_tr=iframeDoc.getElementById(formHolder);
		if (fh_tr==null) {
			gridrowErrorHandler(7);
			return false;
		}
		var fh_trCols = countTRCells(fh_tr);

		if (fh_trCols>trCols) {
			gridrowErrorHandler(8);
			if (!showResults) doCommonModify(doCreate);
			else {
				canselGridRowEdit();
			}
			return false;
		}

		if (doCreate ) {
			var trElem = gridTable.insertRow(2); // first two rows reserved in thead
			trElem.className = "gridRow";
			if (!showResults) {
				trElem.setAttribute("formHolder",formHolder);
				trElem.setAttribute("weCreateThisRow",true);
				trElem.setAttribute("id","currentEditedRow");
				trElem.setAttribute("objId", currentManagedGrid);
			}
			else {
				var delTR=document.getElementById("currentEditedRow");
				gridTable.deleteRow(delTR.rowIndex);
				if(createdObjId!=null) {
					trElem.setAttribute("id","grid_"+currentManagedGrid+createdObjId);
					trElem.setAttribute("objId", createdObjId);
					trElem.onclick= new Function('canselGridRowEdit();gridSelect(null,null,"'+currentManagedGrid+'","'+createdObjId+'","silver","gridRow")');
				}
				trElem.ondblclick= new Function('doEditGridRow("'+currentManagedGrid+'","admin/gridrowedit","'+currentGridObjPrefix+'", "'+currentGridObjEditPage+'");');
				clear_GridErrorDisplayContainer();
			}
			var copyResult=copyTRCells(fh_tr,trElem,true,showResults,createdObjId);
		}
		else {
		//	var tbody=tr.parentNode;
			if (!showResults) {
				var trElem = document.createElement("tr");
				var trElem = gridTable.insertRow(tr.rowIndex+1); 
				trElem.className = "gridRow";
				trElem.setAttribute("objId", currentManagedGrid);
				trElem.setAttribute("formHolder",formHolder);
				trElem.setAttribute("id","currentEditedRow");
			//	tbody.appendChild(trElem);
				var copyResult=copyTRCells(fh_tr,trElem,true);
			}
			else {
				var delTR=document.getElementById("currentEditedRow");
				if (delTR) gridTable.deleteRow(delTR.rowIndex);
			//	if (delTR && delTR.parentNode==tbody) tbody.removeChild(delTR); 
				var copyResult=copyTRCells(fh_tr,tr,null,showResults);
				clear_GridErrorDisplayContainer();
			}
		}

		if (!copyResult) {
			gridrowErrorHandler(9);
		}
		
		if (copyResult && showResults){
			if (iframe) iframe.src="about:blank";
		}
		
		if (!showResults ) {
			if (!doCreate) tr.style.display="none";
			disableGridManageButtons(currentManagedGrid,true);
		}
		else {
			if (!doCreate) {
				if (tr.onclick) tr.onclick();
				tr.style.display="";
			}
			disableGridManageButtons(currentManagedGrid,false);
		}

		return true;
	}

	function prepareSubmitGridRowChanges(obj) {
		if (obj==null) return;
		var row=obj.parentNode.parentNode;
		var doCreate=row.getAttribute("weCreateThisRow");
		var formHolder=row.getAttribute("formHolder");
		if (formHolder==null) {
			gridrowErrorHandler(1);
			return;
		}
		var iframe= document.getElementById("gridTempleFrame_"+currentManagedGrid);
		var iframeDoc=(iframe.Document)?iframe.Document:iframe.contentDocument;
		if (iframe==null || iframeDoc==null) {
			gridrowErrorHandler(3);
			return;
		}
		var fh_tr=iframeDoc.getElementById(formHolder);
		if (fh_tr==null) {
			gridrowErrorHandler(7);
			return;
		}
		var copyResult=copyTRCells(row,fh_tr);
		if (!copyResult) {
			gridrowErrorHandler(9);
			return;
		}

		var fh_form =iframeDoc.forms[0];
		if (fh_form==null) {alert ("IFRAME Form Not Found"); return;}
		fh_form["modified"].value="true";
		fh_form["cmd"].value=(doCreate)?"create":"update";
		var canSubmit= fh_form.onsubmit();
		if (canSubmit) {
			fh_form.submit();
		}
	}

	function canselGridRowEdit(obj) {
		clear_GridErrorDisplayContainer();
		var tr=null;
		if (obj==null || obj.nodeType!=1) {
			tr=document.getElementById("currentEditedRow");
			if (tr==null) return;
		}
		else {
			tr=(obj.tagName.toLowerCase()=="tr")?obj:obj.parentNode.parentNode;
		}
		var trParent=tr.parentNode;
		var doCreate=tr.getAttribute("weCreateThisRow");

		if (!doCreate) {
			var previousTR=getPrevSiblingTag(tr);
			if (previousTR!=null) {
				previousTR.style.display="";
			}
		}

		trParent.removeChild(tr);

		var iframe= document.getElementById("gridTempleFrame_"+currentManagedGrid);
		if (iframe) iframe.src="about:blank";

		disableGridManageButtons(currentManagedGrid,false);
	}
	
	function disableGridManageButtons(name, mode) {
		var span=document.getElementById("buttons_"+name);
		if (span==null) return;
		var buttons=span.getElementsByTagName("button");
		for (var i=0; i<buttons.length ;i++ ) {
			var b=buttons[i];
			if (mode){
				b.setAttribute("disabled",true);
			}
			else {
				b.removeAttribute("disabled");
			}
		}
	}
		
	function clear_GridErrorDisplayContainer(mode) {
		var p=(mode)?self.parent:self;
		var errMessHolder=p.document.getElementById("show_Create_Edit_Error_"+currentManagedGrid);
		if (errMessHolder){
			errMessHolder.innerHTML = "";
			errMessHolder.style.display="none";
		}
	}
/*--------------------------/---------end of edit/create grid rows --------------------------------------*/



/* ----------------------------------HANDLE HOT BUTTONS---------------------------------------------------  */
var keyCode_1,keyCode_2,keyCode_3,keyCode_4,whatevent;

function keyDown(e) {
  var el = window.event ? window.event.srcElement : e.currentTarget;
  var keyEvent = window.event ? window.event : e;
  //	alert(keyEvent.keyCode);

  if (keyEvent.keyCode == 116) {
    refreshbuttonsPressed = true;
    closebuttonsPressed = false;
  }

  if (keyEvent.ctrlKey) {
    keyCode_1 = "Ctr";
    keyCode_4 = keyEvent.keyCode
    if (keyEvent.keyCode == 82) {
      refreshbuttonsPressed = true;
      closebuttonsPressed = false;
    }
    if (keyEvent.keyCode == 87) {
      refreshbuttonsPressed = false;
      closebuttonsPressed = true;
    }
  }
  if (keyEvent.altKey) {
    keyCode_2 = "Alt";
    keyCode_4 = keyEvent.keyCode
    if (keyEvent.keyCode == 115) {
      refreshbuttonsPressed = false;
      closebuttonsPressed = true;
    }
  }
  if (keyEvent.shiftKey) {
    keyCode_3 = "Shift";
    keyCode_4 = keyEvent.keyCode
  }
  keyCode_4 = keyEvent.keyCode;

  var obj;
  var button;
  var keyCodeArray = new Array(38, 40, 65, 67, 68, 69);
  // alt + "A" - add | alt + "С" - choose |  alt +  "D" - delete | alt + "E" - edit
  if (keyCode_2 != null && contains(keyCodeArray, keyCode_4)) {
    if ((obj = getCursorTag(el)) == null) getFalse(keyEvent);
    var action = "";
    switch (keyCode_4) {
      case 38: action = "Вверх"; break;
      case 40: action = "Вниз"; break;
      case 65: action = "Создать"; break;
      case 67: action = "Выбрать"; break;
      case 68: action = "Удалить"; break;
      case 69: action = "Редактировать"; break;
    }
    if ((button = getButton(obj, action)) == null) return getFalse(keyEvent);
    button.click();
  }
  // "escape" - close window
  if (keyCode_4 == 27) {
    refreshbuttonsPressed = false;
    closebuttonsPressed = true;
    var wo = self.opener;
    if (wo && !wo.closed && wo.hideShadowForAll) wo.hideShadowForAll();
    self.close();
  }
  // Ctrl+"S" - save(submit) form
  if (keyCode_1 != null && keyCode_4 == 83) {
    var buton = null;
    for (var j = 0; (buton = document.getElementsByTagName("input")[j]); j++) {
      if (buton.getAttribute("type") != "submit") continue;
      if (buton.getAttribute("value").toLowerCase() != "сохранить") continue;
      break;
    }
    if (buton != null) buton.click();
  }
  if (refreshbuttonsPressed && useModalWindows) return getFalse(keyEvent);
}

function keyUp() {
  keyCode_1 = null;
  keyCode_2 = null;
  keyCode_3 = null;
  keyCode_4 = null;
}

if (root) {
  if (root.addEventListener) {
    root.addEventListener("keydown", keyDown, false);
    root.addEventListener("keyup", keyUp, false);
  }
  else if (root.attachEvent) {
    root.attachEvent("onkeydown", keyDown);
    root.attachEvent("onkeyup", keyUp);
  }
}

//window.document.onkeydown = keyDown;
//window.document.onkeyup = keyUp;

// check the tag where the cursor is placed
function getCursorTag(obj) {
  if (obj == null || (obj != null && obj.nodeType != 1)) return null;
  switch (obj.tagName) {
    case "INPUT":            if (obj.type != "text") return null;
      break;
    case "TEXTAREA":    break;
    case "SELECT":        break;
    default: return null;
  }
  var s = "";
  var bSpanName = ((s = obj.getAttribute("id")) == null) ? "" : (s.indexOf("_") == -1) ? "" : s.substring(s.indexOf("_") + 1, s.length);
  var o = document.getElementById("buttons_" + bSpanName);
  return o;
}

//search for the button
function getButton(obj, title) {
  var node;
  var buton = null;
  if (obj == null) return null;
  for (var j = 0; (node = obj.getElementsByTagName("button")[j]); j++) {
    if (node.getAttribute("title") != title) continue;
    buton = node;
    break;
  }
  return buton;
}

/*----------------------------------------------------------------------------------*/

// Set the defaul icon 
function setIconAttrDefValue(attrName, defValue) {
  var inputTags = document.getElementsByTagName("input");
  var tagName = "data(" + attrName + ")";
  if (inputTags) {
    for (var i = 0; i < inputTags.length; i++) {
      if (inputTags[i].type == "radio" && inputTags[i].name == tagName) {
        inputTags[i].checked = false;
      }
    }
  }
  if (defValue != null && defValue > 0) {
    var tag = document.getElementById(attrName + "_" + defValue);
    if (tag) {
      tag.checked = true;
    }
  }
}

var lastExpandGridTag=null;
var lastExpandGridButton=null;
function makeExpandGridParam(tag,name, value) {
	this.tag = tag;
	this.name = name;
	this.value = value;
}
var lastExpandGridParams=new Array();
function expandGrid(divID,button) {
	var div= $(divID);
	if (div==null) return;
	var gridID=div.getAttribute("gridBodyTag");
	var gridDiv=$(gridID);
	if (gridDiv==null) return;
	var expandText="Развернуть на весь экран";
	var collapseText="Свернуть в стандартный размер";

	if (lastExpandGridTag != null) {
		lastExpandGridTag.className="normalGrid";
		if (lastExpandGridParams.length>0) {
			for (var i in lastExpandGridParams) { 
				if (isNaN(parseInt(i))) {continue;}
				else {
					var obj=lastExpandGridParams[i].tag;
					eval("obj.style."+lastExpandGridParams[i].name+"='"+lastExpandGridParams[i].value+"'");
				}
			}
		}
		if (lastExpandGridButton!=null) lastExpandGridButton.setAttribute("title",expandText);
	}

	lastExpandGridParams.length=0;
	if (lastExpandGridTag==div) {
		lastExpandGridTag=null;
		lastExpandGridButton=null;
		if (window.removeEventListener) {
			window.removeEventListener("resize",resizeExpandedGrid, false)
		}
		else {
			window.detachEvent("onresize",resizeExpandedGrid);
		}	
		return;
	}
	lastExpandGridTag=div;
	lastExpandGridParams[lastExpandGridParams.length]=new makeExpandGridParam(div,"width",div.style.width);
	lastExpandGridParams[lastExpandGridParams.length]=new makeExpandGridParam(div,"height",div.style.height);
	lastExpandGridParams[lastExpandGridParams.length]=new makeExpandGridParam(gridDiv,"width",gridDiv.style.width);
	lastExpandGridParams[lastExpandGridParams.length]=new makeExpandGridParam(gridDiv,"height",gridDiv.style.height);
	lastExpandGridParams[lastExpandGridParams.length]=new makeExpandGridParam(gridDiv,"zIndex",gridDiv.style.zIndex);

	gridDiv.style.zIndex="1500000";
	div.className="expandGrid";
	resizeExpandedGrid();
	if (button!=null){
		button.setAttribute("title",collapseText);
		lastExpandGridButton=button;
	}

	if (window.addEventListener) {
		window.addEventListener("resize",resizeExpandedGrid, false)
	}
	else {
		window.attachEvent("onresize",resizeExpandedGrid);
	}
}
function resizeExpandedGrid() {
	if (lastExpandGridTag == null) return;
	var gridID=lastExpandGridTag.getAttribute("gridBodyTag");
	var gridDiv=$(gridID);
	if (gridDiv==null) return;

	var _body=window.document.body;

	var isMOZ=(typeof(document.addEventListener)!="undefined")?true:false;
	var WinWidth=_body.clientWidth;
	var WinHeight=_body.clientHeight;
	var ContentWidth=_body.scrollWidth;
	var ContentHeight=_body.scrollHeight;
	var _cWidth=_body.offsetWidth;
	var _cHeight=_body.offsetHeight;

//alert("win -> ( "+WinWidth+" ; "+WinHeight+" )\n\ncontent -> ( "+ContentWidth+" ; "+ContentHeight+" )\n\n___content -> ( "+_cWidth+" ; "+_cHeight+")");

	if (ContentWidth>WinWidth) {
		var showWidth=(isMOZ && _cWidth<ContentWidth)? _cWidth:ContentWidth;
	}
	else {
		var showWidth=WinWidth;
	}
	if (ContentHeight>WinHeight) {
		var showHeight=(isMOZ && _cHeight<ContentHeight)? _cHeight:ContentHeight;
	}
	else {
		var showHeight=WinHeight;
	}

	lastExpandGridTag.style.width=showWidth-2;
	lastExpandGridTag.style.height=showHeight-2;
	gridDiv.style.width=showWidth-40;
	gridDiv.style.height=showHeight-10;

	window.scrollTo(0, 0);
}


/*-----------------------------/------------- functions for edit / create / view object ---------------------------------------------*/


