/* ------------------------------------------------COMMON PART -----------------------------------------------------*/
var doClose = true;
var doCloseItem = true;
var doCloseOnNoEvent = true;
var menuShowed = false;

var useModalWindows = false;
var currentModalWin = null;

/* new object to define Browser Info */
var navigatorUsrAgent = navigator.userAgent.toLowerCase();
var browserInfo = {
  isIE:/*@cc_on!@*/false,
  isIE8:/*@cc_on!@*/false && (parseInt(navigatorUsrAgent.match(/msie (\d+)/)[1], 10) >= 8),
  isIE7:/*@cc_on!@*/false && (parseInt(navigatorUsrAgent.match(/msie (\d+)/)[1], 10) >= 7),
  isIE6:/*@cc_on!@*/false && (parseInt(navigatorUsrAgent.match(/msie (\d+)/)[1], 10) >= 6),
  isSafari:(navigatorUsrAgent.indexOf(' applewebkit/') > -1),
  isOpera:!!window.opera,
  isAIR:(navigatorUsrAgent.indexOf(' adobeair/') > -1),
  isMac:(navigatorUsrAgent.indexOf('macintosh') > -1)
};
(function(A) {
  if (A.isIE8) {
    A.isIE6 = false;
    A.isIE7 = false;
  }
  if (A.isIE7) {
    A.isIE6 = false;
  }
  A.isGecko = (navigator.product == 'Gecko') && !A.isSafari && !A.isOpera;
  A.isMoz = A.isGecko;
  A.isGeckoLike = (A.isGecko || A.isSafari || A.isOpera);
  if (A.isGecko) {
    var B = navigatorUsrAgent.match(/rv:(\d+\.\d+)/);
    var C = B && parseFloat(B[1]);
    if (C) {
      A.isGecko10 = (C < 1.8);
      A.isGecko19 = (C > 1.8);
    }
  }
})(browserInfo);

/*common browser info vars - for older versions*/
var isOpera = browserInfo.isOpera;
var isOpera6 = (navigator.appVersion.indexOf("MSIE 5") != -1 && navigator.userAgent.indexOf("Opera 6") != -1);
var isN6 = browserInfo.isGecko;
var isN4 = (browserInfo.isGecko && browserInfo.isGecko10);
var isMoz = browserInfo.isGecko;
var isMac = browserInfo.isSafari;
var isIE = browserInfo.isIE;

var winArray = new Array();
var winAttrArray = new Array();
var winClassArray = new Array();
var winLast = null;
var updateFrameFunctionArray = new Array();
var gridTabIndexArr = new Array();
var toolbarZones = new Array();
var baseUrl = document.getElementsByTagName("base")[0].getAttribute("href");
var popupWinWidth = 750; // default window width
var popupWinHeight = 550; // default window height
var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;

var utilsIframeName = "myTarget";

/*заточка для IE6 и https. чтобы не выпрыгивало сообщение о разнородной загрузке*/
var dummyImgForIframe = baseUrl + "admin/images/e.gif";
function setIE6iframeSrc(mode) {
  return (!browserInfo.isIE6) ? "" : (baseUrl.indexOf('https://') > -1) ? ((mode) ? 'src="' + dummyImgForIframe + '"' : dummyImgForIframe) : "";
}

var HashMap =
    function() {
      this.keys = new Array();
      this.entries = {};
      this.length = 0;
    }
HashMap.prototype.put = function(key, value) {
  if (!this.entries[key]) {
    this.entries[key] = {k:(this.keys.push(key) - 1),v:value};
    this.length++;
  } else
    this.entries[key].k = value;
}
HashMap.prototype.get = function(key) {
  return this.entries[key] && this.entries[key].v;
}
HashMap.prototype.containsKey = function(key) {
  return (this.entries[key]) ? true : false;
}
HashMap.prototype.remove = function(key) {
  if (this.entries[key]) {
    delete this.keys[this.entries[key].k];
    delete this.entries[key];
    this.length--;
  }
}
HashMap.prototype.clear = function(key) {
  for (var i in this.keys) {
    delete this.entries[this.keys[i]];
    delete this.keys[i];
  }
  this.length = 0;
}
HashMap.prototype.getMap = function() {
  return this.entries;
}
HashMap.prototype.keySet = function() {
  return this.keys;
}
HashMap.prototype.size = function() {
  return this.length;
}

if (typeof($) == 'undefined') {
  var $ = function (id) {
    return (typeof(id) == "object") ? id : document.getElementById(id);
  };
}

function saveGridTabIndex(attrName, rows, cells, lastIndex) {
  this.name = attrName;
  this.rows = rows;
  this.cells = cells;
  this.lastIndex = lastIndex;
}

function collapsToolBar(img, id) {
  if (id == null || id == "" || $(id) == null) return;
  var obj = $(id);
  img = (typeof(img) == "object") ? img : (img != null && img != "") ? $(img) : null;
  var mode;
  if (obj.style.display == "none") {
    obj.style.display = "";
    mode = true;
  }
  else {
    obj.style.display = "none";
    mode = false;
  }
  if (img != null) {
    img.className = (mode) ? "tb_collaps_off" : "tb_collaps_on";
//    if (mode) newImg(img, collaps_off);
//    else newImg(img, collaps_on);
  }
  for (var key in toolbarZones) {
    if (typeof(toolbarZones[key]) == "undefined" || toolbarZones[key] == null) continue;
    var item = toolbarZones[key];
//    alert("in ccollaps="+key+") id= "+item.id+" mode="+item.display);
    if (item.id == id && item.display != mode) {
      setDisplay(item, mode);
    }
  }
  if (self.parent == self) {
    saveToolbarZonesToCookie();
  }
}

function toolbarZone(id, img, display) {
  this.id = id;
  this.img = img;
  this.display = display;
}
function setDisplay(o, val) {
  if (o == null || typeof(o) != "object") return;
  if (typeof(o.display) != "undefined" && o.display != null) o.display = val;
}
function saveToolbarZonesToCookie() {
  for (var key in toolbarZones) {
    if (typeof(toolbarZones[key]) == "undefined" || toolbarZones[key] == null) continue;
    var item = toolbarZones[key];
    if (!item.display) setCookie(item.id, "hidden");
    else clearCookie(item.id, "hidden");
  }
}
function getToolbarZonesFromCookie() {
  var item = null;
  var value = "";
  for (var key in toolbarZones) {
    if (typeof(toolbarZones[key]) == "undefined" || toolbarZones[key] == null) continue;
    item = toolbarZones[key];
    value = getCookie(item.id);
    if (value != null) {
      setDisplay(item, false);
      collapsToolBar(item.img, item.id);
    }
  }
}

function addWin(win, value, cls) {
  //    winLast = win;
  var len = winArray.length;
  winArray[len] = win;
  winAttrArray[len] = value;
  winClassArray[len] = (cls == null) ? "" : cls;
  return len;
}

/*cls -  класс открываемого на редактирование или создание объекта
 если задан то ищем и по объекту окна и по имени класса*/
function getWinAttr(win, cls) {
  var found = false;
  for (var i = 0; i < winArray.length; i++) {
    if (winArray[i] == win && !winArray[i].closed) {
      if (typeof(cls) != "undefined" && cls != null && cls != "") {
        if (winClassArray[i] != cls) continue;
      }
      found = true;
      break;
    }
  }
  return (found)? winAttrArray[i]:null;
}

function addUpdateFrameFunction(win, value) {
  try {
    updateFrameFunctionArray[win] = value;
  } catch (Exception) {
  }
}
function getUpdateFrameFunction(win) {
  try {
    return updateFrameFunctionArray[win];
  } catch(Exception) {
  }
}
function delUpdateFrameFunction(win) {
  try {
    if (win) {
      updateFrameFunctionArray[win] = null;
    }
  } catch(Exception) {
  }
}

function setBaseUrl(str) {
  baseUrl = str;
}

function getBaseUrl() {
  if (baseUrl == null)
    return document.getElementsByTagName("base")[0].href;
  return baseUrl;
}

function setPopupWinWidth(val) {
  popupWinWidth = val;
}

function setPopupWinHeight(val) {
  popupWinHeight = val;
}

function getPopupWinWidth() {
  return (popupWinWidth || popupWinWidth == 0) ? popupWinWidth : 750;
}

function getPopupWinHeight() {
  return (popupWinHeight || popupWinHeight == 0) ? popupWinHeight : 550;
}

function trim(s) {
  var e="";
  return (s != null) ? s.replace(/^\s\s*/, e).replace(/\s\s*$/, e) : s;
}

function replaceSubstring(str, pattern, replace) {
  if (str == null) return "";
  if (pattern == null || pattern == "") return str;
  if (replace == null) replace = "";
  var a = str.split(pattern);
  str = a.join(replace);
  return str;
}

/* Поиск позиции элемента*/
function findPos(id, Offset, Element) {
  var x = 0;
  var y = 0;
  var el, temp;
  if (Element != null) {
    el = Element;
  } else {
    el = document.getElementById(id);
  }
  //	var message = "";
  if (el.offsetParent) {
    temp = el;
    while (temp.offsetParent) {
      temp = temp.offsetParent;
      //		  message += temp.tagName + ': ' + '[' + temp.offsetLeft + ';' + temp.offsetTop + ']' + '\r\n';
      x += temp.offsetLeft;
      y += temp.offsetTop;
    }
  }
  //	alert(message);
  x += el.offsetLeft;
  y += el.offsetTop + Offset;
  return [x, y];
}

function changeLinksToUTF8() {
  var links = document.getElementsByTagName('a');
  for (var i = 0; i < links.length; i++) {
    var link = links[i];
    var href = link.getAttribute('href');
    href = encodeURI(href);
    //href = href.replace(/%2F/ig, '/').replace(/%3A/ig, ':');
    link.setAttribute('href', href);
  }
}

function getObjById(id, win) {
  if (id == null) return null;
  if (trim(id) == "") return null;
  var w = (win != null) ? win : window;
  var obj = w.document.getElementById(id);
  if (obj != null) return obj;
  obj = w.document.getElementsByName(id)[0];
  return obj;
}

//mode(0/1): 0-return array; 1-return first found;
function getObjectByAttr(parentTag, searchTag, attrName, attrVal, mode) {
  if (parentTag == null) return null;
  if (searchTag == null || (searchTag != null && trim(searchTag) == "")) return null;
  if (attrName == null || (attrName != null && trim(attrName) == "")) return null;
  if (attrVal == null) return null;
  if (attrName == "class" || attrName == "className") {
    attrName = (isIE) ? "className" : "class";
  }
  var oArr = new Array();
  for (var j = 0; (obj = parentTag.getElementsByTagName(searchTag).item(j)); j++) {
    var a = obj.getAttribute(attrName);
    if (a == null) continue;
    if (a == attrVal) {
      oArr[oArr.length] = obj;
      if (mode) return oArr;
    }
  }
  return (oArr.length == 0) ? null : oArr;
}

function getFalse(e) {
  var e = window.event ? window.event : (e == null) ? null : e;
  if (e != null) {
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
  }
  return false;
}
var stopEventBuble = function(e) {
  return getFalse(e);
};

function contains(ar, val, mode) {
  if (ar == null) return (!mode) ? false : -1;
  for (var i = 0; i < ar.length; i++) {
    if (ar[i] == val)
      return (!mode) ? true : i;
  }
  return (!mode) ? false : -1;
}
/*Функция для проверки наличия элемента с таким-то аттрибутом в массиве
//arr -array
// attrName -  the array item object attribute name
// attrValue -  the array item object attribute value
//mode  -  0,null: return boolean; 1: return array index; 2- return array item (object);  */
function isElemInArray(arr, attrName, attrValue, mode) {
  if (arr == null) return null;
  for (var i = 0; i < arr.length; i++) {
    var item = arr[i];
    if (typeof(item) != "object") continue;
    var attr = eval("item." + attrName);
    if (attr == null) continue;
    if (attr == attrValue) {
      switch (mode) {
        case 1: return i;break;
        case 2: return item;break;
        default: return true;
      }
    }
  }
  switch (mode) {
    case 1: return -1;break;
    case 2: return null;break;
    default: return false;
  }
}

if (!String.prototype.capitalize) {
  String.prototype.capitalize = function() {
    return this.replace("/[A-Za-z0-9_а-яёА-ЯЁ]+/g", function(a) {
      return a.charAt(0).toUpperCase() + a.slice(1).toLowerCase();
    });
  };
}

function push(val) {
  if (val == undefined) return;
  this[this.length] = val;
  return this[this.length - 1];
}
Array.prototype.old_push = Array.prototype.push;
Array.prototype.push = push;

function pop(val) {
  if (typeof(val) != "undefined") {
    var len = this.length;
    var ind = 0;
    for (i = 0; i < len; i++) {
      if (this[i] != val) {
        this[ind] = this[i];
        ind++;
      }
    }
    this.length--;
  } else {
    var val = this[this.length - 1];
    this[this.length - 1] = null;
    this.length--;
    return val;
  }
}
Array.prototype.pop = pop;

function getFirstChildTag(obj) {
  for (var i = 0; i < obj.childNodes.length; i++) {
    var tmpNode = obj.childNodes[i];
    if (tmpNode != null && tmpNode.tagName) {
      return tmpNode;
    }
  }
  return null;
}

function getPrevSiblingTag(obj, depth) { // depth -  show the number of object to find in hierarchy
  var d = (depth != null && typeof(depth) != "undefined") ? parseInt(depth) : 0;
  if (isNaN(d)) d = 0;
  if (d < 0) d = 0;
  var tmpObj = obj;
  while (tmpObj) {
    tmpObj = tmpObj.previousSibling;
    if (tmpObj && tmpObj.tagName) {
      if (d == 0) {
        return tmpObj;
      }
      d = d - 1;
    }
  }
  return null;
}

function getNextSiblingTag(obj, depth) { // depth -  show the number of object to find in hierarchy
  var d = (depth != null && typeof(depth) != "undefined") ? parseInt(depth) : 0;
  if (isNaN(d)) d = 0;
  if (d < 0) d = 0;
  var tmpObj = obj;
  while (tmpObj) {
    tmpObj = tmpObj.nextSibling;
    if (tmpObj && tmpObj.tagName) {
      if (d == 0) {
        return tmpObj;
      }
      d = d - 1;
    }
  }
  return null;
}

function getElementByClassName(obj, className) {
  for (var i = 0; i < obj.childNodes.length; i++) {
    var tmpNode = obj.childNodes[i];
    if (!tmpNode.tagName) continue;
    if (tmpNode.className == className) return tmpNode;
    else  tmpNode = getElementByClassName(tmpNode, className)

    if (tmpNode != null) return tmpNode;
  }
  return null;
}

function getParentByClassName(obj, className) {
  if (!obj)
    return null;
  var parent = obj.parentNode;
  if (parent) {
    if (parent.className == className) {
      return parent;
    } else {
      return getParentByClassName(parent, className)
    }
  }
  return null;
}

function getParentByTagName(node, parentTag) {
  if (node == null) {
    return null;
  }
  parentTag = (parentTag != null) ? parentTag.toLocaleUpperCase() : parentTag;
  var parent = null;
  var retElement = null;
  var pNode = node;
  while (parent = pNode.parentNode) {
    if (parent.nodeType == 1 && (parentTag == null || parent.tagName.toLocaleUpperCase() == parentTag )) {
      retElement = parent;
      break;
    }
    pNode = parent;
  }
  return retElement;
}

function getPrevSiblingByClassName(obj, className) {
  var tmpObj = obj;
  while (tmpObj) {
    if (tmpObj.className == className) {
      return tmpObj;
    }
    tmpObj = tmpObj.previousSibling;
  }
  return null;
}

function getNextSiblingByClassName(obj, className) {
  var tmpObj = obj;
  while (tmpObj) {
    if (tmpObj.className == className) {
      return tmpObj;
    }
    tmpObj = tmpObj.nextSibling;
  }
  return null;
}

function ReplaceTags(xStr) {
  xStr = xStr.replace(/<\/?[^>]+>/gi, "");
  return xStr;
}

// emulate getInnerText for Mozilla
function getInnerText(obj) {
  var text = "";
  if (obj.innerText) text = obj.innerText;
  else text = ReplaceTags(obj.innerHTML);
  return text;
}

// emulate getOuterHTML for Mozilla
function getOuterHTML(obj) {
  var content = "";
  if (obj.outerHTML) content = obj.outerHTML;
  else {
    var parentObj = obj.parentNode;
    var clon = parentObj.cloneNode(true);
    var list = clon.childNodes.length - 1;
    while (list != 0) {
      var curNode = clon.childNodes[list];
      if (curNode.nodeType != 1) clon.removeChild(curNode);
      else if (curNode.getAttribute("id") != obj.getAttribute("id"))  clon.removeChild(curNode);
      list--;
    }
    content = clon.innerHTML;
  }
  return content;
}


// emulate obj.outerHTML=htmlCode  for Mozilla
function setOuterHTML(obj, htmlCode) {
  if (!obj) return;
  if (obj.outerHTML) {
    obj.outerHTML = htmlCode;
    return;
  }
  var newElement = document.createElement('span');
  newElement.innerHTML = htmlCode;
  var np = obj.parentNode;
  np.replaceChild(newElement, obj);
}

// emulate insertAdjacentHTML for Mozilla
function emulate_insertAdjacentHTML() {
  if (typeof HTMLElement != "undefined" && ! HTMLElement.prototype.insertAdjacentElement) {
    HTMLElement.prototype.insertAdjacentElement = function(where, parsedNode) {
      switch (where) {
        case 'beforeBegin':this.parentNode.insertBefore(parsedNode, this)
          break;
        case 'afterBegin': this.insertBefore(parsedNode, this.firstChild);
          break;
        case 'beforeEnd': this.appendChild(parsedNode);
          break;
        case 'afterEnd': if (this.nextSibling) this.parentNode.insertBefore(parsedNode, this.nextSibling);
        else this.parentNode.appendChild(parsedNode);
          break;
      }
    }
    HTMLElement.prototype.insertAdjacentHTML = function(where, htmlStr) {
      var r = this.ownerDocument.createRange();
      r.setStartBefore(this);
      var parsedHTML = r.createContextualFragment(htmlStr);
      this.insertAdjacentElement(where, parsedHTML)
    }
  }
}

function emptyTagInnerHTML(tag) {
  if (tag == null) return null;
  for (var i = 0; i < tag.childNodes.length; i++) {
    var node = tag.childNodes[i];
    if (node.nodeType == 1) {
      if (node.tagName.toUpperCase() == "TBODY") {
        var empty = emptyTagInnerHTML(node);
        if (!empty) return false;
      }
      else if (node.tagName.toUpperCase() != "SCRIPT") return false;
    }
    if (node.nodeType == 3) {
      var txt = trim(node.nodeValue);
      if (txt == "" || (txt.indexOf("&nbsp") && txt.length <= 6))  continue;
      else return true;
    }
  }
  return true;
}

function er_invert(id) {
  var el = getObjById(id);
  if (el) {
    el.style.display = el.style.display != "block" ? "block" : "none";
  }
}

function newImg(id, img) {
  if (!img) {
    return;
  }
  var parentEl;
  if (id.nodeType != 1) {
    parentEl = id.parentNode;
    var childs = parentEl.childNodes;
    for (var i = 0; i < childs.length; i++) {
      if (childs[i].nodeType == 1 && childs[i].tagName == "IMG") {
        id = childs[i];
        break;
      }
    }
  }
  id.src = img.src;
}

function getForm(curTag) {
  if (!curTag) return document.forms[document.forms.length - 1];
  var form = curTag.parentNode;
  while (form.tagName != "FORM" && form.parentNode != null) {
    form = form.parentNode;
  }
  if (form.tagName != "FORM") return null;
  return form;
}

function getFrame(win, target) {
  for (var i = 0; i < win.frames.length; i++) {
    if (win.frames[i].name == target) {
      return win.frames[i];
    }
  }
  return null;
}

function getIframeWindow(iframeTag) {
  return (!iframeTag) ? null : (iframeTag.contentDocument) ? iframeTag.contentDocument : iframeTag.contentWindow;
}

function url(newUrl, target, flag) {
  newUrl = (newUrl.indexOf('://') < 0 ? baseUrl : '') + newUrl.replace("#", "%23");
  var targetFrame = null;
  var f = null;
  if (!target || target == "_blank") {
    return doOpenWindow(newUrl);
  } else if (target == "_self") {
    targetFrame = self;
  } else {
    f = getFrame(self, target);
    if (!f) {
      f = getFrame(self.parent, target);
      if (!f) {
        f = getFrame(top, target);
      }
    }
    if (f) {
      targetFrame = (f.length > 0) ? f[0] : f;
    }
    else {
      return doOpenWindow(newUrl);
    }
  }

  if (targetFrame) {
    var iframeWin = (targetFrame.location) ? targetFrame : getIframeWindow(targetFrame);
    if (flag != null && flag) iframeWin.location.replace(newUrl);
    else iframeWin.location.href = newUrl;
  }
  else {
    alert("Frame " + target + " does not exists.");
  }
  return targetFrame;
}

function addToTitle(title, mode) {
  var t = title.split("&#034;");
  title = t.join('"');
  t = title.split("&#039;");
  title = t.join("'");
  var tmpDoc = (self.parent == null || self.parent == self) ? self.document : self.parent.document;
  var addText = "";
  switch (mode) {
    case "rewrite":
      addText = title;
      break;
    case "append":
      addText = tmpDoc.title + title;
      break;
    default:
      var pos = tmpDoc.title.indexOf("(");
      if (pos >= 0)
        tmpDoc.title = tmpDoc.title.substring(0, pos - 1);
      addText =  "( " + title + " ) " + tmpDoc.title;
  }
  tmpDoc.title = addText;
}

function refreshPage() {
  var acceptRefresh = true;
  if (self.parent) {
    acceptRefresh = (self.parent.getChanged)? (self.parent.getChanged()!="true") : true;
    if(acceptRefresh) {
        if (self.parent.list) self.parent.list.location.reload(true);
        else self.parent.location.reload(true);
    }
  }
  else {
      acceptRefresh = (self.getChanged)? (getChanged()!="true") : true;
      if (acceptRefresh) self.location.reload(true);
  }
}

function updatePage() {
  if (self.parent) {
    if (self.parent.list && self.parent.list.refreshWin) {
      self.parent.list.refreshWin();
    } else if (self.parent.refreshWin) {
      self.parent.refreshWin();
    }
  } else if (self.refreshWin) {
    self.refreshWin();
  }
}

function updateFrame(frm) {
  var frame = (frm && frm.location) ? frm : self;
  if (frame.refreshWin) {
    frame.refreshWin();
  }
  else {
    //frame.location.reload(true);
    var acceptRefresh = (frame.getChanged)? (frame.getChanged()!="true") : true;
    if(acceptRefresh){
        var href = frame.location.href;
        frame.location.href = href;
    }
  }

}

function clearSelectedObjBar() {
  var lf = getListFrame();
  if (!lf) lf = self;
  if (lf.clearSelectedInList) {
    var boxes = (typeof("selectCheckersName") != "undefined") ? selectCheckersName : "selId(0)";
    lf.clearSelectedInList(boxes);
  }
}

/* has navigator on page ?  (uses in structure shablons)*/
function checkNavigator(tagName, attr, value) {
  var tags = document.getElementsByTagName(tagName);
  var tmpVal;
  for (var i = 0; i < tags.length; i++) {
    tmpVal = (attr != "class") ? tags[i].getAttribute(attr) : tags[i].className;
    if (tmpVal == value)
      return true;
  }
  return false;
}

function getListFrame(frameName) {
  var parentFrame = (self.parent && self.parent != self && self.parent.frames) ? self.parent : self;
  return (!frameName) ? getFrame(parentFrame, "list") : getFrame(parentFrame, frameName);
}

function makeInput(form, type, name, value) {
  if (!name || name == "") return null;
  form.innerHTML += "<INPUT type=" + type + " name=\"" + name + "\" />";
  var inputTag = null;
  var inpTag = form.elements[name];
  if (!inpTag) return null;
  if (inpTag.length && inpTag.length > 1) {
    inputTag = inpTag.item(inpTag.length - 1);
  } else {
    inputTag = inpTag;
  }
  inputTag.setAttribute("id", name);
  inputTag.value = value;
  return inputTag;
}

function addInput(form, name, value, setID) {
  var inputTag = document.createElement("INPUT");
  inputTag.setAttribute("TYPE", "hidden");
  inputTag.setAttribute("NAME", name);
  if (setID) inputTag.setAttribute("id", name);
  inputTag.value = value;
  form.appendChild(inputTag);
}

function makeForm(name, id, action, target, method, css, visible) {
  var formTag = null;
  if (formTag = document.forms[name]) {  //seek and destroy contents then return it
    var i = 0;
    while (formTag.elements.length != 0) {
      formTag.removeChild(formTag.elements[i]);
      i++;
    }
    return formTag;
  }
  var body = document.getElementsByTagName("body").item(0);
  if (!body || !name) return null;
  var newTag = document.createElement("FORM");
  newTag.method = (!method) ? "POST" : method;
  if (target) newTag.target = target;
  if (action) {
    newTag.setAttribute("ACTION", action);
    newTag.action = action;
  }
  newTag.setAttribute("enctype", "multipart/form-data");
  newTag.setAttribute("encoding", "multipart/form-data");
  newTag.name = name;
  newTag.setAttribute("id", (!id) ? name : id);
  newTag.className = (!css) ? "virtual" : css;
  if (!visible) newTag.style.display = "none";
  body.appendChild(newTag);
  return newTag;
}

function makeIframe(tag, name, id, css, style, src) {
  id = (!id) ? name : id;

  // check iframe existance
  var frame = $(id);
  if (frame) return frame; //already exist
  if (frame = getFrame(window, name)) return frame; //already exist
  //--------------------------

  if (!tag) {
    var b = document.getElementsByTagName("body");
    if (!b || b.length == 0) return null;
    tag = b.item(0);
  }
  css = (!css) ? "virtual" : css;
  var s = (!style || style == "") ? "" : " style='" + style + "'";
  var frameSrc = (!src || src == "") ? setIE6iframeSrc(true) : " src='" + src + "' ";
  if (typeof(tag.insertAdjacentHTML) == "undefined") emulate_insertAdjacentHTML();
  try {
    tag.insertAdjacentHTML("afterBegin", "<iframe " + frameSrc + " id='" + id + "' name='" + name + "' class='" + css + "' " + s + " ></iframe>");
  } catch(e) {
    return null;
  }
  return (frame = $(id)) ? frame : (frame = getFrame(window, name)) ? frame : null;
}

// Функция поиска индекса OPTION в SELECT
function getIndexByOptionValue(List, value, byPart) {
  var result = 0;
  var selVal = "";
  for (var i = 0; i < List.length; i++) {
    selVal = List.options[i].value;
    if (selVal == value || (byPart && selVal.indexOf(value) != -1)) {
      result = i;
      break;
    }
  }
  return result;
}

// Добавляет в указанный SELECT новую запись
function addOption(List, value, text, data, skipCheck) {
  var Well = 'true';
  if (!skipCheck) {
    for (var i = 0; i < List.length; i++) {
      if (List.options[i].value == value) {
        Well = 'false';
      }
    }
  }
  if (Well == 'true') {
    var newCondList = document.createElement("OPTION");
    newCondList.text = text;
    if (value != null && value != "") newCondList.value = value;
    if (data != null && data != "") newCondList.data = data;
    //  Для добавления элемента используется либо метод IE,
    //  либо DOM, которые не совпадают по параметрам
    (List.options.add) ? List.options.add(newCondList) : List.add(newCondList, null);
  }
}

function delOption(list, index, value) {
  var ind = parseInt(index);
  if (isNaN(ind) || ind < 0) {
    if (!value) return;
    ind = getIndexByOptionValue(list, value);
  }
  if (ind > -1) {
    list.options[ind] = null;
  }
}

//direction(boolean):  true=Двигаем слева направо; false/null - Двигаем справа налево
//all(boolean): true=все опшины; false/null- только выбранные
function moveHorizontal(name1, name2, direction, all) {
  var box1 = (direction) ? $(name1) : $(name2);
  var box2 = (direction) ? $(name2) : $(name1);
  if (!box1 || !box2) return;
  var move,remove,item;
  for (var i = 0; i < box1.length; i++) {
    item = box1.options[i];
    move = (all) ? true : (item.selected);
    if (move) {
      addOption(box2, item.value, item.text, item.data);
    }
  }
  for (var i = box1.length - 1; i >= 0; i--) {
    item = box1.options[i];
    remove = (all) ? true : (item.selected);
    if (remove) delOption(box1, i);
  }
}

function ToHidden(Sel, Hid, row) {
  if (!row) {
    Hid.value = '';
    for (i = 0; i < Sel.options.length; i++) {
      Hid.value = Hid.value + Sel.options[i].value + ',';
    }
  } else {
    var table = row.parentNode;
    gridToHidden(Hid, table);
  }
}

function gridToHidden(Hid, table) {
  if (!table || !Hid)  return;
  Hid.value = '';
  for (var i = 0; i < table.childNodes.length; i++) {
    if (table.childNodes[i].nodeName[0] != "#") {
      if (table.childNodes[i].getAttribute("objId") != null) {
        Hid.value += ",";
        Hid.value = Hid.value + table.childNodes[i].getAttribute("objId");
      }
    }
  }
}

function setCheckBox(fromField, toField, value, frm, linkedField) {
  var form = (typeof(frm) == "string") ? $(frm) : frm;
  if (!form && typeof(frm) == "string") form = document.forms[frm];
  if (!form) form = document.forms[document.forms.length - 1];
  var from_field = form[fromField];
  if (from_field) {
    from_field.checked = value;
    if (value) from_field.setAttribute("checked", value);
    else from_field.removeAttribute("checked");
  }
  //alert(form[fromField].checked);
  var to_field = form[toField];
  if (to_field)
    to_field.value = value;
  if (linkedField != null) {
    if (value) form[linkedField].removeAttribute("disabled");
    else form[linkedField].setAttribute("disabled", "true");
    //	form[linkedField].disabled = !value;
  }
}

function setEventsToButtons(className) {
  var obj = null;
  for (var i = 0; i < document.links.length; i++) {
    obj = document.links[i].parentNode;
    if (obj.className == className) {
      obj = document.links[i];
      /* add events to object */
      obj.onmouseover = new Function("this.parentNode.style.paddingTop='';this.parentNode.className = 'menuL_over';");
      obj.onmouseout = new Function("this.parentNode.className = 'menuL';");
    }
  }
  var node = null;
  for (var j = 0; (node = document.getElementsByTagName("button")[j]); j++) {
    obj = node.parentNode;
    if (obj.className == className) {
      /* add events to object */
      node.onmouseover = new Function("this.parentNode.className = 'menu_over';");
      node.onmouseout = new Function("this.parentNode.className = 'menu';");
    }
  }
}

function checkinteger(object_value) {
  //Returns true if value is a number or is NULL
  //otherwise returns false
  if (object_value.length == 0)
    return true;

  //Returns true if value is an integer defined as
  //   having an optional leading + or -.
  //   otherwise containing only the characters 0-9.
  //alert(object_value);
  return object_value.match('^([\-]){0,1}([0-9]+)$');
}

function checknumber(object_value) {
  //Returns true if value is a number or is NULL
  //otherwise returns false
  if (object_value.length == 0) {
    return true;
  }
  var arr = object_value.split(",");
  object_value = arr.join(".");
  return object_value.match('^([\-]){0,1}([0-9]+)([\.]){0,1}([0-9]*)$');
}

/* ------------------------------- editable object list ---------------------------------- */
var eframeName = "eattrFrame";
var eformName = "eattrForm";
var eattrHtml = null;
var isEAttrChanged = false;
var currentFieldValue = null;
var doBlurForDate = false;
var lastCalGridObject = null;
var eattrDateTimer = null;
var chooseButtonPressedForDate = false;

function initEverything(e) {
  var ev = window.event ? window.event : (e == null) ? null : e;
  makeIframe(null, utilsIframeName, null, null, "display:none");  //make hidden iframe with name "myTarget"
  initEditableObjList(ev);
}

/* init editable content in object list */
function initEditableObjList(e) {
//  if (!document.getElementsByTagName) return;
  var node;
  var isHasEAttr = false;
  for (var j = 0; (node = document.getElementsByTagName("span").item(j)); j++) {
    if (node.className == "eattr" && node.getAttribute("readonly") == "false") {
      isHasEAttr = true;
      if (node.innerHTML.length == 0) {
        node.parentNode.onclick = function (event) {
          doEdit(event, getFirstChildTag(this));
        };
        //node.parentNode.onclick = new Function("doEdit(null,getFirstChildTag(this))");
      }
      //	alert(node.tagName);
      if (node.addEventListener) node.addEventListener("keypress", preventSubmitOnEnterPress, false);
      else if (node.attachEvent) node.attachEvent("onkeypress", preventSubmitOnEnterPress);
    }
  }

  /* if frame undefined - add it !!! */
  if (isHasEAttr && !document.getElementById(eframeName)) {
    /* get body tag */
    var b = document.getElementsByTagName("body");
    if (b.length == 0) return;
    var body = b.item(0);

    /* add frame */
    makeIframe(body, eframeName, eframeName, "eattrFrame", "display:none");
    if (window.frames[eframeName] && window.frames[eframeName].document) {
      // Yo !
      window.frames[eframeName].document.open();
      window.frames[eframeName].document.close();
    }
    /* add form */
    var newTag = makeForm(eformName, null, "update.sx", eframeName, 'POST', null, null);

    addInput(newTag, "objId", "");
    addInput(newTag, "attrName", "");
    addInput(newTag, "value", "");
    document.forms[eformName].innerHTML += "";
    document.close();
  }
}

function preventSubmitOnEnterPress(e) {
  var ev = window.event ? window.event : e;
  var src = window.event ? ev.srcElement : ev.target;
  if (ev.keyCode == 13 && src.nodeType == 1 && src.tagName.toUpperCase() == "INPUT") {
    try {
      src.blur();
    } catch(ex) {
      // do nothing
    }
    return getFalse(ev);
  }
}

function prepareDoEditOnGridCell(e) {
  var ev = window.event ? window.event : e;
  var td = window.event ? ev.srcElement : ev.target;
  if (ev.keyCode != 13 || td.tagName.toUpperCase() != "TD") return getFalse(ev);
  var spanA = td.getElementsByTagName("span");
  var span = null;
  for (var i = 0; i < spanA.length; i++) {
    if (spanA[i].className == "eattr" && spanA[i].onclick != null && spanA[i].onclick.toString().indexOf("doEdit") > 0) {
      span = spanA[i];
      break;
    }
  }
  if (span == null) return getFalse(ev);
  span.click();
  return true;
}

function doEdit(e, el) {
  isEAttrChanged = false;
  var type = el.getAttribute("type");
  if (el.getAttribute("readonly") == "false") {
    if (el != null) {
      el.style.width = "";
    }
    if (type == "string") {
      setNewStr(el);
    }
    if (type == "date") {
      setNewDate(el);
    }
    if (type == "boolean") {
      setNewBoolean(el);
    }
  }
  if (self.setChanged) self.setChanged();
}
function setNewDate(el) {
  if (doBlurForDate) {
    if (lastCalGridObject) getNewDate(lastCalGridObject);
  }
  var text = getFirstChildTag(el);
  if (text && text.tagName == "INPUT")
    return;
  var aname = el.getAttribute("attrName");
  if (aname == null || aname == "") return;
  var objClass = "";
  var objID = el.getAttribute("objId");
  if (objID) {
    objClass = "_" + objID.substring((objID.indexOf("@") + 1));
  }
  var aTitle = el.getAttribute("attrTitle");
  aTitle = (aTitle == null) ? aname : aTitle;
  var f = getForm(el);
  if (f == null) return;
  if (el.innerHTML == "&nbsp;") {
    el.innerHTML = "";
  }
  var inpSize = (el.offsetWidth > 0) ? (el.offsetWidth < 80) ? 80 : el.offsetWidth : 0;

  if (inpSize == 0) {
    if (el.getAttribute("mask") != null) {
      var maska = parseMask(el.getAttribute("mask"));
      inpSize = maska.length * 8;
    }
    else inpSize = 80;
  }
  eattrHtml = el.innerHTML;
  el.innerHTML = "";

  var tip = el.getAttribute("attrType");
  var inputTagH = "<input type='hidden' name='data(" + aname + ")' id='data(" + aname + objClass + ")' />";
  el.innerHTML += inputTagH;

  var inputTagHTML = "<input type='text' name='date(" + aname + ")'  id='date(" + aname + objClass + ")' tip='date' attrTitle='" + aTitle + "' maxlength=10 hidElem='data(" + aname + objClass + ")' onblur='prepareGetNewDate(event)' />";
  if (self.addCalendar) {
    inputTagHTML += "<span id='buttons_" + aname + objClass + "'><button class='lnk' title='Выбрать' onClick=\"if (self.showCal) {doBlurForDate=false;chooseButtonPressedForDate=true;showCal('" + aname + objClass + "',null,event);}return getFalse(event);\"><img src='admin/images/view_up.gif' onMouseOver='newImg(this,view_down)' onMouseOut='newImg(this,view_up)'/></button></span>";
  }
  el.innerHTML += inputTagHTML;

  var inputTag = document.createElement("INPUT");
  //пляски с бубном для того чтобы перевести затем фокус в основное поле myTag
  inputTag.type = "text";
  inputTag.className = "virtual";
  el.appendChild(inputTag);
  inputTag.focus();

//  var myTag = f.elements['date(' + aname + ')'];
  var myTag = $("date(" + aname + objClass + ")");
  myTag.value = eattrHtml;
  myTag.className = "editStringAttr";
  myTag.style.width = inpSize + "px";
  if (el.getAttribute("mask") != null) {
    myTag.setAttribute("mask", el.getAttribute("mask"));
  }
  if (tip != null) {
    myTag.setAttribute("attrType", tip);
  }

  if (myTag.addEventListener) {
    myTag.addEventListener("focus", getCurrentFieldValue, false);
    myTag.addEventListener("blur", prepareGetNewDate, false);
    myTag.addEventListener("change", setEAttrChanged, false);
  }
  else if (myTag.attachEvent) {
    myTag.attachEvent("onfocus", getCurrentFieldValue);
    //		el.attachEvent("onblur", getNewDate);
    myTag.attachEvent("onchange", setEAttrChanged);
  }

  if (self.addCalendar) {
    addCalendar("Выберите дату", aname + objClass, f, "Неправильный формат даты  '" + aTitle + "'");
  }

  myTag.focus();
  el.removeChild(inputTag);
}


function setNewStr(el) {
  var text = getFirstChildTag(el);
  if (text && text.tagName == "INPUT" && text.type.toUpperCase() == "TEXT")
    return;
  var inpSize = (el.offsetWidth > 0) ? (el.offsetWidth < 70) ? 70 : el.offsetWidth : 0;
  if (inpSize == 0) {
    if (el.getAttribute("mask") != null) {
      var maska = parseMask(el.getAttribute("mask"));
      inpSize = (maska.length * 8) + 'px';
    }
    else inpSize = '100%';
  }
  eattrHtml = el.innerHTML;
  el.innerHTML = "";
  var tip = el.getAttribute("attrType");
  var inputTag = document.createElement("INPUT");
  inputTag.type = "text";
  inputTag.value = eattrHtml;
  if (tip != null && "3" == tip) {
    var vv = inputTag.value;
    if (vv) {
      while (vv.indexOf(" ") > -1) {
        vv = vv.replace(' ', '');
      }
    }
    inputTag.value = vv;
  }
  var attrLength = el.getAttribute("attrLength");
  if (attrLength != null && !isNaN(Number(attrLength)) && Number(attrLength) != 0) {
    inputTag.maxLength = attrLength;
  }
  inputTag.className = "editStringAttr";

  if (el.getAttribute("mask") != null) {
    inputTag.setAttribute("mask", el.getAttribute("mask"));
  }
  if (el.getAttribute("regexp_rule") != null) { // если используется новая маска ....
    inputTag.setAttribute("regexp_rule", el.getAttribute("regexp_rule"));
    if (el.getAttribute("inline") != null) { // признак вывода в строку
      inputTag.setAttribute("inline", el.getAttribute("inline"));
    }
  }

  inputTag.style.width = inpSize;
  //+ 10 + "px";
  if (tip != null) {
    inputTag.setAttribute("attrType", tip);
  }
  el.appendChild(inputTag);

  /* attach event */
  if (inputTag.addEventListener) {
    inputTag.addEventListener("focus", getCurrentFieldValue, false);
    inputTag.addEventListener("blur", getNewStr, false);
    inputTag.addEventListener("change", setEAttrChanged, false);
  }
  else if (inputTag.attachEvent) {
    inputTag.attachEvent("onfocus", getCurrentFieldValue);
    inputTag.attachEvent("onblur", getNewStr);
    inputTag.attachEvent("onchange", setEAttrChanged);
  }

  //	alert(inputTag.onfocus+"\n"+inputTag.onblur+"\n"+inputTag.onchange);
  inputTag.focus();

}
function setNewBoolean(el) {
  var checkBox = getFirstChildTag(el);
  if (!checkBox || !(checkBox.tagName == "INPUT" && checkBox.type.toUpperCase() == "CHECKBOX"))
    return;

  var inputTag = checkBox;
  inputTag.value = checkBox.checked;

  /* attach event */
  var elem = inputTag;
  var node = elem.parentNode;
  document.forms[eformName].value.value = elem.value;
  document.forms[eformName].objId.value = node.getAttribute("objId");
  document.forms[eformName].attrName.value = node.getAttribute("attrName");
  document.forms[eformName].submit();
}
function getCurrentFieldValue(e) {
  /*  if (eattrDateTimer != null) {
   clearTimeout(eattrDateTimer);
   eattrDateTimer = null;
   }*/
  var obj = window.event ? window.event.srcElement : e.currentTarget;
  if (obj == null || obj.tagName != "INPUT") return;

  var field_tip = obj.getAttribute("tip");
  if (field_tip && field_tip == "date") {
    doBlurForDate = true;
  }

  if (self.initMask) initMask(obj);
  if (!chooseButtonPressedForDate) currentFieldValue = obj.value;
}
function testIfChanged(obj) {
  if (obj == null || obj.tagName != "INPUT") return;
  if (currentFieldValue != null && currentFieldValue != obj.value)  isEAttrChanged = true;
}
function setEAttrChanged(e) {
  isEAttrChanged = true;
}
function prepareGetNewDate(e, mode) {
  if (typeof(e.tagName) == "undefined") {
    blurElem = window.event ? window.event.srcElement : e.currentTarget;
  }
  else {
    blurElem = e;
  }

  lastCalGridObject = blurElem;
  mode = (typeof(mode) == "undefined") ? null : mode;
  if (doBlurForDate && mode) {
    getNewDate(blurElem);
  }
  else {
    if (!mode) eattrDateTimer = setTimeout("prepareGetNewDate(blurElem,true)", 300);
    else eattrDateTimer = setTimeout("getNewDate(blurElem)", 10000);
  }
}

function getNewDate(e) {
  var el = (e.tagName == "INPUT") ? e : e.document.getElementsByTagName("INPUT")[1];
  var hidId = el.getAttribute("hidElem");
  if (hidId != null) {
    var atitle = el.getAttribute("attrTitle");
    atitle = (atitle == null) ? el.name : atitle;
    setDatetoHidden(el, hidId, 'Неправильный формат даты поля " ' + atitle + ' "');
    var hid = $(hidId);
  }
  testIfChanged(el);
//  var node = el.parentNode;
  var node = getParentByTagName(el, "span");
  if (node == null) return;
  try {
    if (isEAttrChanged) {
//      if (hid != null && hid.value != "") {
      if (hid != null) {
        document.forms[eformName].value.value = (hid.value != "") ? hid.value : "";
        document.forms[eformName].objId.value = node.getAttribute("objId");
        document.forms[eformName].attrName.value = node.getAttribute("attrName");
        document.forms[eformName].submit();
        node.innerHTML = el.value;
      }
      else {
        //				if (hid==null)
        node.innerHTML = (el.value.indexOf("x") != -1) ? "&nbsp;" : el.value;
      }
    }
    else {
      if (!(el.tagName == "INPUT" && el.type.toUpperCase() == "TEXT") || eattrHtml != null)
        node.innerHTML = eattrHtml;
    }

    if (node.innerHTML.length == 0) {
      node.parentNode.onclick = function (event) {
        doEdit(event, getFirstChildTag(this));
      };
    }
  } catch (e) {
  }
  doBlurForDate = false;

  if (eattrDateTimer != null) {
    clearTimeout(eattrDateTimer);
  }
}

function getNewStr(e) {
  var el = window.event ? window.event.srcElement : e.currentTarget;
  var test = 0;
  if (el && el.getAttribute("regexp_rule") != null) {
    test = validateFieldByRegExp(el);
  } else {
    test = validateField(el, true);
  }
  if (test == 0 || !test) return getFalse(e);
  /*	var sMask= el.getAttribute("mask");
   if (sMask!=null && sMask!="" && el.value!="") {
   if (el.value==sMask ) el.value="";
   else {
   if (!testValueByMask(el)) {
   //	alert("Введено некорректное значение.\nФормат ввода: "+el.getAttribute("mask"));
   return;
   }
   else {
   el.value=clearAllSpecialSimbols(el.value, sMask);
   }
   }
   }*/

  testIfChanged(el);
  var node = el.parentNode;
  if (isEAttrChanged) {
    document.forms[eformName].value.value = el.value;
    document.forms[eformName].objId.value = node.getAttribute("objId");
    document.forms[eformName].attrName.value = node.getAttribute("attrName");

    var correct = true;
    if (el.getAttribute("attrType") != null) {
      var type = el.getAttribute("attrType");
      if (type == "2") {
        if (!checkinteger(el.value)) {// Integer
          alert("Это поле может содержать только целые числа");
          correct = false;
        }
      } else if (type == "3") {
        if (!checknumber(el.value)) {//Float
          alert("Это поле может содержать только вещественные значения");
          correct = false;
        }
      }
    }
    //if (!correct) el.value="";
    document.forms[eformName].submit();
    showFullValue(el);
    if (!(el.tagName == "INPUT" && el.type.toUpperCase() == "TEXT") || eattrHtml != null)
      node.innerHTML = el.value;
  } else {
    if (!(el.tagName == "INPUT" && el.type.toUpperCase() == "TEXT") || eattrHtml != null)
      node.innerHTML = eattrHtml;
  }
  if (node.innerHTML.length == 0) {
    node.parentNode.onclick = function (event) {
      doEdit(event, getFirstChildTag(this));
    };
  }
}

// start initEditableObjList() on load
if (root) {
  if (root.addEventListener) root.addEventListener("load", initEverything, false);
  else if (root.attachEvent) root.attachEvent("onload", initEverything);
}

/* --------------------------/------end of editable objects list---------------------------------------------------------------------- */


/*---------------------------------------------popup window with message-----------------------------------------------------------------------*/
function isVisible(obj) {
  do{
    try {
      if (obj.nodeType > 1) break;
    } catch(e) {
    }
    var display = obj.currentStyle
        ? obj.currentStyle.display
        : isN6 ? obj.ownerDocument.defaultView.getComputedStyle(obj, null).getPropertyValue("display") : '';
    var visibility = obj.currentStyle
        ? obj.currentStyle.visibility
        : isN6 ? obj.ownerDocument.defaultView.getComputedStyle(obj, null).getPropertyValue("visibility") : '';
    if (display == 'none' || visibility == 'invisible') {
      return false;
    }
  } while ((obj = obj.parentElement ? obj.parentElement : obj.parentNode))
  return true;
}

function showMessage(inWindow, str, title) {
  var win = (inWindow) ? inWindow : window;
  var _body = win.document.body;
  window.scroll(0, 0);
//  stopAllEvent(win);
  var divHTML = '<table cellpadding="10" class="messArea" cellspacing="0">' +
      ((!title || title == "") ? "" : '<tr><td align="left" valign="top" class="messCaption">' + title + '</td></tr>') +
      '<tr><td align="center" valign="middle">' + str + '</td></tr></table>';

  var popupDiv = $("popupMessageDiv");
  if (!popupDiv) {
    var divTag = win.document.createElement("DIV");
    divTag.setAttribute("id", "popupMessageDiv");
    _body.appendChild(divTag);
    popupDiv = divTag;
  }
  popupDiv.innerHTML = divHTML;
  popupDiv.className = "showMess_active";

  var x_offset = Math.round(( _body.clientWidth - popupDiv.offsetWidth) * 4 / 9);
  var x = (isIE ? _body.scrollLeft : window.scrollX) + x_offset;

  var y_offset = 300;
  var h = _body.clientHeight;
  /*пляски с бубном  по причине того что (clientHeight=1 на любых Браузерах или clientHeight = ScrollHeight под IE) при попытке эмуляции min-width для IE6 (хак на дивах)*/
  if ((h <= 1 && win.innerHeight) || (h > 1 && !isIE) || (h < screen.availHeight)) {
    y_offset = Math.round(( ((win.innerHeight) ? win.innerHeight : h) - popupDiv.offsetHeight) * 4 / 9);
  }
  var y = (isIE ? _body.scrollTop : window.scrollY) + y_offset;

  if (isIE) {
    popupDiv.style.pixelLeft = x;
    popupDiv.style.pixelTop = y;
  }
  else {
    popupDiv.style.left = x + "px";
    popupDiv.style.top = y + "px";
  }
  popupDiv.oncontextmenu = new Function("return false");
  if (win.addShadow) win.addShadow();
  if (win.showShadow) win.showShadow();
}

function hideMessage(inWindow, messDiv) {
  var win = (inWindow) ? inWindow : window;
  if (!messDiv) messDiv = "popupMessageDiv";
  var div = (typeof(messDiv) == "string") ? win.document.getElementById(messDiv) : messDiv;
  if (!div) return;
  div.innerHTML = "";
  div.className = "editForm_passive";
  div.oncontextmenu = "";
  if (win.hideShadow) win.hideShadow();
}

function popupMsgOn(inWindow, str, title) {
  showMessage(inWindow, str, title);
}

function popupMsgOff(inWindow) {
  hideMessage(inWindow);
}

function envokeAllEvent(winObj) {
  if (winObj.document.removeEventListener) {
    winObj.removeEventListener("scroll", stopEvents, false);
    winObj.document.removeEventListener("mouseup", stopEvents, false);
    winObj.document.removeEventListener("keydown", stopEvents, false);
    winObj.document.removeEventListener("keyup", stopEvents, false);
  }
  else if (winObj.document.detachEvent) {
    winObj.detachEvent("onscroll", stopEvents);
    winObj.document.detachEvent("onmouseup", stopEvents);
    winObj.document.detachEvent("onmousedown", stopEvents);
    winObj.document.detachEvent("onkeydown", stopEvents);
    winObj.document.detachEvent("onkeyup", stopEvents);
  }
}

function stopAllEvent(winObj) {
  winObj.document.oncontextmenu = new Function("return false");
  if (winObj.document.addEventListener) {
    winObj.addEventListener("scroll", stopEvents, false);
    winObj.document.addEventListener("mouseup", stopEvents, false);
    winObj.document.addEventListener("keydown", stopEvents, false);
    winObj.document.addEventListener("keyup", stopEvents, false);
  }
  else if (winObj.document.attachEvent) {
    winObj.attachEvent("onscroll", stopEvents);
    winObj.document.attachEvent("onmouseup", stopEvents);
    winObj.document.attachEvent("onmousedown", stopEvents);
    winObj.document.attachEvent("onkeydown", stopEvents);
    winObj.document.attachEvent("onkeyup", stopEvents);
  }
}

function stopEvents(e) {
  window.scrollTo(0, 0);
  var e = window.event ? window.event : e;
  e.cancelBubble = true;
  if (e.stopPropagation) {
    e.stopPropagation();
  }
  return false;
}
/*--------------------------------/--end of popup window-----------------------------------------------------------------------------------*/

/*-------------------------------------------End of common part ----------------------------------------*/



/*----------------------------------Object selection part --------------------------------------------------------------*/
var selectedIdArray = null;
var selectedTitleArray = null;
var exceptionIdArray = null;

var paramsHashCode = null;
var gridDataArray = null;
var selectAllSelected = "false";
var selectedObjClass = null;
var selectCheckersName = "";
var saveListOfChoosenObj = false;

function makeGridRow(cName, code) {
  this.cName = cName;
  this.code = code;
  this.toString = function() {
    return "names:\n" + this.cName.toString() + "\n\ncodes:\n" + this.code.toString();
  }
}

var OBJECT_MODE = 0;
var FOLDER_MODE = 1;
var selectMode = OBJECT_MODE;
var doWithAll = 0;
var doSetAll = false;
//false -clear checked;  true - set checked

/* 1 - folders, 0 - objects */

var selectedObj = null;
/* use only in navigator */

function getSelectMode() {
  return selectMode;
}

function setSelectMode(newMode) {
  selectMode = newMode;
}

function getSelectedObjectType() {
  var mode = OBJECT_MODE;
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      if (tmpWin.getSelectMode && tmpWin.getSelectMode() != mode) {
        return tmpWin.getSelectMode();
      }
    }
  } else {
    if (getSelectMode && getSelectMode() != mode)
      return getSelectMode();
  }
  return mode;
}

function clearSelected(obj, tmpWin, objectName) {
  if (tmpWin == null) tmpWin = self;
  tmpWin.selectedIdArray = null;
  tmpWin.selectedTitleArray = null;
  tmpWin.exceptionIdArray = null;
  if (!objectName && obj == null) return;
  if (!objectName)objectName = obj.name;
  /* clear array*/
  if (objectName && objectName.length > 0) {
    var objects = tmpWin.document.getElementsByName(objectName);
    if (objects.length != 0) {
      /* clear checkers and select in folder element*/
      if (objects[0].type == "checkbox" || objects[0].type == "radio") {
        for (var i = 0; i < objects.length; i++)
          objects[i].checked = false;
      } else {
        alert("Ошибка в шаблоне или в object.js !");
      }
    }
  }
  /* clear folder select */
  if (tmpWin.selectedObj) {
    tmpWin.selectedObj.className = "black";
    tmpWin.selectedObj = null;
  }
  tmpWin.setSelectMode(OBJECT_MODE);
}

function prepareSelect(obj, mode, objectName) {
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      //alert(tmpWin.name+"   "+tmpWin.getSelectMode()+"="+mode);
      if (tmpWin.getSelectMode && tmpWin.getSelectMode() != mode) {
        /* clear checkers and select in folder element*/
        clearSelected(obj, tmpWin, objectName);
      }
    }
  } else {
    /* clear checkers and select in folder element*/
    if (getSelectMode && getSelectMode() != mode)
      clearSelected(obj, self, objectName);
  }
}

function getSelObjects(onlySelf) { // onlySelf - get selected objects only from current window
  ret = new Array();
  if (!onlySelf && self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    ret[0] = new Array();
    ret[1] = new Array();
    for (i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      if (tmpWin.selectedIdArray && tmpWin.selectedTitleArray) {
        ret[0] = ret[0].concat(tmpWin.selectedIdArray);
        ret[1] = ret[1].concat(tmpWin.selectedTitleArray);
      }
      if (tmpWin.gridDataArray && tmpWin.gridDataArray.length > 0) {
        ret[2] = new Array();
        ret[2] = ret[2].concat(tmpWin.gridDataArray);
      }
    }
  } else {
    ret[0] = selectedIdArray;
    ret[1] = selectedTitleArray;
    if (gridDataArray && gridDataArray.length > 0) {
      ret[2] = new Array();
      ret[2] = gridDataArray;
    }
  }
  return ret;
}

function getSelectAllSelected() {
  result = null;
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      if (tmpWin.selectAllSelected == "true") {
        result = tmpWin.selectAllSelected;
      }
    }
  } else {
    result = selectAllSelected;
  }
  return result;
}

function getExceptObjects() {
  var exobj = new Array();
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      if (tmpWin.exceptionIdArray) {
        exobj = exobj.concat(tmpWin.exceptionIdArray);
      }
    }
  } else {
    exobj = exceptionIdArray;
  }
  return exobj;
}

function sendExceptionObjIds(form) {
  if (form == null || form.tagName.toUpperCase() != "FORM")  return;
  s = exceptionObjIds();
  if (s != "") makeInput(form, "hidden", "exeptionObjIds", s);
}

function exceptionObjIds() {
  s = "";
  var exobj = getExceptObjects();
  if (exobj) {
    for (var i = 0; i < exobj.length; i++) {
      s += exobj[i];
      if (i < (exobj.length - 1)) s += ",";
    }
  }
  return s;
}

function getParamsHashCode() {
  result = null;
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      result = tmpWin.paramsHashCode;
      if (result != null && typeof(result) != "undefined") break;
    }
  } else {
    result = paramsHashCode;
  }
  return result;
}

function setParamsHashCode(newParamsHashCode) {
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      tmpWin.paramsHashCode = newParamsHashCode;
    }
  } else {
    paramsHashCode = newParamsHashCode;
  }
}

function getSelectedIdArray() {
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (var i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      return tmpWin.selectedIdArray;
    }
  } else {
    return selectedIdArray;
  }
}

function setSelectedIdArray(newArray) {
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames["list"]) {
    var tmpWin = self.parent.frames["list"];
    if (tmpWin) {
      tmpWin.selectedIdArray = newArray;
    }
    tmpWin = self.parent.frames["nav"];
    if (tmpWin) {
      tmpWin.selectedIdArray = null;
    }
  } else {
    selectedIdArray = newArray;
  }
}


function setSelectedTitleArray(newArray) {
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames["list"]) {
    var tmpWin = self.parent.frames["list"];
    if (tmpWin) {
      tmpWin.selectedTitleArray = newArray;
    }
    tmpWin = self.parent.frames["nav"];
    if (tmpWin) {
      tmpWin.selectedTitleArray = null;
    }
  } else {
    selectedTitleArray = newArray;
  }
}


function getSelectedTitleArray() {
  if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
    var tmpWin;
    for (var i = 0; i < self.parent.frames.length; i++) {
      tmpWin = self.parent.frames[i];
      return tmpWin.selectedTitleArray;
    }
  } else {
    return selectedTitleArray;
  }
}

function isSelected() {
  var ar = getSelObjects();
  var vIsSelected = false;
  try {
    vIsSelected = (ar && ar.length > 0 && ar[0] != null && ar[0].length > 0);
  } catch(e) {
  }
  if (getSelectAllSelected() == "true") {
    vIsSelected = true;
  }
  return vIsSelected;
}

function prepareListAttrValues(gridType) {
  var form = self.document.forms["getCustomObjList"];
  var res = getSelObjects();
  if ((res[0] == null || res[0] == "") && getSelectAllSelected() != "true") {
    alert("Ни один объект не выбран.");
    return false;
  }
  var s = "";
  for (var i = 0; i < res[0].length; i++) {
    s += res[0][i];
    if (i < (res[0].length - 1)) s += ",";
  }
  form.elements["customObjList"].value = s;
  //	   alert("IN -> "+form.elements["customObjList"].value);
  if (gridType != null && gridType) form.elements["operation"].value = "getViewLinkMN";
  form.sessionParams.value = getSelectAllSelected();
  sendExceptionObjIds(form);
  form.submit();
}

function recieveListAttrValues() {
  var frame = null;
  if (isIE) {
    frame = self.document.frames["getObjListAttrVals"];
  } else {
    frame = self.frames["getObjListAttrVals"];
  }
  if (frame && frame.ar != null) {
    var Arr = frame.ar;
    gridDataArray = new Array();
    for (var i = 0; i < Arr.length; i++) {
      var gridMassiv = new Array();
      var gridNamesMassiv = new Array();
      for (var j = 0; j < Arr[i].length; j++) {
        var tmp = Arr[i][j];
        gridMassiv.push(tmp[1]);
        gridNamesMassiv.push(tmp[0]);
      }
      if (gridMassiv.length > 0 && gridNamesMassiv.length > 0) {
        var gridItem = new makeGridRow(gridNamesMassiv, gridMassiv)
        gridDataArray.push(gridItem);
      }
    }
  }
  selectObj(window, true, null, "false");
}

function selectObj(win, isClose, canDouble, selectAll, winIsOpener, cls) {
  if (isClose == null) isClose = true;
  if (selectAll == "true") {
    selectAllSelectObj('chooseFrame', 'ChooseForm', isClose, canDouble);
  } else {
    if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
      var result = false;
      if (winIsOpener) { // if win is allready opener
        ret = getSelObjects(true);
//				alert(ret[0].toString()+"\n\n"+ret[1].toString()+"\n\n"+((typeof(ret[2])!="undefined")?"ret[2] length= "+ret[2].length+"\n"+ret[2][0].toString():"- no grid data -") );
        var exist = self.parent.$(win.name);
        try {
          result = (exist && win.setLinkObj != null) ? ((canDouble != null) ? win.setLinkObj(ret, win, canDouble, cls) : win.setLinkObj(ret, win, null, cls)) : false;
          if (isClose && result) {
            if (exist && win.hideShadowForAll) win.hideShadowForAll();
            //	self.parent.close();
          }
        } catch(e) {
        }
      }
      else {
        ret = getSelObjects();
        var wo = self.parent.opener;
        result = (wo && !wo.closed && wo.setLinkObj != null) ? ((canDouble != null) ? wo.setLinkObj(ret, self.parent, canDouble) : wo.setLinkObj(ret, self.parent)) : false;
        if (isClose && result) {
          if (wo && !wo.closed && wo.hideShadowForAll) wo.hideShadowForAll();
          self.parent.close();
        }
      }
      return result;
    } else {
      ret = getSelObjects();
      var wo = window.opener;
      try {
        var result = (wo && !wo.closed && wo.setLinkObj != null) ? ((canDouble != null) ? wo.setLinkObj(ret, win, canDouble) : wo.setLinkObj(ret, win)) : false;
        if (isClose && result) {
          if (wo && !wo.closed && wo.hideShadowForAll) wo.hideShadowForAll();
          window.close();
        }
      } catch(e) {
      }
      return result;
    }
  }
}

function selectAllSelectObj(frameName, formName, isClose, canDouble) {
  var frame = getListFrame(frameName);
  var form = self.document.forms[formName];
  sendExceptionObjIds(form);
  form.isClose.value = isClose;
  form.canDouble.value = canDouble;
  form.submit();
}

function gridSelect(elementPrefix, hPrefix, attrName, objId, newClass, oldClass) {
  if (!elementPrefix)elementPrefix = "grid_";
  if (!hPrefix)hPrefix = "title_";
  if (!oldClass) oldClass = "";
  var element = document.getElementById(elementPrefix + attrName + objId);
  if (!element) return;
  var hElement = document.getElementById(hPrefix + attrName);
  var oldElement = (hElement && hElement.value != "") ? document.getElementById(elementPrefix + attrName + hElement.value) : null;

  var setNew = true;
  if (oldElement) {
    if (oldElement.id == element.id) setNew = false;
    oldElement.className = oldClass;
    hElement.value = "";
    if (window.showDelButInRow) window.showDelButInRow(oldElement, attrName, false);
  }
  if (setNew) {
    if (newClass) element.className = newClass;
    hElement.value = objId;
    if (window.showDelButInRow) window.showDelButInRow(element, attrName, true);
  }
  //        alert(hElement.value);
}

// choose folder function (for visual editor)
function fldSelFolder(obj, idField, titleField) {
  if (self.parent.nav.fldid != null) {
    self.parent.nav.fldid.value = obj[idField];
  }
}

function selFolder(obj, idField, titleField) {
  if (getSelectMode() != FOLDER_MODE) setSelectMode(FOLDER_MODE);
  prepareSelect(obj, FOLDER_MODE);
  setSelectMode(FOLDER_MODE);
  selId(obj, idField, titleField);
}

function selObject(obj, idField, titleField) {
  if (getSelectMode() != OBJECT_MODE) setSelectMode(OBJECT_MODE);
  if (doWithAll == 0) {
    prepareSelect(obj, OBJECT_MODE);
    setSelectMode(OBJECT_MODE);
    selId(obj, idField, titleField);
    // object choose for external application
    if (self.parent != null && self.parent.toolbar != null && self.parent.toolbar.selobjid != null) {
      self.parent.toolbar.selobjid.value = obj[idField];
    }
  }
  else {
    if (doWithAll == 1) {
      prepareSelect(obj, OBJECT_MODE);
      setSelectMode(OBJECT_MODE);
      selAllId(obj, idField, titleField);
      doWithAll = 2;
    }
  }
}

function selId(obj, idField, titleField) {
  if (!idField)idField = "value";
  if (!titleField)titleField = "title";
  exceptionIdArray = new Array();
  selectedIdArray = new Array();
  selectedTitleArray = new Array();
  if (self.getAllreadySelected) getAllreadySelected();
  if (selectAllSelected == "true") {// очищаем массивы ранее выбранных объектов
    selectedIdArray.length = 0;
    selectedTitleArray.length = 0;
  }

  var objects = document.getElementsByName(obj.name);
  if (objects.length == 0) return;
  if (objects[0].type == "checkbox") {
    for (var i = 0; i < objects.length; i++) {
      if (objects[i].checked) {
        if (selectAllSelected == "true") {
          if (contains(exceptionIdArray, objects[i][idField])) {
            exceptionIdArray.pop(objects[i][idField]);
          }
        }
        else {
          if (!contains(selectedIdArray, objects[i][idField])) {
            selectedIdArray.push(objects[i][idField]);
            selectedTitleArray.push(objects[i][titleField]);
          }
        }
      } else {
        if (selectAllSelected == "true") {
          if (!contains(exceptionIdArray, objects[i][idField])) {
            exceptionIdArray.push(objects[i][idField]);
          }
        } else {
          if (contains(selectedIdArray, objects[i][idField])) {
            selectedIdArray.pop(objects[i][idField]);
            selectedTitleArray.pop(objects[i][titleField]);
          }
        }
      }
    }
  } else if (objects[0].type == "radio") {
    if (!contains(selectedIdArray, obj[idField])) {
      selectedIdArray.push(obj[idField]);
      selectedTitleArray.push(obj[titleField]);
    }
  } else {
    if (!contains(selectedIdArray, obj[idField])) {
      selectedIdArray.push(obj[idField]);
      selectedTitleArray.push(obj[titleField]);
    }
  }

  //obj.blur();
  //	alert(selectedIdArray.length)
//  alert("selectAllSelected="+selectAllSelected+"-> ["+(selectAllSelected=="false")+"]\n\n"+self.showChoosenObjNumber);
  if (self.showChoosenObjNumber && selectAllSelected == "false") showChoosenObjNumber();
  if (self.setButtonState) setButtonState();
}

function selAllId(obj, idField, titleField) {
  if (!idField)idField = "value";
  if (!titleField)titleField = "title";
  selectedIdArray = new Array();
  selectedTitleArray = new Array();
  if (self.getAllreadySelected) getAllreadySelected();
  if (selectAllSelected == "true") {// очищаем массивы ранее выбранных объектов
    selectedIdArray.length = 0;
    selectedTitleArray.length = 0;
  }

  var objects = document.getElementsByName(obj.name);
  if (objects.length == 0 || objects[0].type != "checkbox") return;
  for (var i = 0; i < objects.length; i++) {
    if (doSetAll) {
      objects[i].checked = "true";
      //		alert("1-> ("+doSetAll+") "+objects[i].title);
      if (selectAllSelected == "true") {
        if (contains(exceptionIdArray, objects[i][idField])) {
          exceptionIdArray.pop(objects[i][idField]);
        }
      } else {
        if (!contains(selectedIdArray, objects[i][idField])) {
          selectedIdArray.push(objects[i][idField]);
          selectedTitleArray.push(objects[i][titleField]);
        }
      }
    }
    else {
      //		alert("2-> ("+doSetAll+") "+objects[i].title);
      if (selectAllSelected == "true") {
        if (!contains(exceptionIdArray, objects[i][idField])) {
          exceptionIdArray.push(objects[i][idField]);
        }
      } else {
        if (contains(selectedIdArray, objects[i][idField])) {
          selectedIdArray.pop(objects[i][idField]);
          selectedTitleArray.pop(objects[i][titleField]);
        }
      }
      objects[i].removeAttribute("checked");
    }
  }
  if (self.setButtonState) setButtonState();
}

function delLinksOnDelete(win, objId) {
  var attrName = getWinAttr(win);
  if (!attrName) return;
  var Sel = document.getElementById("title_" + attrName);
  var row = document.getElementById("grid_" + attrName);
  if (Sel == null) return;

  if (Sel.tagName == "SELECT" || (Sel.tagName == "INPUT" && row)) DelFromList(attrName, objId);
  else delLinkObj(attrName);
}
function fireOnChange(obj) {
  if (obj.fireEvent) {
    obj.fireEvent("onchange");
  } else if (obj.dispatchEvent) {
    var e = document.createEvent("HTMLEvents");
    e.initEvent("change", true, true);
    obj.dispatchEvent(e);
  } else if (obj.onchange) {
    obj.onchange();
  }
}
var updateToOpenerOpener = false;
function setLinkObj(ret, win, canDouble, cls) {
  if (updateToOpenerOpener) {
    var wo = win.opener;
    if (wo && !wo.closed) win = wo;
  }
  var attrName = getWinAttr(win, cls);
  if (!attrName) return false;
  if (ret != null) {
    Sel = document.getElementById("title_" + attrName);
    if (!Sel) return false;
    Hid = document.getElementById("id_" + attrName);
    var mgAttrName = Sel.getAttribute("megaGridAttr");
    // attrName аттрибута при создании или редактировании непосредственно в гриде
    if (mgAttrName != null) {
      attrName = mgAttrName;
    }
    if (canDouble == null) {
      canDouble2 = document.getElementById("dup_" + attrName);
      if (canDouble2 != null) canDouble = (canDouble2.value == "true");
    }
    var row = document.getElementById("grid_" + attrName);
    var isLinkNto1 = document.getElementById("isLinkNto1_" + attrName);
    if (!isLinkNto1) isLinkNto1 = document.getElementById("isLink1to1_" + attrName);
    var newop,_i,size;
    if (Sel.tagName == "SELECT") {
      var newoption,temp;
      var ret_1_List = ret[0];
      var ret_2_List = ret[1];
      var map = new HashMap();
      if (!canDouble) {
        for (var _x = 0; _x < Sel.length; _x++)
          map.put(Sel.options[_x].value, _x);
      }
      for (_i = 0,size = ret_1_List.length; _i < size; _i++) {
        temp = new Date().getTime();
        if (!canDouble && map.containsKey(ret_1_List[_i])) {
          Sel.options[map.get(ret_1_List[_i])].text = ret_2_List[_i];
          continue;
        }
        newop = document.createElement("OPTION");
        newop.value = ret_1_List[_i];
        newop.text = ret_2_List[_i];
        if (isIE) {
          newoption = Sel.add(newop);
        } else {
          newoption = Sel.add(newop, null);
        }
        Sel.selectedIndex = Sel.length - 1;
        removeFromHiddenDel(attrName, ret_1_List[_i]);
      }
      map.clear();
      ToHidden(Sel, Hid);
      if (Sel) {
        fireOnChange(Sel);
      }
      if (Hid) {
        fireOnChange(Hid);
      }
    } else if (Sel.tagName == "INPUT" && row) {
      var mainTable,thead,tbody,headTR;
      var table = row.parentNode;
      if (table.nodeName.toLowerCase() == "table") {
        mainTable = table;
        thead = mainTable.getElementsByTagName("thead").item(0);
        var htr = thead.getElementsByTagName("tr");
        headTR = htr[htr.length - 1];
      }
      else {
        mainTable = table.parentNode;
        thead = (table.nodeName.toLowerCase() == "thead") ? table : mainTable.getElementsByTagName("thead").item(0);
        headTR = row;
      }
      tbody = getNextSiblingTag(thead);
      table = null;
      var trElem, tdElem, txtNode;
      var tmpId;
      var rowsAmount = tbody.getElementsByTagName("TR").length;
      ret_1_List = ret[0];
      ret_2_List = ret[1];
      var gridArr = ret[2];
      if (isLinkNto1) {
        var trObj = tbody.getElementsByTagName("TR")[0];
        if (trObj) {
          var trObjId = trObj.getAttribute("objId");
          if (ret_1_List != trObjId) {
            document.getElementById("title_" + attrName).value = trObjId;
            DelFromList(attrName);
          }
        }
      }
      var gridTabIndexObj = isElemInArray(gridTabIndexArr, "name", attrName, 2);
      var gridLastTabIndex = (gridTabIndexObj != null) ? gridTabIndexObj.lastIndex : -1;
      var gridObjRows = (gridTabIndexObj != null) ? gridTabIndexObj.rows : 0;
      var gridNames,gridValues,ind,x;
      for (_i = 0,size = ret_1_List.length; _i < size; _i++) {
        tmpId = "grid_" + attrName + ret_1_List[_i];
        if (!canDouble) {
          trObj = document.getElementById(tmpId);
          if (!trObj) {
            var a = getObjectByAttr(tbody, "TR", "toId", ret_1_List[_i], 1);
            if (a != null) trObj = a[0];
          }
          if (trObj != null) {
            //        alert(tmpId +"   -  "+ _i +"  -  "+ret_1_List.length);
            if (gridArr == null || gridArr.length == 0) continue;
            gridNames = gridArr[_i].cName;
            gridValues = gridArr[_i].code;
            //						var trObj = document.getElementById(tmpId);
            var tdElems = trObj.getElementsByTagName("td");
            for (var _w = 0; _w < tdElems.length; _w++) {
              var cn = tdElems[_w].getAttribute("cName");
              if (cn == null || cn == "") continue;
              ind = contains(gridNames, cn, true);
              if (ind >= 0 && ind < gridValues.length) tdElems[_w].innerHTML = gridValues[ind];
            }
            continue;
          }
        }

        var isMadTable = false;
        // проверка грида на таблицу связки
        var isMadTable_field = document.getElementById("isMadTable_" + attrName);
        if (isMadTable_field != null && isMadTable_field.value == "true") isMadTable = true;

        trElem = document.createElement("tr");
        gridObjRows++;
        if (isMadTable) {
          if (typeof(ret_1_List[_i]) != "undefined") trElem.setAttribute("toId", ret_1_List[_i]);
        }
        trElem.setAttribute("id", tmpId);
        trElem.setAttribute("objId", ret_1_List[_i]);
        trElem.className = "gridRow";

        // var tableHead = mainTable.getElementsByTagName("thead")[0];
        // var headTR = thead.getElementsByTagName("tr")[0];
        var childs = headTR.childNodes;
        var tableCols = headTR.getElementsByTagName("td").length + headTR.getElementsByTagName("th").length;

        var insert_Rborder_Cell = true;
        var tdEmpty,txtEmpty;
        if (gridArr == null || typeof(gridArr[_i]) == "undefined" || childs == null) {
          var tdEmptyElem = document.createElement("td");
          var txtEmptyNode = document.createTextNode(" ");
          tdEmptyElem.appendChild(txtEmptyNode);
          trElem.appendChild(tdEmptyElem);
          tdEmptyElem.innerHTML = "&nbsp;";

          tdElem = document.createElement("td");
          tdElem.setAttribute("tabIndex", ((gridLastTabIndex < 0) ? -1 : gridLastTabIndex++));
          txtNode = document.createTextNode(ret_2_List[_i]);
          tdElem.appendChild(txtNode);
          trElem.appendChild(tdElem);
          if (gridLastTabIndex >= 0) {
            tdElem.onkeyup = function (event) {
              return prepareDoEditOnGridCell(event);
            }
          }
          for (x = 0; x < (tableCols - 3); x++) {
            tdEmpty = document.createElement("td");
            tdEmpty.setAttribute("tabIndex", ((gridLastTabIndex < 0) ? -1 : gridLastTabIndex++));
            txtEmpty = document.createTextNode(" ");
            tdEmpty.appendChild(txtEmpty);
            trElem.appendChild(tdEmpty);
            tdEmpty.innerHTML = "&nbsp;";
            if (gridLastTabIndex >= 0) {
              tdEmpty.onkeyup = function (event) {
                return prepareDoEditOnGridCell(event);
              }
            }
            tdEmpty = null;
            txtEmpty = null;
          }
        }
        else {
          gridNames = gridArr[_i].cName;
          gridValues = gridArr[_i].code;
          var rb_exist = false;
          for (x = 0; x < childs.length; x++) {
            var el = childs[x];
            if (el.nodeType != 1) continue;
            if (el.tagName.toUpperCase() == "SCRIPT") continue;
            if (el.className == "Lborder") {
              tdEmptyElem = document.createElement("td");
              txtEmptyNode = document.createTextNode(" ");
              tdEmptyElem.appendChild(txtEmptyNode);
              trElem.appendChild(tdEmptyElem);
              tdEmptyElem.innerHTML = "&nbsp;";
              continue;
            }
            if (el.className == "Rborder") {
              rb_exist = true;
              continue;
            }

            tdEmpty = document.createElement("td");
            if (el.getAttribute("cName") == null) ind = -1;
            else {
              var cName = el.getAttribute("cName");
              ind = contains(gridNames, cName, true);
            }
            if (ind == -1) {
              txtEmpty = document.createTextNode(" ");
              tdEmpty.appendChild(txtEmpty);
              tdEmpty.innerHTML = "&nbsp;";
            }
            else {
              if (typeof(gridNames[ind]) != "undefined") tdEmpty.setAttribute("cName", gridNames[ind]);
              //	alert(gridValues[ind]);
              tdEmpty.innerHTML = (typeof(gridValues[ind]) != "undefined") ? gridValues[ind] : "&nbsp;";
              tdEmpty.setAttribute("tabIndex", ((gridLastTabIndex < 0) ? -1 : gridLastTabIndex++));
            }
            trElem.appendChild(tdEmpty);
            if (gridLastTabIndex >= 0) {
              tdEmpty.onkeyup = function (event) {
                return prepareDoEditOnGridCell(event);
              }
            }
            tdEmpty = null;
            txtEmpty = null;
          }
          insert_Rborder_Cell = rb_exist;
        }
        if (insert_Rborder_Cell) {
          tdEmpty = document.createElement("td");
          tdEmpty.className = "Rborder";
          txtEmpty = document.createTextNode(" ");
          tdEmpty.appendChild(txtEmpty);
          trElem.appendChild(tdEmpty);
        }

        tbody.appendChild(trElem);
        tbody.lastChild.onclick = new Function("gridSelect('grid_','title_','" + attrName + "','" + ret_1_List[_i].replace(/'/g, "\\'") + "','silver','gridRow')");
        if (isLinkNto1) {
          Hid.value = ret_1_List[_i];
          //       Sel.value=ret[1];
        } else {
          Hid.value += "," + ret_1_List[_i];
        }
      }
      if (gridTabIndexObj != null) {
        gridTabIndexObj.rows = gridObjRows;
        gridTabIndexObj.lastIndex = gridLastTabIndex;
      }
      if (Sel) fireOnChange(Sel);
      if (Hid) {
        fireOnChange(Hid);
      }
      if (rowsAmount == 1 && tbody.getElementsByTagName("TR").length > 1) {
        if (self.removeNoDataGridRow) removeNoDataGridRow(mainTable);
      }
      if (!isIE && initScrollContentForMozz) {
        initScrollContentForMozz("grid_container_thead_" + attrName, "grid_container_tbody_" + attrName, "grid_container_" + attrName, true);
      }

    } else {
      Hid.value = ret[0];
      Sel.value = ret[1];
      if (Sel) fireOnChange(Sel);
      if (Hid) {
        fireOnChange(Hid);
      }
    }
    /*  if (Hid) {
     //fireOnChange(Hid);
     }   */
  }
  //for formSave
  //if (self.setChanged) self.setChanged();
  return true;
}

/*---------------------------------Functions both for objects and list of objects -----------------------*/

function getSm(selectFolders, selectObjects, multiSelect) {
  var sm = null;
  if (multiSelect) {
    if (selectFolders && selectObjects) {
      sm = "m";
      /* (Multi) */
    } else if (selectFolders) {
      sm = "mf";
      /* (MultiFolder) */
    } else {
      sm = "mo";
      /* (MultiObject) */
    }
  } else {
    if (selectFolders && selectObjects) {
      sm = "s";
      /* (Single) */
    } else if (selectFolders) {
      sm = "sf";
      /* (SingleFolder) */
    } else {
      sm = "so";
      /* (SingleObject) */
    }
  }
  return sm;
}

function escapeEx(str) {
  var ret = '';
  for (i = 0; i < str.length; i++) {
    var n = str.charCodeAt(i);
    if (n >= 0x410 && n <= 0x44F)
      n -= 0x350;
    else if (n == 0x451)
      n = 0xB8;
    else if (n == 0x401)
      n = 0xA8;
    if ((n < 65 || n > 90) && (n < 97 || n > 122) && n < 256) {
      if (n < 16)
        ret += '%0' + n.toString(16);
      else
        ret += '%' + n.toString(16);
    }
    else
      ret += String.fromCharCode(n);
  }
  return ret;
}

function getNewObjForm(attrName, folder, refClass, selectFolders, selectObjects, multiSelect, selectPage, curObj, curClass, curDs, multiBranches, gridType, prefix) {
  var queryParams = "";
  var formAttrs = null;
  if (typeof(DLA) != 'undefined' &&
      DLA.ajaxLinkAttrs[attrName] &&
      DLA.ajaxLinkAttrs[attrName].formAttrs) {
    formAttrs = DLA.ajaxLinkAttrs[attrName].formAttrs;
  } else if (typeof(Control) != 'undefined') {
    var control = Control.SimpleList.findById('id_' + attrName);
    if (control) {
      formAttrs = control.formAttrs;
    }
  }
  if (formAttrs) {
    for (var code in formAttrs) {
      queryParams = queryParams + "&queryParam(curObject." + code + ")=" + formAttrs[code];
    }
  }
  getNewObj(attrName, folder, refClass, selectFolders, selectObjects, multiSelect, selectPage,
      curObj, curClass, curDs, multiBranches, gridType, prefix, queryParams);
}

function getNewObj(attrName, folder, refClass, selectFolders, selectObjects, multiSelect, selectPage, curObj, curClass, curDs, multiBranches, gridType, prefix, queryParams) {
  var qAttr = true;
  getNewObjUnivers(attrName, folder, refClass, selectFolders, selectObjects, multiSelect, selectPage,
      curObj, curClass, curDs, multiBranches, gridType, prefix, qAttr, queryParams);
}

function getNewObjWithoutAttr(attrName, folder, refClass, selectFolders, selectObjects, multiSelect, selectPage, curObj, curClass, curDs, multiBranches, gridType, prefix, queryParams) {
  var qAttr = false;
  getNewObjUnivers(attrName, folder, refClass, selectFolders, selectObjects, multiSelect, selectPage,
      curObj, curClass, curDs, multiBranches, gridType, prefix, qAttr, queryParams);

}

function getNewObjUnivers(attrName, folder, refClass, selectFolders, selectObjects, multiSelect, selectPage, curObj, curClass, curDs, multiBranches, gridType, prefix, qAttr, queryParams) {
  var sm = getSm(selectFolders, selectObjects, multiSelect);
  var qAttrStr = "";
  if (qAttr) {
    qAttrStr = "&q(attr)=" + attrName;
  }
  if (curObj) {
    curObj = "&q(obj)=" + escapeEx(curObj) + qAttrStr;
  } else if (curClass && curDs) {
    curObj = "&q(cls)=" + curClass + "&q(ds)=" + curDs + qAttrStr;
  } else {
    curObj = "";
  }
  var selCls = "";
  if (refClass && refClass != "") {
    selCls = "&selCls=" + refClass;
  }
  if (!folder || folder == "null") {
    folder = "";
  }

  mb = "";
  if (multiBranches && multiSelect) mb = "&mb=1";

  gridt = "";
  if (gridType != null && gridType != "" && gridType) {
    gridt = "&gridt=1";
  }

  if (selectPage && selectPage.indexOf(".htm") == (selectPage.length - 4)) {
    selectPage = selectPage.substring(0, (selectPage.length - 4));
  }
  if (!queryParams) {
    queryParams = "";
  }
  var selectWindow = doOpenWindow(baseUrl + selectPage + '.htm?id=' + folder + selCls + '&sm=' + sm + gridt + mb + curObj + queryParams);
  var myAttrName = ((prefix == null) ? "" : prefix) + attrName;
  addWin(selectWindow, myAttrName, refClass);
}

function getObjSearch4Param(paramName, folder, refClass, selectFolders, selectObjects, selectPage, isMulti, curQuery, curObj) {
  var sm = getSm(selectFolders, selectObjects, isMulti);
  if (curQuery) {
    curQuery = "&paramQuery=" + curQuery;
    if (curObj) {
      curQuery = curQuery + "&paramObject=" + curObj;
    }
  } else {
    curQuery = "";
  }
  var selCls = "";
  if (refClass && refClass != "") {
    selCls = "&selCls=" + refClass;
  }

  var selectWindow = doOpenWindow(baseUrl + selectPage + '.htm?id=' + folder + selCls + '&sm=' + sm + curQuery);
  //    var selectWindow = window.open(baseUrl + selectPage + '.htm?id=' + folder + selCls + '&sm=' + sm + curQuery, "_blank", "height=" + getPopupWinHeight() + ",width=" + getPopupWinWidth() + ",status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,channelmode=no");
  addWin(selectWindow, paramName, refClass);
}

function createObj(attrName, id, refClass, refAttr, createPage, ds, updFunc, refLink, addParams, target, prefix, detail) {
  var dsStr = "";
  if (ds && ds != "null") {
    dsStr = "&ds=" + ds;
  }
  var detailStr = "";
  if (detail == false) {
    detailStr = "&detail=false";
  }
  var linkStr = "";
  if (refLink)
    linkStr = "&link=" + refLink;
  if (!addParams)
    addParams = "";
  // добавлена генерация случайного числа, чтобы исключить работу браузеров
  // на склеивание || запросов
  var guid = "&";
  for (var i = 0; i < 32; i++) {
    guid += parseInt(Math.random() * 16).toString(16);
  }

  var href = createPage + '.htm?id=' + id + '&cls=' + refClass + '&ra=' + refAttr + dsStr + linkStr + addParams + guid + detailStr;
  var createWindow = url(href, target);
  //var createWindow = doOpenWindow(baseUrl + createPage + '.htm?id=' + id + '&cls=' + refClass + '&ra=' + refAttr + dsStr + linkStr + addParams);
  //    var createWindow = window.open(baseUrl + createPage + '.htm?id=' + id + '&cls=' + refClass + '&ra=' + refAttr + dsStr + linkStr + addParams, "_blank", "height=" + getPopupWinHeight() + ",width=" + getPopupWinWidth() + ",status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,channelmode=no");

  var myAttrName = ((prefix == null) ? "" : prefix) + attrName;
  var winArrIndex = addWin(createWindow, myAttrName, refClass);
  if (updFunc)
    addUpdateFrameFunction(createWindow, updFunc);
  return winArrIndex;
}

function viewObj(id, newPage, urlCommon, updFunc, target, customID, objID) {
  var myId = (customID == null) ? id : customID;
  var el = document.getElementById(myId);
  if (!el) return false;
  //		var ar = el.value.split(",");
  //		if(ar.length > 1 || ar[0].length == 0) return false;
  //		var link = ar[0];
  var link = (objID == null) ? el.value : objID; // objID- id объекта открываемого на редактирование, передается при нажатии на кнопку редактирования в строке грида.
  if (objID != null) el.value = objID;
  if (link.length == 0) return false;
  link = link.replace(/\s/g, '%20');
  if (urlCommon == null) urlCommon = "";
  var href = newPage + '.htm?id=' + link + urlCommon;
  viewWindow = url(href, target);// doOpenWindow(href);
  //    viewWindow = window.open(baseUrl + newPage + '.htm?id=' + link + urlCommon, "_blank", "height=" + getPopupWinHeight() + ",width=" + getPopupWinWidth() + ",status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,channelmode=no");
  var ind = (customID == null) ? id.indexOf("_") : customID.indexOf("_");
  var aName = (customID == null) ? id.substring(ind + 1, id.length) : customID.substring(ind + 1, customID.length);
  var winArrIndex = addWin(viewWindow, aName);
  if (updFunc) {
    addUpdateFrameFunction(viewWindow, updFunc);
  }
  return winArrIndex;
}

function cropImg(id, baseURL, newPage, designCode) {
  viewWindow = window.open(baseURL + "util/image/CropImageUtil.sx?cmd=showCroper&objId=" + newPage + "&attrName=" + id + "&designCode=" + designCode, "_blank", "height=500,width=800,status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=no,channelmode=no");
  addWin(viewWindow, id);
}

function delLinkObj(attrName, message) {
  var Hid = document.getElementById("id_" + attrName);
  var changed = !!Hid.value;
  Hid.value = "";
  if (!message) {
    message = "";
  }
  var Sel = document.getElementById("title_" + attrName);
  Sel.value = message;
  //for formchange
  setChanged();
  if (changed) {
    //fire change events
    fireOnChange(Hid);
    fireOnChange(Sel);
  }
}

function move(attrName, Mod) {
  var Sel = document.getElementById("title_" + attrName);
  var Hid = document.getElementById("id_" + attrName);
  var row = document.getElementById("grid_" + attrName + Sel.value);
  if (!row) {
    Indx = Sel.selectedIndex;
    if (Mod) {
      if (Indx > 0) {
        tmpv = Sel[Indx].value;
        tmpt = Sel[Indx].text;
        tmps = Sel[Indx].style.color;
        Sel[Indx].value = Sel[Indx - 1].value;
        Sel[Indx].text = Sel[Indx - 1].text;
        Sel[Indx].style.color = Sel[Indx - 1].style.color;
        Sel[Indx - 1].value = tmpv;
        Sel[Indx - 1].text = tmpt;
        Sel[Indx - 1].style.color = tmps;
        Sel.selectedIndex = Indx - 1;
      }
    }
    else {
      if (Indx < Sel.length - 1 && Indx >= 0) {
        tmpv = Sel[Indx].value;
        tmpt = Sel[Indx].text;
        tmps = Sel[Indx].style.color;
        Sel[Indx].value = Sel[Indx + 1].value;
        Sel[Indx].text = Sel[Indx + 1].text;
        Sel[Indx].style.color = Sel[Indx + 1].style.color;
        Sel[Indx + 1].value = tmpv;
        Sel[Indx + 1].text = tmpt;
        Sel[Indx + 1].style.color = tmps;
        Sel.selectedIndex = Indx + 1;
      }

    }
  } else {
    if (Mod) {
      var prevNode = previousSibling(row);
      if (prevNode) {
        prevNode.parentNode.insertBefore(row, prevNode);
      }
    } else {
      var nextNode = nextSibling(row);
      if (nextNode)
        nextNode.parentNode.insertBefore(nextNode, row);
    }
  }
  ToHidden(Sel, Hid, row);
  //for formSave
  if (self.setChanged) setChanged();
}

function previousSibling(node) {
  var prevNode = node.previousSibling;
  if (prevNode != null && prevNode.nodeName[0] == "#") {
    prevNode = previousSibling(prevNode);
  }
  return prevNode;
}

function nextSibling(node) {
  var nextNode = node.nextSibling;
  if (nextNode != null && nextNode.nodeName[0] == "#") {
    nextNode = nextSibling(nextNode);
  }
  return nextNode;
}

function addToHiddenDel(attrName, objId) {
  if (objId == null || objId == "") return;
  var delHid = document.getElementById("del_id_" + attrName);
  if (delHid == null) return;
  var sel = "," + objId;
  delHid.value += sel;
}

function manageCheckBoxAttr(obj) {
  if (!obj || obj.tagName != "INPUT" && obj.type.toUpperCase() != "CHECKBOX") return;
  var val = obj.checked;
  var objId = obj.getAttribute("objId");
  if (!objId) return;
  var attrName = obj.getAttribute("attrName");
  if (!attrName) return;
  if (val) {
    removeFromHiddenDel(attrName, objId);
  } else {
    addToHiddenDel(attrName, objId);
  }
}


function removeFromHiddenDel(attrName, objId) {
  if (!objId) return;
  var delHid = document.getElementById("del_id_" + attrName);
  if (delHid == null) return;
  if (delHid.value == "") return;
  var arr = new Array();
  arr = delHid.value.split(",");
  if (contains(arr, objId)) arr.pop(objId);
  delHid.value = arr.join(",");
}

function DelFromList(attrName, objId) {
  var Sel = document.getElementById("title_" + attrName);
  var Hid = document.getElementById("id_" + attrName);
  var delHid = document.getElementById("del_id_" + attrName);


  var re = new RegExp("[, ]", "g");
  var str = Sel.value.replace(re, '');

  if (str == "") {
    if (objId != null && objId != "") var elId = objId;
    else return;
  }
  else var elId = Sel.value;
  var row = document.getElementById("grid_" + attrName + elId);

  if (Sel.tagName == "INPUT" && row) {
    var table = row.parentNode;
    table.removeChild(row);
    var str = Hid.value;
    var sel = "," + elId;

    Hid.value = Hid.value.substring(0, Hid.value.indexOf(sel)) + Hid.value.substring(Hid.value.indexOf(sel) + sel.length, Hid.value.length)
    if (delHid) {
      delHid.value += sel;
    }
    Sel.value = "";
  } else {
    i = 0;
    while (i < Sel.length) {
      if (Sel.options[i].selected) {
        if (delHid) {
          delHid.value += "," + Sel.options[i].value;
        }
        Sel.remove(i);
      }
      else ++i;
    }
    ToHidden(Sel, Hid);
  }
  //for formSave
  if (self.setChanged) setChanged();
  if (Hid && Hid.onchange) {
    Hid.onchange();
  }
  if (Sel && Sel.onchange) {
    Sel.onchange();
  }
}

function DelAllFromList(attrName) {
  var Sel = document.getElementById("title_" + attrName);
  var Hid = document.getElementById("id_" + attrName);
  i = 0;
  while (i < Sel.length) {
    Sel.remove(i);
  }
  ToHidden(Sel, Hid);
  if (self.setChanged) setChanged();
}

function resizeSelect(selId) {
  if (selId == null || selId == "") return;
  var sObj = document.getElementById(selId);
  if (sObj == null || sObj.tagName != "SELECT") return;
  var len = 1;
  for (var x = 0; x < sObj.length; x++) {
    var l = sObj.options[x].text.length;
    if (l > len) len = l;
  }
  sObj.style.width = len + 12 + "ex";
}

function postParamsPares(name, value) {
  this.name = name;
  this.value = value;
}

function sendPostInNewWindow(action, params, name, w, h) {
  var winName = (name == null || trim(name) == "") ? "myPostWin" : name;
  var width = (w == null || trim(w) == "") ? getPopupWinWidth() : w;
  var height = (h == null || trim(h) == "") ? getPopupWinHeight() : h;
  var win = window.open("", winName, "height=" + height + ",width=" + width + ",status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,channelmode=no");
  sendPostInWindow(action, params, win);
}


function sendPostInWindow(action, params, win) {
  if (action == null || params == null || win == null) return;
  if (typeof(params.length) == "undefined" || params.length == 0) return;

  var body = null;
  var formTag = null;
  if (isIE) {
    body = document.getElementsByTagName("body").item(0);
    formTag = document.createElement("FORM");
    formTag.target = win.name;
  } else {
    win.document.write('<html><head><base href="' + baseUrl + '"></head><body></body></html>');
    body = win.document.getElementsByTagName("body").item(0);
    formTag = win.document.createElement("FORM");
    formTag.target = "_self";
  }
  formTag.action = action;
  formTag.method = "POST";
  formTag.setAttribute("enctype", "multipart/form-data");
  formTag.setAttribute("encoding", "multipart/form-data");
  formTag.className = "eattrFrame";
  body.appendChild(formTag);
  for (var i = 0; i < params.length; i++) {
    makeInput(formTag, "hidden", params[i].name, params[i].value);
  }
  formTag.submit();
}


/*----------------------------------------------------------------------------------------------------------------*/

/*-----------------------------------------------modal window functions---------------------------------------*/

function addShadow(frame, tag) {
  if (frame == null) frame = self;
  var b = (!tag) ? frame.document.getElementsByTagName('body')[0] : tag;
  var o = frame.document.getElementById("overlay");
  if (frame.document.getElementById("overlay") == null) {
    var overlay = frame.document.createElement('iframe');
    overlay.setAttribute("frameborder", "no");
    overlay.setAttribute("scrolling", "no");
    overlay.setAttribute("id", "overlay");
    overlay.style.overflow = "hidden";
    if (browserInfo && browserInfo.isIE6) {
      //     overlay.src=setIE6iframeSrc();
    }
    b.appendChild(overlay);
    o = overlay;
  }
  return o;
}

function manageShadowForFrameset(frameset, mode) {
  var tmpWin;
  for (var x = 0; x < frameset.frames.length; x++) {
    tmpWin = frameset.frames[x];
//		alert(x+") "+tmpWin.location+"\nframeset->"+tmpWin.document.getElementsByTagName('frameset')[0]);
    if ((typeof(tmpWin.document.getElementsByTagName('frameset')[0]) == "undefined")) {
//			alert("have body");
      if (mode) {
        addShadow(tmpWin);
        showShadow(tmpWin);
      }
      else hideShadow(tmpWin);
    }
    else {
//			alert("have frameset");
      manageShadowForFrameset(tmpWin, mode);
    }
  }
}

function showShadowForAll() {
  if (!useModalWindows) return;
  var frameset = top;
  if (frameset.frames && frameset.frames.length > 0) {
    if (typeof(frameset.document.getElementsByTagName('body')[0]) != "undefined") {
      addShadow(frameset);
      showShadow(frameset);
    }
    else {
      manageShadowForFrameset(frameset, true);
    }
  }
  else {
    addShadow();
    showShadow();
  }
}

function hideShadowForAll() {
  if (!useModalWindows) return;
  var frameset = top;
  if (frameset.frames && frameset.frames.length > 0) {
    if (typeof(frameset.document.getElementsByTagName('body')[0]) != "undefined") {
      hideShadow(frameset);
    }
    else {
      var tmpWin;
      manageShadowForFrameset(frameset, false);
    }
  }
  else {
    hideShadow();
  }
}


/*
 function showShadowForAll() {
 if (!useModalWindows) return;

 if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
 if (typeof(self.parent.document.getElementsByTagName('body')[0]) != "undefined") {
 addShadow(self.parent);
 showShadow(self.parent);
 }
 else {
 var tmpWin;
 for (var x = 0; x < self.parent.frames.length; x++) {
 tmpWin = self.parent.frames[x];
 addShadow(tmpWin);
 showShadow(tmpWin);
 }
 }
 var pWin=self.parent;
 if (pWin.parent && pWin.parent!=pWin) {

 }
 }
 else {
 addShadow();
 showShadow();
 }
 }

 function hideShadowForAll() {
 if (!useModalWindows) return;
 if (self.parent && self.parent != self && self.parent.frames && self.parent.frames.length > 0) {
 if (typeof(self.parent.document.getElementsByTagName('body')[0]) != "undefined") {
 hideShadow(self.parent);
 }
 else {
 var tmpWin;
 for (h = 0; h < self.parent.frames.length; h++) {
 tmpWin = self.parent.frames[h];
 hideShadow(tmpWin);
 }
 }
 }
 else {
 hideShadow();
 }
 }*/

function showShadow(frame) {
  if (frame == null) frame = self;
  var s = frame.document.getElementById("overlay");
  if (s == null) {
    s = addShadow(frame);
//     s = frame.document.getElementById("overlay");
    if (s == null) return;
  }
  var _body = frame.document.body;
  var winWidth = _body.clientWidth;
  var winHeight = _body.clientHeight;
  var contentWidth = _body.scrollWidth;
  var contentHeight = _body.scrollHeight;

  s.style.width = (contentWidth > winWidth) ? contentWidth : winWidth;
  s.style.height = (contentHeight > winHeight) ? contentHeight : winHeight;
  s.style.display = "block";

  if (s.addEventListener) {
    s.addEventListener("focus", setFocusToModal, false);
    s.addEventListener("scroll", setFocusToModal, false);
  }
  else if (s.attachEvent) {
    s.attachEvent("onfocus", setFocusToModal);
    s.attachEvent("onscroll", setFocusToModal);
  }
}

function hideShadow(frame) {
  if (frame == null) frame = self;
  var s = frame.document.getElementById("overlay");
  if (s == null) return;
  s.style.display = "none";
  currentModalWin = null;
  if (s.removeEventListener) {
    s.removeEventListener("focus", setFocusToModal, false);
    s.removeEventListener("scroll", setFocusToModal, false);
  }
  else if (s.detachEvent) {
    s.detachEvent("onfocus", setFocusToModal);
    s.detachEvent("onscroll", setFocusToModal);
  }
  if (!(browserInfo && browserInfo.isIE6)) {
    var p = s.parentNode;
    if (p) p.removeChild(s);
  }
}

function setFocusToModal() {
  if (currentModalWin == null) return;
  currentModalWin.focus();
}

function doOpenWindow(urlToOpen) {
  var oWin = null;
  if (useModalWindows) {
    //		currentModalWin=(currentModalWin!=null)?currentModalWin:(self.opener && self.opener.currentModalWin) ? self.opener.currentModalWin : null;
    if (currentModalWin != null) {
      oWin = currentModalWin;
      oWin.location.replace(urlToOpen);
    }
    else {//oWin = window.showModelessDialog(urlToOpen,"","dialogHeight:"+getPopupWinHeight()+"px; dialogWidth:"+getPopupWinWidth()+"px; center: Yes; help: No; resizable: Yes; status: No;");
      oWin = window.open(urlToOpen, "_blank", "height=" + getPopupWinHeight() + ",width=" + getPopupWinWidth() + ",status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,channelmode=no");
      currentModalWin = oWin;
    }
    showShadowForAll();
    oWin.focus();
    handleModalLoad();
  }
  else {
    var idStr = "_blank";
    if (urlToOpen.indexOf("edit") != -1) {
      var specialSymbols = new Array("/", "@", ".", ",", "$", "&", "!", "?", ":", "*", "#", "+", ";", "_", "=", "-", "%40", "%");      //%40 = @
      var temp = urlToOpen.match("id=([^&]*)");
      if (temp != null && temp.length >= 2) {
        var path = baseUrl;
        idStr = path + temp[1];
        for (var i = 0; i < specialSymbols.length; i++) {
          idStr = replaceSubstring(idStr, specialSymbols[i]);
        }
      }
    }
    try {
      oWin = window.open(urlToOpen, idStr, "height=" + getPopupWinHeight() + ",width=" + getPopupWinWidth() + ",status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,channelmode=no");
      oWin.focus();
    } catch(e) {
      if (window.debug) {
        window.debug(e);
      }
    }
  }

  return oWin;
}

function handleModalLoad() {
  var mw = currentModalWin;
  if (mw.closed) {
    hideShadowForAll();
    return;
  }
  var mwbody = null;
  try {
    mwbody = mw.document.body;
  } catch(e) {
  }
  if (mwbody == null || mwbody.innerHTML == "") setTimeout("handleModalLoad()", 1000);
}

function doThisBeforeClose() {
  var psq = function(e) {
    var ev = window.event ? window.event : e;
    var arg = (document.getElementById('modified') != null) ? document.getElementById('modified').form : null;
    saveQuery(arg, ev);
  }
  if (isIE) document.body.onbeforeunload = psq;
  else window.onbeforeunload = psq;

  var func = new Function("var wo=window.opener; if(closeWinFlag==true && wo && !wo.closed && wo.hideShadowForAll) wo.hideShadowForAll();");
  onPerformUnload(window, func);
}

/*----------------------------------------------------------------------------------------------------------------*/

function prepareObjs(defVal) {
  var objects = null;
  objects = getSelObjects()[0];
  if (objects && objects.length > 0) {
    objects = objects.join(',');
  } else {
    objects = defVal;
    if (objects.indexOf("SXUser") == -1) return null;
  }
  $('__createPersCards_ids').value = objects;
  $('createPersCards').submit();
  return null;
}

function printF(wind) {
  wind.onblur = function() {
    wind.focus();
  }
  wind.focus();
  wind.print();
  wind.onblur = function() {
  }
}

//manage drop down text in articles (spoiler)
function manageSpoiler(obj, picOff, picOn) {
  if (!obj) return;
//	var pObj=obj.parentNode;
//	if (!pObj) return;
  var ddTextBody = getNextSiblingTag(obj);
  if (!ddTextBody) return;

  if (typeof(picOff) == "undefined" || picOff == null || picOff == "") picOff = "images/ad.gif";
  if (typeof(picOn) == "undefined" || picOn == null || picOn == "") picOn = "images/au.gif";
  var isClosed = (ddTextBody.style.display == "none");
  if (isClosed) {
    obj.style.background = "transparent url(" + picOn + ") no-repeat left center";
    //	obj.className="sp-head_opened";
    ddTextBody.style.display = "block";
  }
  else {
    obj.style.background = "transparent url(" + picOff + ") no-repeat left center";
    //	obj.className="sp-head_closed";
    ddTextBody.style.display = "none";
  }
}
function getCookie(name) {
  var kuki = document.cookie;
  var b = kuki.split(";");
  kuki = b.join("");
  var pares = kuki.split(" ");
  for (var i = 0; i < pares.length; i++) {
    var args = pares[i].split("=");
    if (args[0] == name) return args[1];
  }
  return null
}
function clearCookie(name, val) {
  if (val == null || val == "") val = getCookie(name);
  if (!val) val = "";
  var exp = new Date();
  exp.setTime(exp.getTime() - (24 * 60 * 60 * 1000));
  document.cookie = name + "=" + val + "; expires=" + exp.toGMTString() + "; path=/";
}
function setCookie(name, val, h) {
  if (isNaN(parseInt(h))) h = 1;
  var exp = new Date();
  exp.setTime(exp.getTime() + ((h + 3) * 60 * 60 * 1000));
  document.cookie = name + "=" + val + "; expires=" + exp.toGMTString() + "; path=/";
}

/**
 * Копирование данных формы в форму при переносе с помощью innerHTML
 * @param source откуда берем данные для копирования
 * @param dest куда копируем данные формы
 */
function copyFormToForm(source, dest) {
  var f1 = source;
  var f2 = dest;
  for (var i = 0; i < f1.elements.length; i++) {
    var el = f1.elements[i];
    if (el.value != null && el.value != '') {
      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;
        }
      }
    }
  }
}

function selectObjColor(attrName) {
  var attrValueField = document.getElementById('id_' + attrName);
  var attrColorField = document.getElementById('color_id_' + attrName);
  var attrColor = showModalDialog(baseUrl + 'scripts/selcolor.html', window, 'dialogWidth:370px;dialogHeight:240px;help:no;scroll:no;status:no');
  if (attrValueField) {
    attrValueField.value = attrColor;
  }
  if (attrColorField) {
    attrColorField.style.backgroundColor = attrColor;
  }
}
function manageLogin(path) {
  var loc = window.location;
  var curlink = ((typeof(window.baseUrl) != undefined) ? baseUrl.substring(0, baseUrl.length - 1) : loc.protocol + "//" + loc.host);
  var ind = curlink.indexOf("/", 8);
  curlink = ((ind == -1) ? curlink : curlink.substring(0, ind)) + loc.pathname;
  path = (!path) ? "" : path;
  var re = new RegExp(curlink, "gi");
  if (!re.test(path)) {
    var ref = (self == top) ? loc.href : top.location.href;
    //   setCookie("referer",ref);
    ref = ref.replace(/&/gi, "!");
    top.location = path + "?cmd=logout&back=yes&referer=" + ref;
  } else {
    showLoginFormReady = true;
  }
}

function execCommonUtil(frm, path, params, frame) {
  if (!path || typeof(path) != "string") {
    alert("Не указан путь к обработчику утилиты");
    return;
  }
  var form = (typeof(frm) == "string") ? $(frm) : frm;
  if (!form) {
    form = makeForm(((typeof(frm) == "string") ? frm : ""), null, path, ((!frame || typeof(frame) != "string") ? utilsIframeName : frame), null, null, null);
  }
  var objID_val = "";
  var field;
  if (params && (typeof(params) == "object")) {
    var name;
    for (name in params) {
      if (name == "folderID") objID_val = params[name];
      if (field = form.elements[name]) field.value = params[name];
      else makeInput(form, "hidden", name, params[name]);
    }
  }
  var sessParam_Value = "";
  if (getSelectAllSelected() == "true") {
    sessParam_Value = "true";
    sendExceptionObjIds(form);
  } else {
    var idArray = getSelObjects()[0];
    if (idArray && idArray.length > 0) {
      objID_val = idArray.join();
    }
    if (field = form.elements["objId"]) field.value = objID_val;
    else makeInput(form, "hidden", "objId", objID_val);
  }
  if (field = form.elements["sessionParams"]) field.value = sessParam_Value;
  else makeInput(form, "hidden", "sessionParams", sessParam_Value);
  form.submit();
}
