/*------------------------------------------ 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="";
  }
  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 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 errorSelectDiv = document.getElementById("errorSearchDiv_" + prefix+ attrName);
      if (errorSelectDiv != null) {
        errorSelectDiv.style.margin = selectDiv.style.margin;
      }
		}
		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,skipButtonsDisable) {
  if (form.cmd.value == "delete") {
    if (!skipButtonsDisable) 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  inpObj=inputs.item(i);
      var element = validateElem(inpObj);
      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") {
          element.value=killSpaces(element.value); 
          if (!checknumber(element.value) && !checkinteger(element.value)) {
            alert("Поле " + element.attrTitle + " может содержать только вещественные значения");
            return false;
          }
        } else if (element.attrType == "5") { // date attrtype
				var inpID=inpObj.getAttribute("id");
				if (inpObj.getAttribute("alias") && inpID && (inpID.indexOf("cal_")!=-1)) {
					var attrName=inpID.substring(4);
					if (!compareTwoDates(inpObj, attrName)) return false;
				}
        }
      }
	  if (self.validateFieldByRegExp && inpObj.getAttribute("regexp_rule") && element.attrType != "5") {
		  if (!validateFieldByRegExp(inpObj)) {
			  return false;
		  }
	  }

	  if (self.validateField && inpObj.getAttribute("mask") && element.attrType != "5") {
		  if (validateField(inpObj)==0) {
			  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;
      }
    }
  }
   if (!skipButtonsDisable) 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 onAfterDocumentLoad(func,win) {
	if (typeof("func") != typeof("void")) return;
	var w=(typeof(win)=="object")?win:self;
	var root = w.addEventListener || w.attachEvent ? w : w.document.addEventListener ? w.document : null;
	if (root) {
		if (root.addEventListener) {
			root.addEventListener("onload", func, false);
		} else {
			root.attachEvent("onload", 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) {
	var grp=$(grpID);
	if (!grp) return;
	var skipMovingFlag=(typeof(skip_movingGroups)=="undefined")?false:true;
	closeWinFlag = false;
	var clon=null;
	if (lastGroup == null) {
		lastGroup = defaultGrpID;
	}
	if (grpID == lastGroup) return;
	if (parentID != null) {
		lastParentID = parentID;
	}
	//alert("-- "+lastGroup+" ---"+grpID+"------"+parentID+"----------"+lastParentID);
	var lastGrp=$(lastGroup);
	if (lastGrp) {
		lastGrp.style.display = 'none';
		var tdToHide = $("td" + lastGroup);
		if (tdToHide.className == "tabA") {
			 tdToHide.className = "tabP";
		} else {
			if (tdToHide.className == "tabALeft" || tdToHide.className == "tabAPLeft") {
				clon=$("clon_td"+lastGroup);
				if (clon) clon.className="tabP";
				if (parentID==null) {
					tdToHide.className = "tabPLeft";
					if (clon) clon.style.display="none";
				}
				else tdToHide.className = "tabAPLeft";
			}
		}
	}

	grp.style.display = '';
	if (curTag.className == 'tabP') {
		curTag.className = 'tabA';
	} else {
		if (curTag.className == 'tabPLeft' || curTag.className == "tabAPLeft") {
			curTag.className = (skipMovingFlag)? 'tabALeft' : 'tabAPLeft';
			clon=$("clon_"+curTag.id);
			if (clon) { 
				clon.className="tabA";
				clon.style.display="";
			}
			else {
				if (!skipMovingFlag) moveLeftToTop(curTag);
			}
			if (parentID==null && grpID != lastParentID){
				var _lastParent=(typeof(lastParentID)!="undefined")?$("td"+lastParentID):null;
				if (_lastParent) {
					_lastParent.className="tabPLeft";
					clon=$("clon_"+_lastParent.id);
					if (clon) clon.style.display="none";
				}
			}
		}
	}
	if (hideChilds) {
		if (lastParentID == null) {
			 hideChildGroups(lastGroup);
		} else {
			hideChildGroups(lastParentID);
		}
		showChildGroups(grpID);
		var agrp = $("agrp");
		var agrpChld = $("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 moveLeftToTop(aid) {
	var ag=null;
	var _id="";
	if (typeof(aid)=="object") {
		ag=aid;
		_id=ag.id;
	}
	else {
		_id="td"+aid;
		ag=$(_id);
	}
	var topTable=$("topButtonsTable");
	if (!ag || !topTable) return;
	var cell=null;
	var tr = topTable.getElementsByTagName("tbody")[0].getElementsByTagName("TR")[0];
	if (tr) {
		if (tr.cells[0].style.display=="none" && window.attachEvent) { //заточка для IE, чтобы новые ячейки добавлялись перед скрытыми
			var h=tr.cells[0];
			h.style.display="";
		}
		cell = tr.insertCell(0);
		if (typeof(h)=="object") h.style.display="none";
	}
	if (cell) {
		ag.className="tabAPLeft";
		cell.innerHTML=ag.innerHTML;
		cell.className="tabA";
		cell.id="clon_"+_id;
		cell.extObj = ag;
		cell.onclick= function(e) {if (this.className=="tabP") this.className="tabA"; if (!this.extObj) return; this.extObj.onclick(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(killSpaces(a)) && Number(killSpaces(b))) return sort_numbers(killSpaces(a), killSpaces(b));
  else if (!sort_case_sensitive) return sort_insensitive(a, b);
  else return sort_sensitive(a, b);
}

function killSpaces(a){
  if (a){
    if (a.indexOf(' ')>0){
      while(a.indexOf(' ')>0){
        a=a.replace(' ','');
      }
    }
  }
  return a;
}
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;
  }
}
//метод кастануть строку в дату
function getOurDate(str) {
  if (str == null) return null;
  str=trim(str);
  var haveDate=(str.match("[0-9]{1,2}.[0-9]{2}.[0-9]{4}"));
  var haveTime=(str.match("[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}"));
  if (!haveDate) return null;
    try {
      var dparts=haveDate[0].split(".");
      var days = dparts[0];
      var months = dparts[1] - 1;
      var years = dparts[2];

	  var hours =minutes=seconds= 0;
	  if (haveTime) {
	    var tparts=haveTime[0].split(":");
	    hours = tparts[0];
	    minutes = tparts[1];
	    seconds = tparts[2];
      }
      var d = new Date(years, months, days, hours, minutes, seconds);
      return (isNaN(d)) ? null : d;
    } catch (e) {
      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 {
	if (node.className!="") node.setAttribute("oldClassName",node.className);
        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") {
	 var oldClass=node.getAttribute("oldClassName");
	 if (oldClass!=null) node.className= oldClass;
          else 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 = "Сортировка";
      // 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 columnFilterCondition(num,showAll,isEmpty,pattern) {
	this.tdNum=num;
	this.showAll=showAll;
	this.isEmpty=isEmpty;
	this.pattern=pattern;
}
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 filtersTR=sel.offsetParent.parentNode; // tr -with dropdown filters lists
	var showAll=(sel.options[sel.selectedIndex].value=="all");
	var pattern=sel.options[sel.selectedIndex].text;
	var isEmpty = (sel.options[sel.selectedIndex].value=="empty");

	var fa=filtersTR.getAttribute("_fa"); // take array with already set filters.
	if (fa==null) { // if it is null create it.
		var fa= new Array();
		fa[fa.length]=new columnFilterCondition(colNum,showAll,isEmpty,pattern);
		filtersTR.setAttribute("_fa",fa);
	}
	else {
		var filterItem=isElemInArray(fa,"tdNum",colNum,2);
		if (filterItem==null) {
			fa[fa.length]=new columnFilterCondition(colNum,showAll,isEmpty,pattern);
		}
		else {
			filterItem.showAll=showAll;
			filterItem.isEmpty=isEmpty;
			filterItem.pattern=pattern;
		}
		filtersTR.setAttribute("_fa",fa);
	}

	for (var i=0;i<trs.length ;i++ ) {
		var tr=trs[i];		
		var tds=tr.getElementsByTagName("td");
		if (tds==null || tds.length==0) continue;
		var len=(fa.length>tds.length)?tds.length:fa.length;
		var doHide=false;
		for (var c=0; c<len; c++ ) {
			var filter=fa[c];
			var td=tds[filter.tdNum];
			if (filter.showAll) continue;
			if (filter.isEmpty) {
				if (!emptyTagInnerHTML(td)) {
					doHide=true;
					break;
				}
			}
			else {
				var num=Number(td.innerHTML);
				if (isNaN(num)) {
					if (td.innerHTML.indexOf(filter.pattern)==-1) {
						doHide=true;
						break;
					}
		}
		else {
					if (num!=filter.pattern) {
						doHide=true;
						break;
					}
				}
		}
	}

		if (doHide) 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,skipButton) {
		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!="" && !skipButton) {
						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,disableRowEditing) {
		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")');
				}
				if (!disableRowEditing) trElem.ondblclick= new Function('doEditGridRow("'+currentManagedGrid+'","admin/gridrowedit","'+currentGridObjPrefix+'", "'+currentGridObjEditPage+'");');
				clear_GridErrorDisplayContainer();
			}
			var copyResult=copyTRCells(fh_tr,trElem,true,showResults,createdObjId,disableRowEditing);
		}
		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 (doCreate) {
				var Hid=document.getElementById("id_"+currentManagedGrid);
				if (Hid) {
					gridToHidden(Hid,trElem.parentNode);
				}
			}
		}
		
		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;
    }
  }
}

function initScrollContentForMozz(idHead, idBody, idGridContainer,isVisible) {
	if(!isIE) {
		var thead = $(idHead);
		var gridCon = $(idGridContainer);
		var tbody = $(idBody);
		if (!gridCon || !thead || !tbody) return;
		var d = getDimensionForGrid(gridCon, thead, tbody,isVisible);
		var tempHeight=(d.height - d.height_head);
		var tbodyHeight = ((d.height_body>tempHeight)?tempHeight:d.height_body)+4;
		//overflow: auto; overflow-x: hidden;  height: 373px;
	//	tbody.style.overflow = 'auto';
	//	tbody.style.overflowX = 'hidden';
		tbody.style.height = tbodyHeight + 'px';
	//	gridCon.style.overflow = 'hidden';
	}
}
function getDimensionForGrid(element, elementHead, elementBody, skipMoving) {
	if (!skipMoving) {
		var oldParent = element.parentNode != null ? element.parentNode : null;
		var originalVisibility = element.style.visibility;
		var originalPosition = element.style.position;
		var originalDisplay = element.style.display;
		var originalZindex = element.style.zIndex;
		element.style.visibility = 'hidden';
		element.style.position = 'absolute';
		element.style.top = 0;
		element.style.left = 0;
		element.style.zIndex = 9999;
		element.style.display = 'block';
		document.body.appendChild(element);
	}
	var originalHeight = element.clientHeight;
	var originalHeightHead = elementHead.clientHeight;
	var originalHeightBody = elementBody.clientHeight;
	if (!skipMoving) {
		oldParent.appendChild(element);
		element.style.display = originalDisplay;
		element.style.position = originalPosition;
		element.style.visibility = originalVisibility;
		element.style.zIndex = originalZindex;
	}
	return {height_head: originalHeightHead, height: originalHeight, height_body: originalHeightBody};
}

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);
}

function fill_HTMLArea(hid) {
	var hObj=(typeof(hid)==typeof(""))?$(hid):hid;
	if (!hObj || hObj.id==null | hObj.id=="") return;
	var  frameId=hObj.id.replace(/Value/, "Area");
	var iFrame = $(frameId);
	if (!iFrame) return;
	var oDoc ;
	if ( iFrame.contentDocument ) 
		oDoc=iFrame.contentDocument;
	else 
		oDoc=iFrame.contentWindow.document;

	oDoc.open();
	oDoc.write("<html><head></head><body>"+hObj.value+"</body></html>");
	oDoc.close();
}

function addToGrid(objId,objTitle,cmd) {
	if (objId==null || objId=="null") objId="";
	if (objTitle==null || objTitle=="null") objTitle="";
	if(window.opener && !window.opener.closed) {
		selectedIdArray = new Array();
		selectedTitleArray = new Array();
		gridDataArray = new Array();
		selectedIdArray.push(objId);
		selectedTitleArray.push(objTitle);
		if (gridMassiv!=null && gridNamesMassiv!=null) {
			var gridItem=new makeGridRow(gridNamesMassiv,gridMassiv)
			gridDataArray.push(gridItem);
		}
		var currentAction=(cmd==null || cmd=="null")?"":cmd;
		if (currentAction == "created") {
				selectObj(window,false,true);
		}
		else {
			if (currentAction!="") selectObj(window,false,false);
		}
		isRefresh = (currentAction == "update") || (currentAction == "created");
		try {
			var func = null;
			if (((window.opener.hasEditForm != null && !window.opener.hasEditForm) || window.opener.hasEditForm == null) && isRefresh==true ) {
				if(window.opener.getUpdateFrameFunction) {
					fun=window.opener.getUpdateFrameFunction(self);
					if (fun) func= new Function("var wo=(window.opener && !window.opener.closed)?window.opener:null; if((closeWinFlag==true || doWinCloseFlag==true) && wo!=null) {if (wo.hideShadowForAll) wo.hideShadowForAll(); fun();}");
				}
				if(!func) {
					if (window.opener.refreshWin){
						func = new Function("var wo=(window.opener && !window.opener.closed)?window.opener:null; if((closeWinFlag==true || doWinCloseFlag==true) && wo!=null) {if (wo.hideShadowForAll) wo.hideShadowForAll(); wo.refreshWin();}");
					}
					else {
						if (window.opener.updateFrame){
							 func = new Function("var wo=(window.opener && !window.opener.closed)?window.opener:null; if((closeWinFlag==true || doWinCloseFlag==true) && wo!=null) {if (wo.hideShadowForAll) wo.hideShadowForAll();wo.updateFrame();}");
						}
					}
				}
			}
			else { 
				func = new Function("var wo=(window.opener && !window.opener.closed)?window.opener:null; if((closeWinFlag==true || doWinCloseFlag==true) && wo!=null) {if (wo.hideShadowForAll) wo.hideShadowForAll();}");
			}
			//alert("func=\n"+func);
			onPerformUnload(window, func);
		}catch(e){}
	}
	else setTimeout("addToGrid('"+objId+"','"+objTitle+"','"+currentAction+"')",100);
}

/*-----------------------------/------------- functions for edit / create / view object ---------------------------------------------*/


