function xGetElementById(e)
{ if (!e) { return false; }
  if (e.tagName) { return e; }
  if (document.getElementById) { return document.getElementById(e); } else
   if (document.all) { return document.all[e]; } else { return false; }
}
function xClientWidth(){
	if(document.documentElement.clientWidth)return document.documentElement.clientWidth;
	else return document.body.clientWidth;
}
function xAddEventListener(e,eventType,eventListener,useCapture){
	if(e.addEventListener) e.addEventListener(eventType,eventListener,useCapture);
	else if(e.attachEvent) e.attachEvent('on'+eventType,eventListener);
}
function xRemoveEventListener(e,eventType,eventListener,useCapture){
	if(e.removeEventListener) e.removeEventListener(eventType,eventListener,useCapture);
	else if(e.detachEvent) e.detachEvent('on'+eventType,eventListener);
}
function xEventTarget(evt){
	evt=evt||window.event;
	return target=(evt.target)?evt.target:evt.srcElement;
}
function clearEvent(evt){
    evt=evt||event;
    if(evt.stopPropagation) evt.stopPropagation();
    else evt.cancelBubble = true;
    if(evt.preventDefault) evt.preventDefault();
    else evt.returnValue = false;
	if(document.selection&&document.selection.empty) document.selection.empty();
	else window.getSelection().removeAllRanges();
	xRemoveEventListener(document,'click',clearEvent,false);
}
function xDef(n){return typeof(n)!='undefined'}

var agt          = navigator.userAgent.toLowerCase(),
    is_major     = parseInt(navigator.appVersion),
    is_minor     = parseFloat(navigator.appVersion),
    is_nav       = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
                    && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                    && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)),
    is_nav4      = (is_nav && (is_major == 4)),
    is_nav6      = (is_nav && (is_major == 5)),
    is_nav6up    = (is_nav && (is_major >= 5)),
    is_ie        = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
	
function intval(mixed_var, base)
{ var tmp,
      type = typeof( mixed_var );
  
  if (typeof base !== 'number') {base = 10;}
  
  if (type == 'boolean')
  { if (mixed_var == true) { return 1; } else { return 0; } } else
  if (type == 'string')
  { tmp = parseInt(mixed_var * 1);
    if (isNaN(tmp) || !isFinite(tmp)) { return 0; } else 
	{ var s = tmp.toString(base || 10);
	  if (base == 10) { return parseInt(s); } else { return s; }
	}
  } else
  if (type == 'number' && isFinite(mixed_var) ) { return intval('' + Math.floor(mixed_var), base); } else
  { return 0; }
}

function get_style(element, style)
{ element = getId(element);
  if (typeof element !== 'object') { return null; } 
  
  var res;
  
  if (is_ie) { res = element.currentStyle[style]; } else
  { res = window.getComputedStyle(element, null)[style]; }
  
  return res;
}

function set_style(element, style, value)
{ element = getId(element);
  if (typeof element !== 'object') { return false; } 
  
  element.style[style] = value;
  
  return true;
}

function getId(obj)
{ var e = xGetElementById(obj);
  if (typeof e === 'object' && e !== null) { return e; }
  
  return;
}

function get_absolute_rect(elem)
{ if (typeof elem !== 'object') { return false; }

  var ret = false;
  
  try
  { var cRect = elem.getBoundingClientRect(),
	    body = document.body,
		dElem = document.documentElement;
		
	var sTop = window.pageYOffset || dElem.scrollTop || body.scrollTop,
	    sLeft = window.pageXOffset || dElem.scrollLeft || body.scrollLeft,
		cTop = dElem.clientTop || body.clientTop || 0,
		cLeft = dElem.clientLeft || body.clientLeft || 0;
		
	var top  = cRect.top +  sTop - cTop,
	    left = cRect.left + sLeft - cLeft;
		
	if (top % 1 > 0) { top = intval(top) + 1; }
	if (left % 1 > 0) { left = intval(left) + 1; }
		
	ret = {'left': left, 'top': top, 'width':(cRect.right-cRect.left), 'height':(cRect.bottom-cRect.top)};
  } catch (e) {}
  
  if (ret === false)
  { var left = 0,
        top = 0,
		obj = elem;
	while (typeof obj === 'object' && obj !== null)
	{ top = top + intval(obj.offsetTop);
	  left = left + intval(obj.offsetLeft);
	  
	  obj = obj.offsetParent;
	}
	
	ret = {'left': left, 'top': top, 'width':elem.clientWidth, 'height':elem.clientHeight};
  }
  
  return ret;
}

/*Функция посылки данных запроса
- request_type: GET/POST (по умолчанию GET)
- content: Массив/объект данных запроса, к примеру {'act': 'del', 'page': 1}
- url: Куда слать(по умолчанию /admin/index.php)

- data: ID-ы элементов, куда автоматически будет занесены результаты запроса!
        формат: {nn0:'xx0',nn1:'xx1'},
                где nn0, nn1... - куда будет возвращен результат, т.е. this.responseJS.nn0 и т.д.
                                  Зарезервированное название - error, по умолчанию сюда должны возвращаться
                                  ошибки. Для error определен обработчик по умолчанию - ajax_error.
                                  Допускается переопределять действия для зарезервированных параметров.
                    xx0, xx1... - ID элемента в который надо записать результат или
                                  - Функция в которую надо вызвать и передать результат или
                                  - Объект, в котором "Объект.f_ajax" это функция которую нужно
                                    вызвать и передать ей результат и вторым параметром этот объект
- cache: Кэшировать запрос или нет. По умолчанию - нет.*/

function ajax_send(content, url, data, request_type, cache)
{ if (typeof request_type !== 'string' || request_type.toLowerCase() !== 'post')
  { request_type = 'GET'; } else { request_type = 'POST'; }
  
  if (typeof content !== 'object') { content = null; }
  
  if (typeof data !== 'object')
  { alert('Входные данные не верны!\nСообщите об этой ошибке администратору!');
    return;
  }
  
  if (typeof data['error'] === 'undefined') { data['error'] = ajax_error; }
  
  if (typeof cache !== 'boolean') { cache = false; }
  if (typeof url !== 'string' || url === '') { url = '/index.php'; }
  
  var to_process_result = function ()
  { if (!this.readyState || this.readyState != 4) { return; }
	try
	{ var eID = {};
	  for (var k in data)
	  { var v = data[k];
		if (typeof v === 'string')
		{ var element = getId(v);
		  if (element) {element.s_temp='!'; eID[k] = element;}
		} else
		if ( typeof v === 'function' || typeof v === 'object' && typeof v.f_ajax === 'function' ) { eID[k] = v; }
	  }
	  
	  for (var k in eID)
	  { var element = eID[k];
		if ( this.responseJS && this.responseJS[k] && element )
		{ if (typeof element === 'function')
		  { element(this.responseJS[k]); } else
		  if (element.s_temp === '!')
		  { element.s_temp=null;
			element.innerHTML = this.responseJS[k];
		  } else
		  { element.f_ajax(this.responseJS[k], element); }
		}
	  }
	}
	catch (err) {alert('Не удалось корректно обработать ответ сервера(AJAX запрос).');}
  }
  
  try
  { var req_A = new JsHttpRequest();
    req_A.onreadystatechange = to_process_result;
    req_A.caching = cache;
    req_A.open(request_type, url, true);
    req_A.send(content);}
  catch (err) {alert('Не удалось сделать AJAX запрос!\n'+err);}
}

function ajax_error(msg)
{ if (typeof msg === 'undefined')
  { alert('Не удалось корректно обработать ответ сервера(AJAX запрос)'); } else
  { if (msg == '') return;
    alert(msg); }
}

