// некоторая нейтрализация различий браузеров
// плюс полезные DOM-утилитки

var browser;

if (document.all) {
  var ua = navigator.userAgent.toLowerCase();
  if (ua.indexOf('msie')) browser = "IE "+ua.substr(ua.indexOf('msie')+5,3);
//  window.resizeTo(winWidth, winHeight);
//  window.moveTo(winPosX, winPosY);
} else {
// support "parentElement"
HTMLElement.prototype.__defineGetter__("parentElement", function() {
    return (this.parentNode == this.ownerDocument) ? null : this.parentNode;
});
// support "innerText"
HTMLElement.prototype.__defineGetter__("innerText", function() {
    return this.textContent;
});
HTMLElement.prototype.__defineSetter__("innerText", function($value) {
    this.textContent = $value;
});
if ( window.Node )
Node.prototype.removeNode = function(removeChildren)
{
	var self = this;
        var node = this.parentNode;
	if (removeChildren)
	{
          while (self.childNodes.length > 0) self.childNodes[0].removeNode(true);
        }
	return node.removeChild(self);
}
}

function el(id) { return document.getElementById(id); } // сокращение :)

function execJS(node,cls) {
  var st = node.getElementsByTagName('SPAN');
  var strExec;
  for(var i=0;i<st.length; i++) {     
    if (st[i].className==cls) {
      strExec = st[i].innerHTML;
      curScript = st[i];
      try {
        eval(strExec);
      } catch(e) {
        alert(e);
      }
    }
  }
}

function eventTarget(e) {
  var targ;
  if (!e) var e = window.event;
  if (!e) return btnEventTarget;
  if (e.srcElement) targ = e.srcElement
  else if (e.target) targ = e.target
  else if (e.originalTarget) targ = e.originalTarget;
//  if (targ.nodeType == 3) targ = targ.parentNode; // Safari
  return targ;
}
function addslashes(str) {
  str=str.replace(/\\/g,'\\\\');
  str=str.replace(/\'/g,'\\\'');
//  str=str.replace(/\"/g,'\\"');
  str=str.replace(/\0/g,'\\0');
  str=str.replace(/&/g,'%26');
  return str;
}
function stripslashes(str) {
  str=str.replace(/\\'/g,'\'');
//  str=str.replace(/\\"/g,'"');
  str=str.replace(/\\\\/g,'\\');
  str=str.replace(/\\0/g,'\0');
  return str;
}
function addamp(str) {
  str=str.replace(/&/g,'%26');
  return str;
}
function addamph(str) {
  str=str.replace(/&/g,'%26');
  str=str.replace(/#/g,'%23');
  return str;
}

function preventDefault(e) 
{ 
  e.preventDefault? e.preventDefault() : e.returnValue = false; 
}
function cancelBubble(e) {
  if (!e) var e = window.event;
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
}

function ahah(url, target, post, fn, fne, delay) {
// исходная функция ahah() модифицирована для реальной жизни (~ac)
  var tn = document.getElementById(target);
  var req;
  try { req = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) {}

// в IE7 хвалёный "native XMLHTTPRequest object" НЕ ВСЕГДА работает при отключенном ActiveX, 
// а в IE8 beta2, похоже, ВСЕГДА НЕ работает, поэтому строка выше может не сработать по разным причинам...,
// попробуем еще раз - по старинке через ActiveX - он хотя бы выведет окошко с вопросом, если AciveX настроено "спрашивать".
  if (!req && window.ActiveXObject) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) {}

  if (req) {
    if (tn.tagName=='INPUT'||tn.tagName=='TEXTAREA') {
      tn.value = 'загружаю... ';
    } else {
      tn.innerHTML = '<img src="/e4a/loader2.gif"/> <b>загружаю... </b>';
    }
    req.onreadystatechange = function() {ahahDone(req, url, target, post, fn, fne, delay);};
    if(post&&post.length>0) {
      req.open("POST", url, true);
      req.send(""+post);
    } else {
      req.open("GET", url, true); // может кэшироваться
      req.send(null);
    }
  } else {
    if (tn.tagName=='INPUT') {
      tn.value = 'XMLHttpRequest не работает!';
    } else {
      tn.innerHTML = '<b style="color:red">XMLHttpRequest <a href="XHR.htm">не работает</a> !</b>';
    }
  }
}  

function ahah_xml(url, target, post, fn, fne, delay) {
// исходная функция ahah() модифицирована для реальной жизни (~ac)
  var tn = document.getElementById(target);
  var req;
  try { req = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) {}
  if (!req && window.ActiveXObject) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) {}

  if (req) {
    try{
    req.onreadystatechange = function() {ahahDone(req, url, target, post, fn, fne, delay);};
    if(post&&post.length>0) {
      req.open("POST", url, true);
      req.setRequestHeader('Content-Type', 'application/xml');
      req.send(""+post);
    } else {
      req.open("GET", url, true); // может кэшироваться
      req.send(null);
    }
    } catch(ex){};
  } else {
    if (tn.tagName=='INPUT') {
      tn.value = 'XMLHttpRequest не работает!';
    } else {
      tn.innerHTML = '<b style="color:red">XMLHttpRequest <a href="XHR.htm">не работает</a> !</b>';
    }
  }
}  

function sahah(url, target, post, fn, fne, delay) {
// то же, только синхронно
  var tn = document.getElementById(target);
  var req;
  if (tn) {
  if (tn.tagName=='INPUT') {
    tn.value = 'загружаю... ';
  } else {
    tn.innerHTML = '<img src="/e4a/loader2.gif"/> <b>загружаю... </b>';
  }
  }
  if (window.ActiveXObject) {
    req = new ActiveXObject("Microsoft.XMLHTTP");
  } else if (window.XMLHttpRequest) {
	try {
		if (netscape.security.PrivilegeManager.enablePrivilege) {
			netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
		}
	} catch (ex) { // eat it
	}
    req = new XMLHttpRequest();
  }
  if (req) {
//    req.onreadystatechange = function() {ahahDone(req, url, target, post, fn, fne, delay);};
    if(post&&post.length>0) {
      req.open("POST", url, false);
      req.send(""+post);
    } else {
      req.open("GET", url, false);
      req.send("");
    }
    return req.responseText;
  }
  return "none";
}  


function errMsg(target,url,str) {
  var tn = document.getElementById(target);
  if (str.length>0) {
    if (tn) {
    if (tn.tagName=='INPUT'||tn.tagName=='TEXTAREA') {
      tn.value = "Ошибка обращения к серверу ("+url+"): "+str;
    } else {
      tn.innerHTML="<font color='red'>Ошибка обращения к серверу ("+url+"):\n"+str+"</font>";
    } } else { // alert("Ошибка обращения к серверу ("+url+"): "+str); 
             }
  } else {
    if (tn.tagName=='INPUT'||tn.tagName=='TEXTAREA') {
      tn.value = '';
    } else {
      tn.innerHTML='';
    }
  }
}
function ahahDone(req, url, target, post, fn, fne, delay) {

  if (req.readyState == 4) { // 4 = "загружен", а 1..3 пропускаем
    if (req.status == 200 || req.status == 0) { // только при успешной загрузке по сети или локально
      var tn = document.getElementById(target);
      if (tn) {
      if (tn.tagName=='INPUT'||tn.tagName=='TEXTAREA') {
        tn.value = req.responseText;
      } else {
        tn.innerHTML = req.responseText;
      }
        if (fn) fn(req,tn,post);
//        if(tn.behavior) tn.removeBehavior(tn.behavior);
//        tn.behavior=tn.addBehavior('lib/utils/csshover2.htc');
      }
    } else {
      if (fne) { errMsg(target,url,''); fne(req); 
      } else { errMsg(target,url,req.statusText); }
    }
    if (delay) {
       setTimeout("ahah(url,target,post,fn,fne,delay)", delay); // resubmit after delay
    }
  }
}
function docSetDate1() {
  newTime=scwOutputDate1;
  docSetDate(el('scw1').title,newTime.scwFormat('YYYY-MM-DD'))
}
var scwOutputDate1;

function docChangeDate() {
  scwNextAction=docSetDate1.runsAfterSCW(this);
  scwShow(scwID('scw1'),scwID('scw1'));
}

function scwSetLanguage() {
             scwToday               = 'Сегодня:';
             scwDrag                = 'нажать для перетаскивания';
             scwArrMonthNames       = ['Янв','Фев','Мар','Апр','Май','Июн',
                                       'Июл','Авг','Сен','Окт','Ноя','Дек'];
             scwArrWeekInits        = ['В','П','В','С','Ч','П','С'];
             scwInvalidDateMsg      = 'The entered date is invalid.\n';
             scwOutOfRangeMsg       = 'The entered date is out of range.';
             scwDoesNotExistMsg     = 'The entered date does not exist.';
             scwInvalidAlert        = ['Invalid date (',') ignored.'];
             scwDateDisablingError  = ['Error ',' is not a Date object.'];
             scwRangeDisablingError = ['Error ',
                                       ' should consist of two elements.'];
}

function el(id) { return document.getElementById(id); } // сокращение :)

function artDraggable() {};

var drag = {
  isin: 0,
  mu: 0,
  cx: 0,
  cy: 0,
  testa: "test"
}

function mMouse(e) {
  if(window.event&&!window.Firefox) {
    drag.ix=window.event.clientX;
    drag.iy=window.event.clientY;
  } else {
    drag.ix=e.clientX;
    drag.iy=e.clientY;
  }
}

function mDragProxyOn(t) {
  var proxy=el('dragger');
  proxy.style.display="block";
  proxy.style.top=drag.y+"px";
  proxy.style.left=drag.x+"px";
  proxy.style.width=t.offsetWidth;
  proxy.style.height=t.offsetHeight;
  proxy.innerText=t.innerText;
  if (window.ActiveXObject) proxy.style.filter = "alpha(opacity=" + 0.7*100 + ")";
}
function stopDefault(e) { // см. также preventDefault :)
    if (e && e.preventDefault) {
        e.preventDefault();
    }
    else {
        if(window.event) window.event.returnValue = false;
    }
    return false;
}

function mDragStart(e) {
//  if(window.event.srcElement.tagName=='A') { window.event.srcElement=window.event.srcElement.parentNode; }

  if(drag.isin) return;
  // if(el('dragger').style.display=="block")return;

  var t=eventTarget(e);
//  if(t.className.indexOf('drag')<0) {return mClick(e);}

  if(t.className.indexOf('draghandle')<0) {
   //  if(t.tagName!='TD') return;
    if(t.tagName=='DIV') return; // как еще отличить scrollbar ?

    if(t.tagName=='A') { t=t.parentElement; }
  }

  if(!el('dragger')){var proxy=document.createElement('div');proxy.id='dragger';el('e4').appendChild(proxy);}

  mMouse(e);
  drag.ix1=drag.ix;
  drag.iy1=drag.iy;

// разрешим таскать только имена и номера элементов списков или явно заданные классы
  if(t.className.indexOf('draghandle')<0) {
    if(t.getElementsByTagName('A').length==0&&t.tagName=='TD') t=t.nextSibling;
    if(!t)return;
    if(t.getElementsByTagName('A').length==0) return;
  }
// здесь обычно tagName='TD'
  drag.el=t;
  if(t.previousSibling)
  drag.elId=parseInt(t.previousSibling.innerText)
  else drag.elId=parseInt(t.innerText); // документ
  drag.elClass=t.className;

  drag.x=drag.y=0;
  if (t.offsetParent) {
    drag.x=t.offsetLeft;
    drag.y=t.offsetTop;
    var obj=t;
    while (obj=obj.offsetParent) {
      drag.x+=obj.offsetLeft;
      drag.y+=obj.offsetTop;
    }
  }

  obj=t;
  while (obj.className.indexOf('container')==-1&&obj.parentElement) {
    obj=obj.parentElement;
  }
  if(obj)drag.elType=obj.id;

//  drag.cx=drag.ix-drag.x;
//  drag.cy=drag.iy-drag.y;
   drag.cx=drag.cy=-7; // просто сажаем на хвост курсору

  drag.isin=true;
  drag.vbub=0;
  drag.mu=document.onmouseup;
  drag.mo=document.onmousemove;
  document.onmouseup=mDragStop;
  document.onmousemove=mDragging;
//  window.event.cancelBubble=true;
  stopDefault(e);
  return false; // предотвращение работы drag'а как выделения текста ... не работает
};

var e4a_selection='';
var e4a_qauthor='';
var e4a_caretPos=0;

function saveSelection(e) {
    var sel=getSel();
    if(sel.length>0){
      e4a_selection=sel;
      var t=eventTarget(e);
      if(t) {
        var obj=t;
        while (obj&&obj.tagName!='TR') {
          obj=obj.parentElement;
        }
        if(obj&&obj.className.indexOf('sp_data')!=-1) 
        { var links=obj.cells[0].getElementsByTagName('A');
          if(links.length==0) { e4a_qauthor='автор';
            if(el('e4a_author_w')){e4a_qauthor=el('e4a_author_w').getElementsByTagName('A')[0].innerText;}
          } else {
            e4a_qauthor=links[0].innerText;
          }
        } else {
          if(el('e4a_author_w')){e4a_qauthor=el('e4a_author_w').getElementsByTagName('A')[0].innerText;
          } else { e4a_qauthor='автор';}
        }
      }
    }
}
function mMouseUp(e) {
  var t=eventTarget(e);
  if(t.tagName=='BUTTON')return;
  if(t.tagName=='IMG')return;
  saveSelection(e);
}

function treeDrop(listItemId,listItemText,listItemClass,treeItem) {
return; //сейчас не используется
  if(treeItem.className.indexOf('webfx-tree-row')==-1)treeItem=treeItem.parentElement;
  var posta='itemId='+listItemId+'&itemClass='+listItemClass+'&itemText='+listItemText+'&targetCategory='+treeItem.innerText+'&targetHref='+getItemHref(treeItem);
  ahah(artUrl+'addToCategory.e','none',posta,postProcess);
}

function leftListDropMsg(listEl,listItemText,leftListItem) {
  if(leftListItem.tagName=='DD') leftListItem=leftListItem.getElementsByTagName('A')[0];
  if(!leftListItem)return;
  var tr=listEl.parentElement;
  nodeAddClass(tr,'selected');
  curActive=tr;
  e4a_move_msg(listEl,leftListItem.href);
}

function mDragStop(e) {
  
  if(!drag.isin){mMouseUp(e);return;}

  var t=eventTarget(e);
  mMouse(e);
 
  document.onmouseup=drag.mu;
  document.onmousemove=drag.mo;
  drag.isin=false;
  var dropDenied=true;
  if(drag.dragover){dropDenied=drag.dragover.className.indexOf('dragover')==-1;}
  if(drag.dragover)drag.dragover.className=drag.dragover.className.replace(' dragover','');
  var proxy=el('dragger');
  proxy.style.display="none";

// маленькое перемещение драгом не считается :) - это дает возможность
// и нажимать на ссылки, и перемещать их как тексты

  if(Math.abs(drag.ix-drag.ix1)<5&&Math.abs(drag.iy-drag.iy1)<5) return;

// alert('drag stop '+t.tagName+' x:'+drag.ix+' y:'+drag.iy+' class:'+t.className);

  var obj=t;
  while (obj&&obj.className.indexOf('container')==-1&&obj.parentElement) {
    obj=obj.parentElement;
  }

  if(obj) {
  elType=obj.id;
//  if(!dropDenied){
    if(elType=='listPane'&&drag.elType=='leftList') {dispAddCorr(drag.elId,drag.el.innerText); return}
    if(elType=='accord'&&drag.elType=='listPane') {treeDrop(drag.elId,drag.el.innerText,drag.elClass,t); return}
    if(elType=='leftList'&&drag.elType=='listPane') {leftListDrop(drag.elId,drag.el.innerText,t); return}
    if(elType=='folders'&&drag.elType=='list') {leftListDropMsg(drag.el,drag.el.innerText,t); return}
//  }
//alert(elType+', '+drag.el.innerText+', '+drag.elId+', '+drag.elType);
  alert("Папка "+t.innerText.substr(0,100)+' ('+elType+'/'+t.className+') не принимает элементы типа '+drag.elClass+' ('+drag.elType+')');
  }
};
function elSelector(el) {
  var obj=el;
  var sel=obj.tagName+'.'+obj.className+'#'+obj.id;
  while (obj.className.indexOf('container')==-1&&obj.parentElement) {
    obj=obj.parentElement;
    sel=obj.tagName+'.'+obj.className+'#'+obj.id+ ' > '+sel;
  }
  sel=sel+"("+el.offsetWidth+","+el.offsetHeight+")";
  if(obj)elType=obj.id;
  return sel;
}
function mDragging(e){

  mMouse(e);

//  if(Math.abs(drag.ix-drag.ix1)<5&&Math.abs(drag.iy-drag.iy1)<5) return;

  var dr=el('dragger');
  var dro=eventTarget(e);

  mDragProxyOn(drag.el);

//alert(drag.iy+'-'+drag.cy);
  dr.style.top=drag.iy-drag.cy+'px';
  dr.style.left=drag.ix-drag.cx+'px';


  if(dro!=dr && dro) {
//    el('statusWindow').innerText=elSelector(dro);//dro.tagName+', '+dro.className;
    if(el('statusWindow')) el('statusWindow').innerText=dro.tagName+'.'+dro.className+' #'+dro.id;
    if(drag.dragover&&dro!=drag.dragover) {
      drag.dragover.className=drag.dragover.className.replace(' dragover','');
      //отметим цветом разрешенные для drop'а контейнеры - webfx-tree-row без no-action
      if(dro.className.indexOf('droptarget')>=0||dro.className=='webfx-tree-row'||(dro.className=='webfx-tree-item-label'&&dro.parentElement.className=='webfx-tree-row')){
        dro.className=dro.className+' dragover';
      }
    }
    drag.dragover=dro;
  }
//  window.event.cancelBubble=true;
//window.event.returnValue=false;
  return false; // предотвращение работы drag'а как выделения текста ... не работает
                // но предотвращает перетаскивание линков

}

var elType;
var elId;
var prevText;
var curEdit;
var curActive;

function getItemId(t) {
  var obj=t;
  while (obj.className.indexOf('container')==-1&&obj.parentElement) {
//    obj=obj.offsetParent;
    obj=obj.parentElement;
  }
  if(obj)elType=obj.id;
  elId=t.parentElement.previousSibling?t.parentElement.previousSibling.innerText:'0';
//  alert(elId+':'+elType);

}
function cancelEditItem(t) {
  if(!t)return;
  if(!t.parentElement)return;
  if(t.tagName=='INPUT') {
    if(prevText)t.parentElement.innerText=prevText;
  } else {
    var a=t.previousSibling;
    a.style.display='inline';
    t.blur();
    a.focus(); // не ставится (?)
    t.removeNode(true);
  }
  curEdit=null;
}

function sendTab(t) {
  t=t.nextSibling;
  while(t) {
    if(t.tagName=='INPUT'){t.focus();return}
    if(t.tagName=='BUTTON'){t.click();return}
    t=t.nextSibling;
  }
}

function applyEditItemSk(t) {
  if(t.tagName=='INPUT') {
    if(t.className!='editing'){sendTab(t);return;}
    t.blur();
    var cell=t.parentElement;
    var newText=t.value;
    cell.innerText=newText;
    var row=cell.parentElement;

    if(newText!=prevText) {
      if(elType=='listPane') {
        if(cell.className.indexOf('Цена')==0||cell.className.indexOf('Кол во')==0) {updatePrice(cell)}
                                            //^не нужно?
         else {if(cell.className.indexOf('Остаток')!=0)updateRem(row)
               else if(cell.className.indexOf('Остаток')==0)updateInvRem(row);
              };
      }

      if(elType=='docPane') updateDoc(cell);
    }

    curEdit=null;
  } else {
    var a=t.previousSibling;
    a.innerText=t.value;
    getItemId(a);
    if(elType=='leftList') updateCorr(elId,t.value);
    cancelEditItem(t);
  }
//  alert(elId+':'+elType);
}

function applyEditItem(t) {
  if(t.tagName=='INPUT') {
    if(t.id=='new_folder'){e4a_new_folder(t);return;}
    if(t.className!='editing'){sendTab(t);return;}
    t.blur();
    var cell=t.parentElement;
    var newText=t.value;
    if(t.parentElement.className.indexOf('bool')!=-1) {
      if(t.checked)cell.innerText=newText='да'; else cell.innerText=newText='нет';
    } else cell.innerText=newText;
    var row=cell.parentElement;

    if(newText!=prevText) {
      if(elType=='listPane') {
        if(cell.className.indexOf('Значение')==0) {ahahw('/updateIni.e','none','ini_name='+cell.id+'&ini_value='+newText,postProcess)}
      }
      if(elType=='detailsPane') {
        ahahw('/updateDB.e','none','db_name='+cell.id+'&db_value='+newText,postProcess);
      }
//      if(elType=='docPane') updateDoc(cell);
      if(elType=='e4') {
        ahahw('/e4a/updateItem.e',cell.id,'item_id='+cell.id+'&item_value='+newText+'&page='+el('e4a_pagename').innerText+'&ref='+location.pathname,postProcess);
      }
    }

    curEdit=null;
  } else {
    var a=t.previousSibling;
    a.innerText=t.value;
    getItemId(a);
    if(elType=='leftList') updateCorr(elId,t.value);
    cancelEditItem(t);
  }
//  alert(elId+':'+elType);
}


function toggleActiveItem(t) {
  if(!t)return;
  var a;
  if(t.tagName=='TR') {a=t} else {
    if(t.tagName=='A')t=t.parentElement;
    if(t.tagName!='TD')return;
    a=t.parentElement;
  }
  if(!(event.ctrlKey||ctrlKey)) {
    if(curActive) {
      curActive.className=curActive.className.replace(' selected','');
      curActive.className=curActive.className.replace('selected',''); //firefox
    }
    a.className=a.className+' selected';
    curActive=a;

  } else {
    if(a.className.indexOf('selected')==-1) a.className=a.className+' selected'
    else { a.className=a.className.replace(' selected','');
           a.className=a.className.replace('selected','');
         }
    curActive=null;
  }
//  a.scrollIntoView(false);
}

function setActiveItem(t) {

return;

  if(!t)return;
  var a;
  if(t.tagName=='TR') {a=t} else {
    if(t.tagName=='A')t=t.parentElement;
    if(t.tagName!='TD')return;
    a=t.parentElement;
  }
  if(!a)return;
  if(curActive==a)return; //уже и так активен

  if(!(event.ctrlKey||ctrlKey)) {
    // если Ctrl не нажат, то прежний активный деактивируем
    if(curActive) {
      nodeDelClass(curActive,'selected');
    }
  }
  nodeAddClass(a,'selected');
  curActive=a;
}

function runItem(curActive) {
  if(event.ctrlKey||ctrlKey)return;

  if(curActive.tagName=='TD')curActive=curActive.parentElement;
  if(curActive.tagName!='TR')return;
  var item=curActive.cells[0].getElementsByTagName('A')[0];
  if(!item)item=curActive.cells[1].getElementsByTagName('A')[0];
  if(!item)return;
  item.parentElement.focus();
  if(item.href.indexOf('~')>0)return;
  if(item.click) {
    item.click(); // firefox... "item.click is not a function"
  } else {
    window.location = item.href;
  }
}
function runActiveItem(t) {
  if(!curActive)return;
  runItem(curActive);
}

function makeLocalEditable(t) {
  var text=t.innerText;
  edit=document.createElement('input');
  if(t.className.indexOf('bool')!=-1) edit.type='checkbox';
  edit.className='editing';
  edit.style.width=(t.style.width?t.style.width:t.offsetWidth)-8;
  edit.style.height=(t.style.height?t.style.height:t.offsetHeight);
  prevText=t.innerText;
  t.innerText='';
  t.appendChild(edit);
  if(t.className.indexOf('bool')!=-1&&(text=='да'||text=='yes')) edit.checked=true;
  else edit.value=text;
  edit.scrollIntoView(false);
  curEdit=edit;
  edit.focus();
  edit.select();
  return edit;
}

function makeEditable(t) {
//  if(curEdit)cancelEditItem(curEdit);
  if(curEdit)applyEditItem(curEdit);
  setActiveItem(t);
  var text=t.innerText;
  if(t.tagName=='TD') {
    edit=document.createElement('input');
//    edit.style.zIndex=50;
//    edit.style.position='relative';
//    edit.style.top=-4;
    if(t.className.indexOf('bool')!=-1) edit.type='checkbox';
    edit.className='editing';
    edit.style.width=(t.style.width?t.style.width:t.offsetWidth)-8;
    edit.style.height=(t.style.height?t.style.height:t.offsetHeight);
    prevText=t.innerText;
    t.innerText='';
    t.appendChild(edit);
  } else {
    edit=document.createElement('textarea');
    edit.style.width=(t.parentElement.style.width?t.parentElement.style.width:t.parentElement.offsetWidth)-8;
    edit.style.height=t.parentElement.style.height?t.parentElement.style.height:t.parentElement.offsetHeight-4;
    edit.style.overflow='hidden';
    t.parentElement.appendChild(edit);
  }
  if(t.className.indexOf('bool')!=-1&&(text=='да'||text=='yes')) edit.checked=true;
  else edit.value=text;
  edit.scrollIntoView(false);
  if(t.tagName=='TD') { 
//alert(parseInt(prevText)+' '+t.className+' '+t.previousSibling.className);
    if(prevText.length<2&&(t.className.indexOf('Цена')==0||t.className.indexOf('Кол во')==0)&&t.previousSibling.className.indexOf('УчЦена')==0) {
      edit.value=Math.round(t.previousSibling.innerText*1.1*1.5);
    }
  }
  else { t.style.display='none'; }
  curEdit=edit;
  edit.focus();
  edit.select();
  return edit;
}
function editItem(t) {
  getItemId(t);
  if (elId==0) return;
  makeEditable(t);
}

function applyEditItemSide(t,tn) {
  var p=t.parentElement;
  if(p.tagName!='TD')return;
//  var tn=p.previousSibling;
  if(!tn)return;
  if(isNotEditable(tn))return;
  applyEditItem(t);
  if(elType=='docPane')return;
  makeEditable(tn);
}
function applyEditItemLeft(t) {
//  if(!t.parentElement.previousSibling)return;
  applyEditItemSide(t,t.parentElement.previousSibling);
}
function applyEditItemRight(t) {
//  if(!t.parentElement.nextSibling)return;
  applyEditItemSide(t,t.parentElement.nextSibling);
}
function applyEditItemUp(t) {
//  alert(t.parentElement.parentElement.rowIndex+','+t.parentElement.cellIndex);
  if(!t.parentElement.parentElement.previousSibling)return;
  if(!t.parentElement.parentElement.previousSibling.cells)return;
  applyEditItemSide(t,t.parentElement.parentElement.previousSibling.cells[t.parentElement.cellIndex]);
}
function applyEditItemDown(t) {
  if(!t.parentElement.parentElement.nextSibling)return;
  if(!t.parentElement.parentElement.nextSibling.cells)return;
  applyEditItemSide(t,t.parentElement.parentElement.nextSibling.cells[t.parentElement.cellIndex]);
}

var ctrlKey=false;

function previousSiblingRow(r) {
  var obj=r.previousSibling;
  if(!obj)return
  while (obj.tagName!='TR'&&obj.previousSibling) {
    obj=obj.previousSibling;
  }
  return obj;
}
function nextSiblingRow(r) {
  var obj=r.nextSibling;
  if(!obj)return
  while (obj.tagName!='TR'&&obj.nextSibling) {
    obj=obj.nextSibling;
  }
  return obj;
}

function keyHandler(e){
  if(!e)e=window.event;
  var unicode=e.charCode? e.charCode : e.keyCode;
  var t=eventTarget(e);
//  alert(unicode+','+t.tagName+','+t.id);

  if(t.tagName=='INPUT'&&unicode==13&&t.id=='isearch') {e4a_do_search();e.returnValue=false;} // ENTER в поиске

  if(!elType) {
    var obj=t;
    while (obj.className.indexOf('container')==-1&&obj.parentElement) {
      obj=obj.parentElement;
    }
    elType=obj.id;
  }

  if(t.id=='corrName')return;
  if(t.id=='tmName')return;
  if(t.tagName=='A'&&unicode==113) editItem(t); // F2
  if(t.tagName=='TEXTAREA'&&unicode==27) { cancelEditItem(t); e.returnValue=false; }
  if(t.tagName=='INPUT'&&unicode==27) { cancelEditItem(t); e.returnValue=false; } // ESC
  if(t.tagName=='TEXTAREA'&&unicode==13) { if(curEdit){applyEditItem(t); e.returnValue=false;} }
  if(t.tagName=='INPUT'&&unicode==13&&t.id=='searchWareI') { searchWare('searchWareI',e); e.returnValue=false; return;}
  if(t.tagName=='INPUT'&&unicode==13) { applyEditItem(t); e.returnValue=false; }

//  if(t.tagName=='INPUT'&&unicode==37) { applyEditItemLeft(t); e.returnValue=false; }
  if(t.tagName=='INPUT'&&unicode==38) { applyEditItemUp(t); e.returnValue=false; return;}
//  if(t.tagName=='INPUT'&&unicode==39) { applyEditItemRight(t); e.returnValue=false; }
  if(t.tagName=='INPUT'&&unicode==40) { applyEditItemDown(t); e.returnValue=false; return;}

  if(curActive) {
    if(curActive.tagName=='TR'&&unicode==38) { setActiveItem(previousSiblingRow(curActive)); curActive.scrollIntoView(false);e.returnValue=false; }
    if(curActive.tagName=='TR'&&unicode==40) { setActiveItem(nextSiblingRow(curActive)); curActive.scrollIntoView(false);e.returnValue=false; }
    if(curActive.tagName=='TR'&&unicode==13) { runActiveItem(curActive);e.returnValue=false; }
  }

  if(window.Firefox&&unicode==17) {ctrlKey=true;return}; //Ctrl в Firefox
//  if(unicode==46) {}; //DELETE

}
function keyUpHandler(e){
  if(!e)e=window.event;
  var unicode=e.charCode? e.charCode : e.keyCode;
//  var t=eventTarget(e);
//  alert(unicode+','+t.tagName+','+t.id);
  if(window.Firefox&&unicode==17) {ctrlKey=false;return}; //Ctrl up в Firefox
}

function installKeyHandlers() {
  document.onkeydown=keyHandler;
  document.onkeyup=keyUpHandler; // во встраиваемом браузере не приходит
}

function isNotEditable(t) {
//return true;
//return (t.tagName!='TD');
  return (t.className.indexOf('editable')==-1);
//&&t.className.indexOf('Цена')!=0&&t.className.indexOf('Кол во')!=0&&t.className.indexOf('Остаток')!=0);
}

function mClick(e) {
  var t=eventTarget(e);
  if(!window.event){window.event=e;window.Firefox=true;}
  if(el('debug')) {el('noop').innerText=elSelector(t)} else elSelector(t);
  if(t.tagName=='A')return;
  if(t.tagName=='INPUT')return;
  if(t.tagName=='SPAN')t=t.parentElement;
//  if(isNotEditable(t)){if(curEdit)cancelEditItem(curEdit);curEdit=null;setActiveItem(t);return;}

  if (mouseButton(e)=='RIGHT')return;
  if (t.className=='')return;

  if(isNotEditable(t))
  {if(curEdit)applyEditItem(curEdit);curEdit=null;setActiveItem(t);runItem(t);return;
  }
  var edit=makeEditable(t);
}

var postPostAction='';

function postProcess(req,tn,post) {
  postPostAction=post;
  execPostAction(tn);
}

//window.onbeforeunload=function(){return 'Вы уверены, что хотите уйти с этой страницы? Несохраненные данные будут потеряны!';};

function tick() {
  el('statusWindow').innerText=Date();
}
function mainDate() {
  var d=el('repDate').innerText;
  return d.substr(6,4)+'-'+d.substr(3,2)+'-'+d.substr(0,2);
}
function setMainDate(){
  alert(' Дата отчетов изменена. Все следующие отчеты будут на '+mainDate()+'.');
}
function showMainDate(){
  scwNextAction=setMainDate.runsAfterSCW(this);
  scwShow(scwID('repDate'),scwID('repDate'));
}
function showDueDate(){
//  scwNextAction=setMainDate.runsAfterSCW(this);
  JACS.show(el('dueDate'),el('dueDate'));
}

function startComet() {
  var rem = document.createElement("div");
  rem.innerHTML = '<iframe style="display:none" src="/internal/comet" id="comet" name="comet"></iframe>';
//  rem.style.height="30px";
  document.body.appendChild(rem);
}
//setTimeout("startComet()",5000);

function resizeTableTo(h){
  if(!el('accord'))return;
  el('accord').style.height=h;
  el('listPane').style.height=h;
  el('accord2').style.height=h;
//  el('listPane').style.width=el('listPane').parentElement.offsetWidth+'px';
};
function resizeTable() { resizeTableTo(el('leftTree').offsetHeight-3); };

//setTimeout("document.body.onresize=resizeTable",1000);

var wSizeH=0;
var wAhahwTargets=new Array();

function ahahw(url, target, post, fn, fne, delay) {
  var lt=el('leftTree');
  if(lt)wSizeH=lt.offsetHeight;
  var tn = document.getElementById(target);
  if(!tn) {target='none';tn = document.getElementById(target);}
//  tn.title=url;
  wAhahwTargets[target]="javascript:ahahw('"+url+"','"+target+"','"+post+"');alert('reloaded')";
  var req;
  try { req = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) {}

  if (!req && window.ActiveXObject) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) {}

  if (req) {
    if (tn.tagName=='INPUT') {
      tn.value = 'загружаю... ';
    } else {
//      tn.innerHTML = '<img src="/e4a/loader2.gif"/> <b>загружаю... </b>';
    }
    req.onreadystatechange = function() {ahahDonew(req, url, target, post, fn, fne, delay);};
    if(post&&post.length>0) {
      req.open("POST", url, true);
      req.send(""+post);
    } else {
      req.open("GET", url, true); // может кэшироваться
      req.send(null);
    }
  } else {
    if (tn.tagName=='INPUT') {
      tn.value = 'XMLHttpRequest не работает!';
    } else {
      tn.innerHTML = '<b style="color:red">XMLHttpRequest <a href="XHR.htm">не работает</a> !</b>';
    }
  }
}  
function ahahDonew(req, url, target, post, fn, fne, delay) {

  if (req.readyState == 4) { // 4 = "загружен", а 1..3 пропускаем
    if (req.status == 200 || req.status == 0) { // только при успешной загрузке по сети или локально
      var tn = document.getElementById(target);
      if (tn) {
      if (tn.tagName=='INPUT') {
        tn.value = req.responseText;
      } else {
        tn.innerHTML = req.responseText;
        resizeTableTo(wSizeH-1);
        document.body.onresize=resizeTable;
      }
        if (fn) fn(req,tn,post);
      }
    } else {
      if (fne) { errMsg(target,url,''); fne(req); 
      } else { errMsg(target,url,req.statusText); }
    }
    if (delay) {
       setTimeout("ahah(url,target,post,fn,fne,delay)", delay); // resubmit after delay
    }
  }
}

var winWidth=514; 
var winHeight=396;
var winPosX=screen.width/2-winWidth/2;
var winPosY=screen.height/2-winHeight/2;
var formId=0;
var curNode=null;
var curScript=null;
var changes=0;
var btnEventTarget;
	
function execPreAction(node) { 
  execJS(node,'pre');
  if (node.getElementsByTagName('INPUT')[0]) node.getElementsByTagName('INPUT')[0].focus();
  changes=0;
}
function execPostAction(node) { execJS(node,'post'); }

function setCurNode(formId) {
  curNode.className="mainh";
  curNode=document.getElementsByTagName('div')[formId];
  curNode.className="main";
  execPreAction(curNode);
}
function prevFormDo() {
  if (document.getElementsByTagName('div')[formId-1]!=null) {
    formId=formId-1;
    while(document.getElementsByTagName('div')[formId].className!='mainh') formId=formId-1;
    setCurNode(formId);
    document.getElementById('btn_next').disabled=false;
  }
}
function nextFormDo() {
  if (eventTarget().id=='btn_back') { prevFormDo(); return }
  if (document.getElementsByTagName('div')[formId+1]!=null) {
    formId=formId+1;
    while(document.getElementsByTagName('div')[formId].className!='mainh') formId=formId+1;
    setCurNode(formId);
    document.getElementById('btn_back').disabled=false;
  }
}
function subFormDo(n) {
  if (!n) n=1;
  if (document.getElementsByTagName('div')[formId+1]!=null) {
    formId=formId+1;
    if(document.getElementsByTagName('div')[formId].className!='subh') { formId=formId-1; return }
    formId=formId+(n-1);
    setCurNode(formId);
    document.getElementById('btn_back').disabled=true;
    document.getElementById('btn_next').disabled=true;
  }
}
function subFormReturn() {
  if (document.getElementsByTagName('div')[formId-1]!=null) {
    formId=formId-1;
    while(document.getElementsByTagName('div')[formId].className!='mainh') formId=formId-1;
//    setCurNode(formId);
    curNode.className="subh";
    curNode=document.getElementsByTagName('div')[formId];
    curNode.className="main";
    execPreAction(curNode);
    document.getElementById('btn_back').disabled=false;
    document.getElementById('btn_next').disabled=false;
  }
}

function nextForm(event) {
  try { window.event=event; } catch(err){};
  execPostAction(curNode);
}

function prevForm(event) {
  try { window.event=event; } catch(err){};
  execPostAction(curNode);
}


function postForm(url,fn,target,fne) {
  var form=curNode.getElementsByTagName('INPUT');
  var strForm='';
  var strValLen=0;
  for(var i=0;i<form.length; i++) {
    if (form[i].type) {
    if (form[i].type=="radio"||form[i].type=="checkbox") {
      if (form[i].checked) {
        strForm=strForm+form[i].name+"="+form[i].value+"&";
        strValLen++;
      }
    } else {
      strForm=strForm+form[i].name+"="+form[i].value+"&";
      strValLen+=form[i].value.length;
    }
    }
  }
  if (strValLen==0) { alert("Вы не заполнили поля формы!"); return; }
  if(changes==0) {if(fn){fn()};return;} //не менять ini, если поля не менялись
  btnEventTarget=eventTarget();
  if(!target)target='noop';
  ahah(url,target,strForm,fn,fne);
}

function postForm2(node,url,fn,fne) {
  var form=node.getElementsByTagName('INPUT');
  var strForm='';
  var strValLen=0;
  for(var i=0;i<form.length; i++) {
    if (form[i].type) {
    if (form[i].type=="radio"||form[i].type=="checkbox") {
      if (form[i].checked) {
        strForm=strForm+form[i].name+"="+form[i].value+"&";
        strValLen++;
      }
    } else {
      strForm=strForm+form[i].name+"="+addslashes(form[i].value)+"&";
      strValLen+=form[i].value.length;
    }
    }
  }
  form=node.getElementsByTagName('TEXTAREA');
  for(var i=0;i<form.length; i++) {
      strForm=strForm+form[i].name+"="+addslashes(form[i].value)+"&";
      strValLen+=form[i].value.length;
  }
  if (strValLen==0) { alert("Вы не заполнили поля формы!"); return; }
//  if(changes==0) {if(fn){fn()};return;} //не менять ini, если поля не менялись
//  btnEventTarget=eventTarget();
  ahah(url,'noop',strForm,fn,fne);
}

function postFormTo(node,url,fn,fne,tnode) {
  var form=node.getElementsByTagName('INPUT');
  var strForm='';
  var strValLen=0;
  for(var i=0;i<form.length; i++) {
    if (form[i].type) {
    if (form[i].type=="radio"||form[i].type=="checkbox") {
      if (form[i].checked) {
        strForm=strForm+form[i].name+"="+form[i].value+"&";
        strValLen++;
      }
    } else {
      strForm=strForm+form[i].name+"="+addamp(form[i].value)+"&";
      strValLen+=form[i].value.length;
    }
    }
  }
  form=node.getElementsByTagName('TEXTAREA');
  for(var i=0;i<form.length; i++) {
      strForm=strForm+form[i].name+"="+addamp(form[i].value)+"&";
      strValLen+=form[i].value.length;
  }
  if(el('dueDate')) strForm=strForm+"e4a_due="+el('dueDate').innerText;
  if (strValLen==0) { alert("Вы не заполнили поля формы!"); return; }
  ahah(url,tnode,strForm,fn,fne);
}

function postForm3(node,url,fn,fne) {
  postFormTo(node,url,fn,fne,'noop')
}

function postUpdate(url,id,fn) {
  var form=curNode.getElementsByTagName('INPUT');
  var strForm='';
  var strValLen=0;
  for(var i=0;i<form.length; i++) {
    if (form[i].type) {
    if (form[i].type=="radio"||form[i].type=="checkbox") {
      if (form[i].checked) {
        strForm=strForm+form[i].name+"="+form[i].value+"&";
        strValLen++;
      }
    } else {
      strForm=strForm+form[i].name+"="+form[i].value+"&";
      strValLen+=form[i].value.length;
    }
    }
  }
  if (strValLen==0) { alert("Вы не заполнили поля формы!"); return; }
  if(changes==0) {fn();return;} //не менять ini, если поля не менялись
  btnEventTarget=eventTarget();

  var strOldVal='';
  var tn=el(id);
  var it=tn.childNodes[0].childNodes[0];
  for(var i=0;i<it.cells.length; i++) {
    strOldVal=strOldVal+"OLD_"+it.cells[i].className+"="+it.cells[i].innerText+"&";
  }
  strForm=strForm+strOldVal;

  ahah(url,'noop',strForm,fn);
}


function setFormValues(req) {
  var iniValues=req.responseText.split(';');
  var inputs=curNode.getElementsByTagName('INPUT');
  for(var i=0;i<iniValues.length; i++) {
    if (inputs[i].type=="radio") {
      if (inputs[i].value==iniValues[i]) {
        inputs[i].checked="checked";
        inputs[i].click(); // отработка зависимых элементов
      }
    } else {
      inputs[i].value=iniValues[i];
    }
  }
  document.getElementById('noop').innerHTML='';
  curNode.getElementsByTagName('INPUT')[0].select();
  changes=0;
}

function okFunc() {
  alert('OK');
}
function el_hide(id) {
  var e=el(id);
  if(e) e.style.display='none';
}
function el_show_i(id) {
  var e=el(id);
  if(e) e.style.display='inline';
}
function el_show_b(id) {
  var e=el(id);
  if(e) e.style.display='block';
}
function el_toggle(id) {
  var e=el(id);
  if(e) {
    if (e.style.display=='none')
      e.style.display='block'
    else
      e.style.display='none';
  }
}
function nodeAddClass(e,cls) {
  e.className=e.className+' '+cls;
}
function elAddClass(id,cls) {
  var e=el(id);
  nodeAddClass(e,cls);
}
function nodeDelClass(e,cls) {
  e.className=e.className.replace(' '+cls,'').replace(cls,'');
}
function elDelClass(id,cls) {
  var e=el(id);
  nodeDelClass(e,cls);
}
function nodeToggleClass(e,cls) {
  if(e.className.indexOf(cls)<0) nodeAddClass(e,cls); else nodeDelClass(e,cls);
}
function elToggleClass(id,cls) {
  var e=el(id);
  nodeToggleClass(e,cls);
}
function delCook()
{C=document.cookie.split("; ");
for(d="."+location.host;d;d=(""+d).substr(1).match(/\..*$/))
for(sl=0;sl<2;++sl)
for(p="/"+location.pathname;p;p=p.substring(0,p.lastIndexOf('/')))
for(i in C)if(c=C[i])
{coo=c+"; domain="+d.slice(sl)+"; path="+p.slice(1)+"/"+"; expires="+new Date((new Date).getTime()-1e11).toGMTString();
document.cookie=coo}
};

function Set_Cookie( name, value, expires, path, domain, secure ) {
  var today = new Date();
  today.setTime( today.getTime() );

  if ( expires ){expires = expires * 1000 * 60 * 60 * 24;}
  var expires_date = new Date( today.getTime() + (expires) );

  document.cookie = name + "=" +escape( value ) +
  ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
  ( ( path ) ? ";path=" + path : "" ) +
  ( ( domain ) ? ";domain=" + domain : "" ) +
  ( ( secure ) ? ";secure" : "" );
};
function getCaretPosition (ctrl) {
	var CaretPos = 0;	// IE Support
	if (document.selection) {
	ctrl.focus ();
		var Sel = document.selection.createRange ();
		Sel.moveStart ('character', -ctrl.value.length);
		CaretPos = Sel.text.length;
	}
	// Firefox support
	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
		CaretPos = ctrl.selectionStart;
	return (CaretPos);
}
function setCaretPosition(ctrl, pos){
	if(ctrl.setSelectionRange)
	{
		ctrl.focus();
		ctrl.setSelectionRange(pos,pos);
	}
	else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}

function center(element){
    try{
        element = el(element);
    }catch(e){
        return;
    }

    var my_width  = 0;
    var my_height = 0;

    if ( typeof( window.innerWidth ) == 'number' ){
        my_width  = window.innerWidth;
        my_height = window.innerHeight;
    }else if ( document.documentElement && 
             ( document.documentElement.clientWidth ||
               document.documentElement.clientHeight ) ){
        my_width  = document.documentElement.clientWidth;
        my_height = document.documentElement.clientHeight;
    }
    else if ( document.body &&
            ( document.body.clientWidth || document.body.clientHeight ) ){
        my_width  = document.body.clientWidth;
        my_height = document.body.clientHeight;
    }

    element.style.position = 'absolute';
    element.style.zIndex   = 99;

    var scrollY = 0;

    if ( document.documentElement && document.documentElement.scrollTop ){
        scrollY = document.documentElement.scrollTop;
    }else if ( document.body && document.body.scrollTop ){
        scrollY = document.body.scrollTop;
    }else if ( window.pageYOffset ){
        scrollY = window.pageYOffset;
    }else if ( window.scrollY ){
        scrollY = window.scrollY;
    }

    var setX = ( my_width  - element.clientWidth  ) / 2;
    var setY = ( my_height - element.clientHeight ) / 2 + scrollY;

    setX = ( setX < 0 ) ? 0 : setX;
    setY = ( setY < 0 ) ? 0 : setY;

    element.style.left = setX + "px";
    element.style.top  = setY + "px";

    element.style.display  = 'block';
}




function login() {
  el_show_i('e4a_login');
  ahah('/e4a/login.e','e4a_login','url='+addamph(location.href),postProcess);
}
function cancel_login() {
  el('e4a_login_button').innerHTML='Вход';
  el('e4a_login_button').onclick=login;
  el_hide('e4a_login');
  el_show_i('e4a_alogged');
}
function logout() {
  ahah('/e4a/logout.e','e4a_login','url='+addamph(location.href),postProcess);
}
function init_dialogs() {
  if(!el('e4a_overlay')){
    var over=document.createElement('div');
    over.id='e4a_overlay';
    over.onclick=e4a_close;
    over.style.display='none';
    el('e4').appendChild(over);
  }
  if(!el('e4a_over')){
    var over2=document.createElement('div');
    over2.id='e4a_over';
    el('e4').appendChild(over2);
  }
  if(!el('e4a_dialog')){
    var dialog=document.createElement('div');
    dialog.id='e4a_dialog';
    dialog.style.display='none';
    var img=document.createElement('img');
    img.id='e4a_cls'; img.src='/e4a/close.gif';
    img.alt="Закрыть"; img.title="Закрыть окно";
    img.onclick=e4a_close;
    dialog.appendChild(img);
    var box=document.createElement('div');
    box.id='e4a_box';
    dialog.appendChild(box);
    el('e4').appendChild(dialog);
  }
}
function register() {
//  alert('Извините, регистрация новых пользователей временно не производится.');
  init_dialogs();
  el_show_b('e4a_overlay');
  ahah('/e4a/reg_email.e','e4a_box','url='+addamph(document.URL),postProcess);
}
function recall(email) {
  if(!email) {
    var email=prompt('Введите ваш Email или логин','me@domain.tld');
  } else { e4a_close(); }
  ahah('/e4a/recall.e','e4a_over','email='+email+'&url='+addamph(document.URL),postProcess);
}
function pwreset() {
  var pw=prompt('Введите новый пароль (минимум 8 символов)');
  if(!pw) {alert('Вы ничего не ввели, старый пароль сохранен.');return;}
  if(pw.length<8) {alert('Слишком короткий пароль.');return;}
  ahah('/e4a/pwreset2.e','e4a_result','pw='+pw+'&email='+el('email').innerText+'&token='+el('token').innerText+'&url='+addamph(document.URL),postProcess);
}
function confirm_email() {
  ahah('/e4a/confirm2.e','e4a_result','email='+el('email').innerText+'&token='+el('token').innerText+'&url='+addamph(document.URL),postProcess);
}
function e4a_temp_off() {
  alert('Извините, функция временно недоступна.');
}
function e4a_close() {
  el_hide('e4a_overlay');
  el_hide('e4a_dialog');
}
function checkEmail(email) {
  var filter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
  return filter.test(email);
}
function e4a_check_email() {
//  ahah('/e4a/check_email.e','e4a_box','url='+document.URL,postProcess);
  var email=el('emailAddress').value;
  if(!checkEmail(email)) {
    alert(email+' не похоже на Email...');
    el('emailAddress').focus();
    return;
  }
  postFormTo(el('regTable'),'/e4a/check_email.e',postProcess,tryAgain,'e4a_box');
}
function e4a_is_valid_email() {
  var email=el('emailAddress').value;
  if(!checkEmail(email)) {
    alert(email+' не похоже на Email...');
    el('emailAddress').focus();
    return;
  }
  postFormTo(el('regTable'),'/e4a/is_valid_email.e',postProcess,tryAgain,'e4a_is_valid');
}

function e4a_login_constraints(login) {
  if(login.length<5){return "Не меньше 5 символов!"};
  var filter = /^([a-zA-Z0-9_.-])+$/;
  if (!filter.test(login)) {return "Только буквы (лат) и цифры!"};
  return "";
}
function e4a_check_login(e) {
  if (!e) var e = window.event;
  var i=eventTarget(e);
  el('login_check_res').innerHTML='';
  if(i.value.length==0)return; // можно не указывать логин, будет использоваться email
  var c=e4a_login_constraints(i.value);
  if(c.length>0){el('login_check_res').innerHTML='<font color="red">'+c+'</font>'; return;}
  ahah('/e4a/check_login.e','login_check_res','tlogin='+i.value);
}
function passwordChanged(pwd,strid) {
  var strength = el(strid);
  var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$", "g");
  var mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g");
  var enoughRegex = new RegExp("(?=.{6,}).*", "g");
  if (pwd.length==0) {
  strength.innerHTML = 'Введите пароль';
  } else if (false == enoughRegex.test(pwd)) {
  strength.innerHTML = 'Больше символов';
  } else if (el('tlogin')&&(pwd == el('tlogin').value)) {
  strength.innerHTML = 'Пароль не должен совпадать с логином!';
  } else if (strongRegex.test(pwd)) {
  strength.innerHTML = '<span style="color:green">Сильно!</span>';
  } else if (mediumRegex.test(pwd)) {
  strength.innerHTML = '<span style="color:orange">Годится...</span>';
  } else {
  strength.innerHTML = '<span style="color:red">Слабый!</span>';
  }
}
function passwordCopyChanged(pwd1,pwd2,strid) {
  if(pwd1==pwd2) el(strid).innerHTML=''; else el(strid).innerHTML="<font color='red'>Пароли не совпадают</font>";
}
function e4a_enter() {
  ahah('/e4a/enter.e','e4a_login','login='+el('email').value+'&password='+el('password').value+'&url='+addamph(location.href),postProcess);
}
function e4a_auth_http() {
  ahah('/e4a/auth_http/enter.e','e4a_login','login='+el('email').value+'&password='+el('password').value+'&url='+addamph(location.href),postProcess);
}
function e4a_edit() {
  el_show_b('e4a_editor');
  //document.URL заменен на location.pathname
  ahah('/e4a/edit.e','e4a_editor','page='+el('e4a_pagename').innerText+'&url='+addamph(location.pathname),postProcess);
  el('e4a_editor').focus();
//  el('e4a_edit_button').innerHTML='Записать страницу';
//  el('e4a_edit_button').onclick=e4a_save;
}
function e4a_comment1() {
  el_show_b('e4a_commentator');
  ahah('/e4a/comment.e','e4a_commentator','page='+el('e4a_pagename').innerText+'&url='+addamph(location.pathname),postProcess);

//  el('e4a_comment_button').innerHTML='Отправить комментарий';
//  el('e4a_comment_button').onclick=e4a_save_comment;

  el('e4a_comment_button').innerHTML='Отменить';
  el('e4a_comment_button').onclick=e4a_cancel_comment;

  el('e4a_comment_button').title='';
}
function e4a_cancel_edit() {
  el_hide('e4a_editor');
//  el('e4a_edit_button').innerHTML='Редактировать страницу';
//  el('e4a_edit_button').onclick=e4a_edit;
}
function e4a_cancel_comment() {
  el_hide('e4a_commentator');
  el('e4a_comment_button').innerHTML='Ответить';
  el('e4a_comment_button').onclick=e4a_comment;
}
function e4a_edit_comment_cancel(mid) {
  var c=el('edit_'+mid);
  if(c)c.removeNode(true);
}
function e4a_edit_comment(mid) {
  e4a_edit_comment_cancel(mid)
  var t=el('wiki_'+mid);
  var dx=(t.style.width?t.style.width:t.offsetWidth);
  var dy=(t.style.height?t.style.height:t.offsetHeight);
  var edit=document.createElement('div');
  edit.id='edit_'+mid;
  edit.className='e4a_edit_comment';
//  edit.style.width=dx-8+'px';
//  edit.style.height=dy+'px';
  t.appendChild(edit);
  edit.innerHTML='Здесь загрузится редактор';
  el_show_b('edit_'+mid);
  ahah('/e4a/edit_comment.e','edit_'+mid,'mid='+mid+'&dx='+dx+'&dy='+dy+'&url='+addamph(location.pathname),postProcess);
}
function e4a_replace_comment(mid) {
  ahah(location.pathname+'?rmid='+mid+'&ctype=comment','wiki_'+mid,'format=e4wiki&'+el('e4a_edit_'+mid).value,postProcess);
}

function e4a_delete_comment(mid) {
  ahah('/e4a/delete_comment.e','wiki_'+mid,'mid='+mid+'&url='+addamph(location.pathname),postProcess);
}
function e4a_delete(mid) {
  e4a_delete_comment(mid);
}

function e4a_save() {
  var ctype='page';
  var tsel=el('content_type');
  if(tsel) ctype=tsel.value;
//  ahah(location.pathname+'?ctype='+ctype,'e4a_editor_preview','format=e4wiki&'+el('e4a_edit_0').value,postProcess);
  ahah(location.pathname+'?ctype='+ctype,'content','format=e4wiki&'+el('e4a_edit_0').value,postProcess);
//  elAddClass('e4a_editor_preview','ready');
}
function e4a_save_comment() {
  ahah(location.pathname+'?ctype=comment','e4a_commentator_preview','format=e4wiki&'+el('e4a_edit_0').value,postProcess);
  elAddClass('e4a_commentator_preview','ready');
}
function e4a_save_task() {
//  ahah('/e4a/task_post.e','e4a_commentator_preview','format=e4wiki&'+el('e4a_edit_0').value,postProcess);
  postForm3(el('e4a_task_table'),'/e4a/task_post.e',postProcess);
}
function e4a_stats() {
  ahah('/e4a/stats.e','e4a_stats','ref='+document.referrer+'&ver=14147',postProcess);
}
function e4a_loggedout() {
  ahah('/e4a/loggedout.e','e4a_stats','ref='+document.referrer,postProcess);
}
function e4a_create() {
  if(el('e4a_login_button').innerHTML=='Выход') {
    el_hide('e4a_creative');
    e4a_edit();
  }
  else {alert('Пожалуйста выполните вход');login();}
}
function e4a_comment() {
  if(el('e4a_login_button').innerHTML=='Выход') {
    el_hide('e4a_creative');
    e4a_comment1();
  }
  else {alert('Пожалуйста выполните вход');login();}
}
function e4a_addpage() {
  var pagename=prompt("Введите тему (заголовок)", "");
  if(pagename==null) return;
  if(pagename.length==0) return;
  pagename=pagename.replace(/\?/g,"%3F");
  var path=location.pathname;
  var dir=path.substring(0,path.lastIndexOf('/')+1);
  window.location=dir+pagename;
//  ahah('/e4a/newpage.e','e4a_stats','folder='+location.pathname+'&pagename='+pagename,postProcess);
}
var n_editor=0;
function e4a_newmsg() {
//  var editor_window = window.open("/e4a/EditorTemplate.e","editor","height=400,width=700");
  n_editor++;
  var editor_window = window.open("/e4a/MsgEditor.e?ref="+addamph(location.pathname),"editor"+n_editor,"height=620,width=660");
}
function e4a_reply() {
  if(!curActive){alert('Сначала выберите сообщение, на которое отвечать.');return;}
  var ref=curActive.cells[0].getElementsByTagName('A')[0].href;
  var mid=curActive.cells[0].getElementsByTagName('A')[0].id;
  n_editor++;
  var editor_window = window.open("/e4a/MsgEditor.e?rmid="+mid+"&ref="+addamph(ref),"editor"+n_editor,"height=620,width=660");
}
function e4a_reply_all() {}
function e4a_reply_list() {}

function e4a_newtask() {
//  alert(e4a_selection)
// аналог e4a_create(), но с доп.параметрами
//  el_show_b('e4a_editor');
//  ahah('/e4a/edit.e','e4a_editor','page='+el('e4a_pagename').innerText+'&url='+location.pathname,postProcess);

// аналог e4a_comment(), но с доп.параметрами
//  el_show_b('e4a_commentator');

  if(curActive) {
    var ref=curActive.cells[0].getElementsByTagName('A')[0].href;
    var mid=curActive.cells[0].getElementsByTagName('A')[0].id;
    ahah('/e4a/task.e','details','page='+el('e4a_pagename').innerText+'&rmid'+mid+'&ref='+addamph(ref),postProcess);
  } else {
    ahah('/e4a/task.e','details','page='+el('e4a_pagename').innerText+'&ref='+addamph(location.pathname),postProcess);
  }
}

function e4a_forward() {
  if(!curActive){alert('Сначала выберите сообщение, которое пересылать.');return;}
  var ref=curActive.cells[0].getElementsByTagName('A')[0].href;
  var mid=curActive.cells[0].getElementsByTagName('A')[0].id;
  n_editor++;
  var editor_window = window.open("/e4a/MsgEditor.e?rmid="+mid+"&rmode=Fwd&ref="+addamph(ref),"editor"+n_editor,"height=620,width=660");
}

var ToDelete;
var ToDeleteArr;

function e4a_delete_msg1(tr) {
  var i=tr.cells[0].getElementsByTagName('A')[0].id;
  ToDelete=ToDelete+i+',';
  //tr.parentElement.parentElement.deleteRow(tr.rowIndex);
  //tr.removeNode(true);
  ToDeleteArr.push(tr);
}
function e4a_delete_msg() {
  if(curActive) {
    ToDelete="";
    ToDeleteArr=new Array();
    forEachSelected(e4a_delete_msg1);
    var list=ToDelete.substring(0,ToDelete.lastIndexOf(','));
    ahah('/e4a/delete_msgs.e?ref='+addamph(location.pathname),'details',list,postProcess);
    for(var i=0;i<ToDeleteArr.length; i++) {
      ToDeleteArr[i].removeNode(true);
    }
    curActive=undefined;
  }
}
function e4a_move_msg(msg_id,target_url) {
  if(curActive) {
    ToDelete="";
    ToDeleteArr=new Array();
    forEachSelected(e4a_delete_msg1);
    var list=ToDelete.substring(0,ToDelete.lastIndexOf(','));
    ahah('/e4a/move_msgs.e?ref='+addamph(location.pathname)+'&to_url='+addamph(target_url),'e4a_progress',list,postProcess);
    for(var i=0;i<ToDeleteArr.length; i++) {
      ToDeleteArr[i].removeNode(true);
    }
    curActive=undefined;
  } else {
    // переносится сообщение, которое не выделялось для чтения
  }
}
function e4a_task_change(e) {
  if(!e)e=window.event;
  var mid=eventTarget(e).name.substr(4);
  var state=eventTarget(e).checked;
  ahah('/e4a/task_toggle.e?ref='+addamph(location.pathname),'e4a_over','rmid='+mid+'&newstate='+state,postProcess);
}

function e4a_mark_spam() {}
function e4a_mark_ham() {}

function e4a_show_versions() {
  elToggleClass('e4','display_versions');
}

function hideRegForm() {
//  e4a_close();
//  alert('Регистрация успешна!');
  if(el('login'))ahah('/login.e','login','cache=no',initUserData);
  if(el('invTarg'))ahah('/firmname.e','invTarg','sid='+sid,initUserData);
}
function tryAgain(req) {alert('Что-то не получилось,\n('+req.status+' '+req.statusText+')\nпопробуйте еще раз...\n\n'+req.responseText)}

function doRegister(){
//  el('regBtn').disabled=true;
  postFormTo(el('regTable'),'/e4a/doRegister.e',hideRegForm,tryAgain,'e4a_reg_result');
}
function e4a_init(uid,ver){
  if(uid){
    el('e4a_login_button').innerHTML='Выход';
    el('e4a_login_button').onclick=logout;
    el_show_i('e4a_edit');
  } else {
    el('e4a_login_button').innerHTML='Вход';
    el('e4a_login_button').onclick=login;
  }
  if(ver>14147) alert('В кэше вашего браузера\nстарая версия необходимого JavaScript-скрипта!\nПожалуйста нажмите F5 для обновления файлов страницы.');
  if(el('e4')) {
//    if(el('container')){
      el('e4').onmousedown=mDragStart;
      el('e4').onmouseup=mDragStop;
//    }
    el('e4').onclick=mClick;
    installKeyHandlers();
  }
  e4a_selection='';
}
function e4a_do_logout() {
  delCook();
  el('email').focus();
  el('e4a_login_button').innerHTML='Войти';
  el('e4a_login_button').onclick=e4a_enter;
  setTimeout("el('email').focus()",100);
  if(el('e4a_logged'))el('e4a_logged').removeNode(true);
  /*el_show_i('e4a_alogged')*/;
  el_hide('e4a_edit');
  e4a_loggedout();
}
function e4a_login_form() {
  el('email').focus();
  el('e4a_login_button').innerHTML='Войти';
  el('e4a_login_button').onclick=e4a_enter;
  setTimeout("el('email').focus()",100);
  el_hide('e4a_alogged');
}
function e4a_logged_in(uid) {
  if(uid){
    el('e4a_login_button').innerHTML='Выход';
    el('e4a_login_button').onclick=logout;
    el_show_i('e4a_edit');
    el_hide('e4a_alogged');
  } else {
    el('e4a_login_button').innerHTML='Вход';
    el('e4a_login_button').onclick=login;
  }
}
function e4a_do_search() {
  var path=location.pathname;
  var dir=path.substring(0,path.lastIndexOf('/')+1);
  window.location=dir+'?search='+el('isearch').value;
}
function e4a_search(e) { // в IE не вызывается onkeypress, ловим выше через keyhandler
  if(!e)e=window.event;
  var unicode=e.charCode? e.charCode : e.keyCode;
  if(unicode==13) { e4a_do_search() }
}
function e4a_preview() {
}
function e4a_editor_add_tags(textarea,stt,ent) {
  if (document.selection) {
    // IE
    textarea.focus();
    var sel = document.selection.createRange();
    if(sel.htmlText) { // IE
      if(sel.htmlText.length>0) { // обход отставания фокуса
        if(sel.text.length>0) {
          sel.text = stt + sel.text + ent;
        } else { sel.text = stt + e4a_selection + ent; }
      } else { textarea.value =  textarea.value+ stt + e4a_selection + ent;
      }
    } else { // Opera
        if(sel.text.length>0) {
          sel.text = stt + sel.text + ent;
        } else { sel.text = stt + e4a_selection + ent; }
    }
  } else {
    // FF
    var len = textarea.value.length;
    var start = textarea.selectionStart;
    var end = textarea.selectionEnd;
    var sel = textarea.value.substring(start, end);
    if(sel.length>0) {
      var replace = stt + sel + ent;
    } else { var replace = stt + e4a_selection + ent; }
    textarea.value =  textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);
  }
}
function e4a_ec_text_bold(textarea) {
  e4a_editor_add_tags(textarea,'[b]','[/b]')
}
function e4a_ec_text_italic(textarea) {
  e4a_editor_add_tags(textarea,'[i]','[/i]')
}
function e4a_ec_text_underline(textarea) {
  e4a_editor_add_tags(textarea,'__','__')
}
function e4a_ec_text_strikethroungh(textarea) {
  e4a_editor_add_tags(textarea,'--','--')
}
function e4a_ec_text_heading_2(textarea) {
  e4a_editor_add_tags(textarea,'===','===')
}
function e4a_ec_text_list_bullets(textarea) {
  e4a_editor_add_tags(textarea,'\n  * ','')
}
function e4a_ec_text_list_numbers(textarea) {
  e4a_editor_add_tags(textarea,'\n  1. ','')
}
function e4a_ec_text_quote(textarea) {
  var q=e4a_qauthor;
  if(q.length==0) q='автор';
  e4a_editor_add_tags(textarea,'[quote="'+q+'"]','[/quote]')
}
function e4a_ec_page_code(textarea) {
  e4a_editor_add_tags(textarea,'[code]','[/code]')
}
function e4a_ec_picture_add(textarea) {
  e4a_editor_add_tags(textarea,'[img]','[/img]')
}
function e4a_ec_bug_add(textarea) {
  e4a_editor_add_tags(textarea,'[bug]','[/bug]')
}
function e4a_ec_plugin_add(textarea) {
  e4a_editor_add_tags(textarea,'{{','}}')
}
function e4a_ec_text_indent(textarea) {
  e4a_editor_add_tags(textarea,'\n    ','')
}
function e4a_ec_text_horizontalrule(textarea) {
  e4a_editor_add_tags(textarea,'----','')
}
function e4a_ec_world_link(textarea) {
/*  if(e4a_selection.length>0) {
    if(e4a_selection.indexOf('http:')>=0||e4a_selection.indexOf('www')>=0||e4a_selection.indexOf('https:')>=0||e4a_selection.indexOf('ftp:')>=0) {
      var text=prompt('Выделен URL, введите текст ссылки (описание)');
      e4a_editor_add_tags(textarea,'[url="','"]'+text+'[/url]')
    } else {
      var url=prompt('Выделен текст "'+e4a_selection+'", введите ссылку (url)');
      e4a_editor_add_tags(textarea,'[url="'+url+'"]','[/url]')
    }
  } else {
*/
    e4a_editor_add_tags(textarea,'[url]','[/url]')
//  }
}

function e4a_ec_eye(textarea) {
  el('e4a_over').innerHTML='предпросмотр';
  center('e4a_over');
  ahah('/e4a/editor_preview.e','e4a_over',textarea.value,postProcess);
}
function e4a_ec_help(textarea) {
  el('e4a_over').innerHTML='загружаю помощь';
  center('e4a_over');
  ahah('/e4a/editor_help.e','e4a_over',textarea.value,postProcess);
}
function e4a_edit_command(e) {
  var t=eventTarget(e);
  if(t.tagName!='IMG')return;
  var icon_file=t.src.substr(t.src.lastIndexOf('/')+1);
  var icon_name=icon_file.substr(0,icon_file.indexOf('.'));
  var textarea=t.parentElement.parentElement.parentElement.getElementsByTagName('TEXTAREA')[0];
  if(window['e4a_ec_'+icon_name]) {
    window['e4a_ec_'+icon_name](textarea);
  } else { alert(icon_name);}
}
function getSel(){
  var w=window,d=document,gS='getSelection';
  return (''+(w[gS]?w[gS]():d[gS]?d[gS]():d.selection.createRange().text)).replace(/(^\s+|\s+$)/g,'');
}
function e4a_edit_select(e) {
  //e4a_selection=getSel();
  saveSelection(e);
}
function e4a_comment_init() {
  if(e4a_selection.length>0) e4a_ec_text_quote(el('e4a_edit_0'));
  el('e4a_edit_0').focus();
}
function e4a_task_init() {
  if(curActive)
  e4a_qauthor=curActive.cells[1].innerText;

  if(e4a_selection.length>0) {
    e4a_ec_text_quote(el('e4a_edit_0'));
    el('e4a_subject').value=e4a_selection;
  }
  el('e4a_edit_0').focus();
}

function mouseButton(e) {
    if(!e)e=window.event;

    if (!e.which)
       /* IE case */
       button= (e.button < 2) ? "LEFT" :
                 ((e.button == 4) ? "MIDDLE" : "RIGHT");
    else
       /* All others */
       button= (e.which < 2) ? "LEFT" :
                 ((e.which == 2) ? "MIDDLE" : "RIGHT");
  return button;
}
function e4a_read(e,mid) {
  if (!e) var e = window.event;

  if (e) {
    if(mouseButton(e)=='MIDDLE') return true;
    // Chrome нажатие на кнопку-колесо попадает в onclick, в отличие от всех остальных браузеров
  }

  ahah('/e4a/read.e','details','page='+el('e4a_pagename').innerText+'&url='+addamph(location.pathname)+'&mid='+mid,postProcess);
  el_show_i('reply_button');
  el_show_i('delete_button');
  el_show_i('forward_button');
  el_show_i('task_button');
  return false;
}
function e4a_readPostProcess(mid){
  if(el(mid)) {
    nodeAddClass(el(mid).parentElement.parentElement,'seen');
    if(el(mid).previousSibling.src.indexOf('e4a/icons/email.png')!=-1)el(mid).previousSibling.src='/e4a/icons/email_open.png';
  }
}
function e4a_project(ev,project) {
  ahah('/e4a/project.e','list','project='+project+'&url='+addamph(location.pathname),postProcess);
}
function e4a_folder(e) {
  if (!e) var e = window.event;
  var a=eventTarget(e);
  ahah(a.href+'?mode=embedded','list','');
  return false;
}
function e4a_read_topic(e) {
  if (!e) var e = window.event;
  var a=eventTarget(e);
  var link=a.pathname;
  ahah(link+'?mode=embedded','details','');
  nodeAddClass(a.parentElement.parentElement,'seen');
  return false;
}
function e4a_add_rcpt() {
}
function e4a_editor_resize() {
  getViewportSize();
  el('container').style.width=viewportwidth-6+'px';
  el('container').style.height=viewportheight-6+'px';
  el('e4a_editor_table').style.width=viewportwidth-6+'px';
  el('e4a_ta_container').style.width=el('e4a_ta_container').offsetWidth+'px'; //фиксация размера
  el('e4a_edit_0').style.height=el('e4a_ta_container').offsetHeight-150+'px';
  el('e4a_edit_0').style.width=el('e4a_ta_container').offsetWidth-20+'px';
}
function e4a_edit_folder(fid) {
  var descr=prompt('Введите описание папки','');
  if(descr.length)
  ahah('/e4a/set_folder_descr.e','e4a_over','id='+fid+'&url='+addamph(location.pathname)+'&descr='+descr,postProcess);
}
function e4a_icontacts(e) {
  if (!e) var e = window.event;
  var a=eventTarget(e);
  ahah(a.href+'?mode=embedded&rep=icontacts','list','');
  return false;
}
function e4a_editdate() {
  var t=el('e4a_pagedate');
  makeLocalEditable(t);
  t.onclick='';
}
function e4a_new_folder(t) {
  var folder_name=t.value;
  var folder=document.createElement('dd');
  folder.id=folder_name;
  el('foldernav').insertBefore(folder,el('new_folder_dd'));
  ahah('/e4a/new_folder.e',folder_name,'url='+addamph(location.pathname)+'&folder_name='+addamph(folder_name),postProcess);
}
