d = document;
ua = window.navigator.userAgent;
ie = d.all;
n = "\n";

if (typeof(HTMLElement) != "undefined" && ua.indexOf('Gecko') !== -1) { // outerHTML for Mozilla
 var _emptyTags = {"img": true, "br": true, "input": true, "meta": true, "link": true, "param": true, "hr": true};
 HTMLElement.prototype.__defineGetter__("outerHTML", function () {
  var attrs = this.attributes;
  var str = "<" + this.tagName;
  for (var i = 0; i < attrs.length; i++) str += " " + attrs[ i ].name + "=\"" + attrs[ i ].value + "\"";
  if (_emptyTags[this.tagName]) return str + ">";
  return str + ">" + this.innerHTML + "</" + this.tagName + ">";
 });
 HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
  var r = this.ownerDocument.createRange();
  r.setStartBefore(this);
  this.parentNode.replaceChild(r.createContextualFragment(sHTML), this);
 });
}

f = {

 _divStyle: 'style="margin: 0px; padding: 0px; border-style: none; display: block; top: 0px; left: 0px;"',
 _resizingObj: {},
 _resizer: {},
 _movingObj: {},
 _mover: {},




 get: function(id) {return d.getElementById(id);},

 treeWalk: function(node, code) {
  for(var child,i=0;child=node.childNodes[i];i++){
   child.tagName && f.treeWalk(child,code);
  }
  code(node);
 },

 getXY: function(el) {
  var x = y = 0;
  while (el) {
   x += el.offsetLeft;
   y += el.offsetTop;
   el = el.offsetParent;
  }
  return {x:x,y:y};
 },

 getWinSize: function() {
  if (d.all && ua.indexOf('Opera') < 0) {return {w:d.body.clientWidth,h:d.body.clientHeight};}
  else {return {w:innerWidth,h:innerHeight};}
 },

 addEvent: function(o, n, h) {
  if (n != 'unload') {
   function clean() {
    var ex;
    try {
     f.removeEvent(o, n, h);
     f.removeEvent(window, 'unload', clean);
     o = n = h = null;
    } catch (ex) {}
   }
   f.addEvent(window, 'unload', clean);
  }
  if (o.attachEvent) o.attachEvent("on" + n, h);
  else o.addEventListener(n, h, false);
 },

 removeEvent: function(o, n, h) {
  if (o.detachEvent) o.detachEvent("on" + n, h);
  else o.removeEventListener(n, h, false);
 },

 resize: function(obj, w, h, set_w) {
  if (w == null || w == "null") {set_w = false; w = 0;}
  if (h == null || h == "null") return;
  w = f._removePX(w); h = f._removePX(h);
  var dx = w - obj.clientWidth;
  var dy = h - obj.clientHeight;
  w = w < 1 ? 30 : w; h = h < 1 ? 30 : h;
  if (set_w) obj.style.width = w + "px";
  obj.style.height = h + "px";
 },

 move: function(obj, l, t) {
  if (l == null || l == "null" || t == null || t == "null") return;
  l = f._removePX(l); t = f._removePX(t);
  var dx = l - obj.clientWidth;
  var dy = t - obj.clientHeight;
  obj.style.left = l + "px";
  obj.style.top = t + "px";
 },

 setResizing: function(e, id, state) {
  e = typeof(e) == "undefined" ? window.event : e;
  var obj = f._resizingObj = f.get(id);
  var resizer = f._resizer;
  if (state) {
   if (!resizer.eventHandlers) {
    if (d.all) f.addEvent(document, "mousemove", f._resizeEventHandler);
    else f.addEvent(window, "mousemove", f._resizeEventHandler);
    f.addEvent(document, "mouseup", f._resizeEventHandler);
    resizer.eventHandlers = true;
   }
   resizer.resizing = true;
   resizer.downX = e.screenX;
   resizer.downY = e.screenY;
   resizer.width = parseInt(f._removePX(obj.style.width));
   resizer.height = parseInt(f._removePX(obj.style.height));
   if (ie) obj.innerHTML = '<div id="resizebleNoSelect_786" '+f._divStyle+'>'+obj.innerHTML+'</div>';
  }
  else resizer.resizing = false;
 },

 setMoving: function(e, id, state) {
  e = typeof(e) == "undefined" ? window.event : e;
  var obj = f._movingObj = f.get(id);
  var mover = f._mover;
  if (state) {
   if (!mover.eventHandlers) {
    if (d.all) f.addEvent(document, "mousemove", f._moveEventHandler);
    else f.addEvent(window, "mousemove", f._moveEventHandler);
    f.addEvent(document, "mouseup", f._moveEventHandler);
    mover.eventHandlers = true;
   }
   mover.moving = true;
   mover.downX = e.screenX;
   mover.downY = e.screenY;
   coord = f.getXY(obj);
   mover.left = coord.x;
   mover.top = coord.y;
   if (ie) obj.innerHTML = '<div id="resizebleNoSelect_786" '+f._divStyle+'>'+obj.innerHTML+'</div>';
  }
  else mover.moving = false;
 },

 newWin: function(a) {
  open(a.href, "newWin" + new Date().getTime());
  return false;
 },



 _removePX: function(s) {
  s = s.toString();
  if (s.indexOf('px') != -1) return s.substring(0, s.length-2);
  else return s;
 },

 _resizeEventHandler: function(e) {
  var obj = f._resizingObj;
  var resizer = f._resizer;
  if (!resizer.resizing) return;
  e = typeof(e) == "undefined" ? window.event : e;
  var dx = e.screenX - resizer.downX;
  var dy = e.screenY - resizer.downY;
  switch (e.type) {
   case "mousemove":
    var w, h;
    w = resizer.width + dx;
    h = resizer.height + dy;
    w = w < 1 ? 1 : w;
    h = h < 1 ? 1 : h;
    obj.style.width = w + "px";
    obj.style.height = h + "px";
    break;
   case "mouseup":
    if (ie) obj.innerHTML = f.get('resizebleNoSelect_786').innerHTML;
    f.setResizing(e, obj.id, false);
    f.resize(obj, resizer.width + dx, resizer.height + dy, true);
    break;
  }
 },

 _moveEventHandler: function(e) {
  var obj = f._movingObj;
  var mover = f._mover;
  if (!mover.moving) return;
  e = typeof(e) == "undefined" ? window.event : e;
  var dx = e.screenX - mover.downX;
  var dy = e.screenY - mover.downY;
  switch (e.type) {
   case "mousemove":
    var l, t;
    l = mover.left + dx;
    t = mover.top + dy;
    obj.style.left = l + "px";
    obj.style.top = t + "px";
    break;
   case "mouseup":
    if (ie) obj.innerHTML = f.get('resizebleNoSelect_786').innerHTML;
    f.setMoving(e, obj.id, false);
    f.move(obj, mover.left + dx, mover.top + dy);
    break;
  }
 }

}

ajax = {

 _core: null,
 _messLoading: 'Идет загрузка...',
 _messClose: 'В данный момент обрабатывается запрос к серверу. Если Вы закроете окно, некоторые данные могут быть потеряны. Рекомендуется дождаться завершения запроса. Хотите все равно закрыть окно?',
 _loc: new RegExp(/<a id="ajaxRLocation" href="([^<>]+)">&nbsp;<\/a>/),
 _r303: new RegExp(/<div id="ajaxRMainWin">(\d+)<\/div>/),



 win: function(url, resize, e) {  
  if (resize == undefined) resize = true;
  if (f.get('ajaxWin') || !ajax._core) return;
  e ? y = e.screenY : y = null;
  ajax._buildWin(y);
  if (resize) f.get('ajaxWin').innerHTML += ajaxWinVars.resizer;
  ajax.goURL(url);
 },

 closeWin: function() {
  if (ajax._core.readyState) {
   if (confirm(ajax._messClose)) ajax._core.abort();
   else return;
  }
  d.body.innerHTML = f.get('mutedContent').innerHTML;
 },

 goURL: function(url) {
  f.get('ajaxWin').style.cursor = 'wait';
  ajax._core.onreadystatechange = ajax._gotResponse;
  ajax._core.open("GET", url, true);
  ajax._core.send(null);
 },

 sendForm: function(frm) {
  mth = frm.method.toUpperCase();
  var data = ''; var l = frm.length; var el, val;
  if (mth == "GET") {
   boundary = '';
   first = true;
   for (var i = 0; i < l; i++) {
    el = frm.elements[i];
    val = ajax._getValue(el);
    if (val === null) continue;
    if (!first) data += '&'; else first = false;
    data += el.name + '=' + ajax._escape(val);
   }
   (frm.action.indexOf('?') == -1) ? frm.action += '?' : frm.action += '&';
   frm.action += data; data = null;
  }
  else {
   var d_ = '-----AJAX-----'+ajax._uniqStr(); var n = "\n";
   boundary = '; boundary=' + d_; d_ = '--'+d_;
   for (var i = 0; i < l; i++) {
    el = frm.elements[i];
    val = ajax._getValue(el);
    if (val === null) continue;
    data += d_+n+'Content-Disposition: form-data; name="'+el.name+'"'+n+n+val+n;
   }
   data += d_+'--'+n;
  }
  var ac = ajax._core;
  ac.onreadystatechange = ajax._gotResponse;
  ac.open(mth, frm.action, true);
  ac.setRequestHeader("Content-Type",  frm.enctype + boundary);
  ac.send(data);
  f.get('ajaxWin').style.cursor = 'wait';
 },

 loadJS: function(url) {
  ajax._core.onreadystatechange = ajax._gotJS;
  ajax._core.open("GET", url, false);
  ajax._core.send(null);
 },




 _ini: function() {
  try {ajax._core = new XMLHttpRequest();} catch (e) {
   try {ajax._core = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {
    try {ajax._core = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {ajax._core = null;}
   }
  }
 },

 _gotResponse: function() {

  if (ajax._core.readyState != 4) return;
  var win = f.get('ajaxWin');
  win.style.cursor = 'default';
  var wCont = f.get('ajaxWinContent');

  ajax._resetWin(win);
  switch (ajax._core.status) {
   case 200:
    var rt = ajax._core.responseText;
    var loc = rt.match(ajax._loc);
    if (loc) {
     loc = loc[0].replace(ajax._loc, '$1');
     ajax._core.abort();
     if (rt.match(ajax._r303)) window.location = loc;
     else ajax.goURL(loc);
     return;
    }
    wCont.innerHTML = rt;
    var wt = f.get('ajaxTitle');
    if (wt) {
     f.get('ajaxWinTitle').innerHTML = wt.innerHTML;
     wt.outerHTML = '';
    }
    f.treeWalk(wCont, ajax._evalScript);
    break;
   case 403: wCont.innerHTML = 'Доступ запрещен.'; break;
   case 503: wCont.innerHTML = 'Сервер перегружен. Повторите запрос позже.'; break;
   default: wCont.innerHTML = 'Сервер недоступен.';
  }
  ajax._fitWin(win);

  ajax._core.abort();
  ajax._refreshRKImage();

 },

 _buildWin: function(y) {
  d.body.innerHTML = "\n<div id=\"ajaxWin\">"+ajaxWinVars.HTMLBegin+ajax._messLoading+ajaxWinVars.HTMLEnd+d.body.innerHTML+"</div>\n";
  if (y) f.get('ajaxWin').style.top = y+'px';
 },

 _resetWin: function(win) {
  win.style.width = 'auto';
  win.style.height = 'auto';
 },

 _fitWin: function(win) {
  var ws = win.style;
  var coord = f.getXY(win);
  ws.width = win.clientWidth+'px';
  ws.height = win.clientHeight+'px';
  ws.left = coord.x+'px';
  ws.top = coord.y+'px';
 },

 _evalScript: function(el) {
  if (el.tagName.toLowerCase() == 'script') {
   if (el.src) {
    ajax._core.onreadystatechange = ajax._gotJS;
    ajax._core.open("GET", el.src, false);
    ajax._core.send(null);
   }
   else {   
    window.eval(el.innerHTML);
   }
  }
 },

 _gotJS: function() {
  if (ajax._core.readyState != 4) return;
  if (ajax._core.status == 200) {window.eval(ajax._core.responseText);}
 },

 _escape: function(s) {
  return encodeURIComponent(s);
 },

 _uniqStr: function() {
  var s = Math.random().toString();
  return s.substring(3, s.length-1);
 },

 _refreshRKImage: function() {
  var RKI = d.getElementsByTagName('img'); var l = RKI.length;
  for (var i=0; i<l; i++) {
   if (RKI[i].className == 'RKImage') RKI[i].src += '?n='+ajax._uniqStr();
  }
 },

 _getValue: function(el) {
  if (el.value == undefined) return null;
  if ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) return null;
  else return el.value;
 }

}

ajax._ini();

