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)
                                             }
  HTMLElement.prototype.insertAdjacentText = function (where, txtStr)
                                             { var parsedText = document.createTextNode(txtStr);
                                               this.insertAdjacentElement(where, parsedText);
                                             }
}

function addHandler(object, event, handler)
{ if (typeof object.addEventListener !== 'undefined') { object.addEventListener(event, handler, false); } else
  if (typeof object.attachEvent !== 'undefined') { object.attachEvent('on' + event, handler); } else
  { alert('Не могу назначить обработчик! Свяжитесь с администратором!'); }
}

function removeHandler(object, event, handler)
{ if (typeof object.removeEventListener !== 'undefined') { object.removeEventListener(event, handler, false); } else
  if (typeof object.detachEvent !== 'undefined') { object.detachEvent('on' + event, handler); } else
  { alert('Не могу удалить обработчик! Свяжитесь с администратором!'); }
}

///////////////////START: PRELOAD IMAGES///////////////////
function ImagePreloader(images, call_back, parameters)
{ if (typeof images !== 'object' && typeof images !== 'string' || typeof images === 'string' && images === '' || typeof call_back !== 'function' || !images.length && !images.tagName) { return; }

  this.call_back = call_back;
  this.parameters = parameters;
  
  this.nLoaded = 0;
  this.nProcessed = 0;
  this.nCurrent = 0;
  this.aImages = new Array;
  
  if (images.tagName || typeof images === 'string')
  { this.nImages = 1;
    this.preload(images);
  } else
  { this.nImages = images.length;
    for (var i = 0; i < images.length; i++) { this.preload(images[i]); }
  }
}

ImagePreloader.prototype.preload = function(image)
{ var src = '';

  if (typeof image === 'object' && typeof image.src === 'string') { src = image.src; }
  
  if (src === '') { src = image; }
  
  var oImage = new Image;
  this.aImages.push(oImage);
  
  oImage.onload = ImagePreloader.prototype.onload;
  oImage.onerror = ImagePreloader.prototype.onerror;
  oImage.onabort = ImagePreloader.prototype.onabort;
  
  oImage.oImagePreloader = this;
  oImage.bLoaded = false;
  oImage.bError = false;
  oImage.bAbort = false;
  oImage.bIndex = this.nCurrent;
  
  this.nCurrent++;
  
  oImage.src = src;
}

ImagePreloader.prototype.onComplete = function()
{ this.nProcessed++;
  if ( this.nProcessed == this.nImages ) { this.call_back(this.aImages, this.nLoaded, this.parameters); }
}

ImagePreloader.prototype.onload = function()
{ this.bLoaded = true;
  this.oImagePreloader.nLoaded++;
  this.oImagePreloader.onComplete();
}

ImagePreloader.prototype.onerror = function()
{ this.bError = true;
  this.oImagePreloader.onComplete();
}

ImagePreloader.prototype.onabort = function()
{ this.bAbort = true;
  this.oImagePreloader.onComplete();
}
///////////////////END: PRELOAD IMAGES///////////////////

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 floatval(mixed_var)
{ if (typeof mixed_var === 'undefined') { return 0.0; }

  var x = parseFloat(mixed_var);
  if (isNaN(x) || !isFinite(x)) { return 0.0; }
  
  return x;
}
	
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_visible_sizes(elem)
{ var rect = get_absolute_rect(elem),
      parent_rect = {};

  if (rect === false) { return false; }
  
  try
  { var obj = elem,
        bottom = rect['top'] + rect['height'],
		right = rect['left'] + rect['width'],
		style_overflow;
		
	while (typeof obj === 'object' && obj !== null)
	{ style_overflow = get_style(obj, 'overflow');
	  if (typeof style_overflow === 'undefined' || style_overflow == '' || style_overflow.toLowerCase() != 'visible')
	  { parent_rect = get_absolute_rect(obj);
	  
	    parent_rect['bottom'] = parent_rect['top'] + parent_rect['height'];
		parent_rect['right'] = parent_rect['left'] + parent_rect['width'];
		
		if (rect['top'] < parent_rect['top']) { rect['top'] = parent_rect['top']; }
		if (rect['left'] < parent_rect['left']) { rect['left'] = parent_rect['left']; }
		if (bottom > parent_rect['bottom']) { bottom = parent_rect['bottom']; }
		if (right > parent_rect['right']) { right = parent_rect['right']; }
	  }
	  
	  obj = obj.offsetParent;
	}
	
	rect = {'left': rect['left'], 'top': rect['top'], 'width':right - rect['left'], 'height':bottom - rect['top']};
  } catch (e) { rect = false; }
  
  return rect;
}

function delete_tag_id(id)
{ var element = getId(id);
  if (typeof element === 'object') { document.body.removeChild(element); }
}

function get_absolute_rect(elem)
{ elem = getId(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) { ret = false; }
  
  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
	{ if (typeof this.error_status !== 'undefined')
	  { alert('Не удалось корректно обработать ответ сервера(AJAX запрос).\nСервер вернул ошибку: ' + this.error_status);
	    
		return;
	  }
	  
	  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); }
}

function get_flash_version()
{ var n = navigator,
      agt = n.userAgent.toLowerCase(),
	  v = '';
	  
  if (is_ie)
  { try
    { var obj = eval('new ActiveXObject("ShockwaveFlash.ShockwaveFlash")');
	  v = obj.GetVariable('$version');
	} catch (err) { v = ''; }
	
	if (v === '')
	{ var i=3;
	  while (true)
	  { i++;
	  
	    try { if (!eval('new ActiveXObject("ShockwaveFlash.ShockwaveFlash.'+i+'")')) { break; } } catch (err) { break; }
	  }
	  
	  i--;
	  if (i !== 3) { v = i + '.0.0.0'; }
	}
  } else
  if (n.plugins)
  { var s = '';
    for (var i=0;i<n.plugins.length;i++)
	{ s = n.plugins[i].name.toLowerCase();
	  if (s.indexOf('flash') > -1)
	  { v = n.plugins[i].description;
	    break;
	  }
	}
  }
  
  if (v !== '')
  { var reg_first = new RegExp('^[^\\d]*', '');
    v = v.replace(reg_first, "");
	if (v !== '')
	{ var reg_second = new RegExp('[^\\d]+', 'g');
	  v = v.replace(reg_second, ".");
	  if (v !== '') { return explode('.', v) }
	}
  }
  
  return false;
}

function explode(delimiter, string)
{ var emptyArray = { 0: '' };
  
  if (arguments.length != 2 || typeof arguments[1] === 'undefined') { return false; }
  
  if (typeof delimiter !== 'string' || delimiter == '') { delimiter = ',' }
  
  if ( typeof string == 'function' || typeof string == 'object' ) { return emptyArray; }
       
  return string.toString().split ( delimiter.toString() );
}

function get_tags(parent, tags, call_user_func, result_data)
{ if (typeof tags !== 'object' || typeof parent !== 'object') { return false; }

  if (typeof tags_collection === 'undefined') { tags_collection = {}; }
  
  var ret = false,
      tag = '',
	  g_r = (typeof result_data === 'object')? false : true;
	  
  if (g_r !== true)
  { try
    { result_data['depth'] += 1;
	} catch (e) { result_data = {'depth':0}; }
  }
  
  if (parent.childNodes && parent.childNodes.length)
  { for (var i=0; i < parent.childNodes.length; i++)
    if (parent.childNodes[i].nodeType == 1)
	{ tag = parent.childNodes[i].tagName.toLowerCase();
	  
	  if (tags[tag] && (typeof call_user_func !== 'function' || call_user_func(parent.childNodes[i])))
	  { if (g_r === true)
	    { if (typeof tags_collection[tag] !== 'object') { tags_collection[tag] = []; }
		  tags_collection[tag].push(parent.childNodes[i]);
		} else
		{ if (typeof result_data[tag] !== 'object') { result_data[tag] = []; }
		  result_data[tag].push(parent.childNodes[i]);
		}
		
		ret = true;
	  }
	  
	  ret = get_tags(parent.childNodes[i], tags, call_user_func, result_data) || ret;
	}
  }
  
  if (parent.nodeType == 1)
  { tag = parent.tagName.toLowerCase();
  
    if (tags[tag] && (typeof call_user_func !== 'function' || call_user_func(parent.childNodes[i])))
	{ if (g_r === true)
	  { if (typeof tags_collection[tag] !== 'object') { tags_collection[tag] = []; }
	    tags_collection[tag].push(parent.childNodes[i]);
	  } else
	  { if (typeof result_data[tag] !== 'object') { result_data[tag] = []; }
	    result_data[tag].push(parent.childNodes[i]);
	  }
	  
	  ret = true;
	}
  }
  
  return ret;
}

function version_flash_check()
{ var fv = get_flash_version(),
      obj,
	  value = '',
	  num;

  if (typeof fv === 'object' && fv[0] && get_tags(document.body, {'embed': 1, 'object': 1}) === true)
  { if (typeof tags_collection['object'] === 'object' && tags_collection['object'].length)
    { for (var i=0; i < tags_collection['object'].length; i++)
	  { obj = tags_collection['object'][i];
	    if (!obj || !obj.childNodes || !obj.childNodes.length) { continue; }
		
		for (var j=0; j < obj.childNodes.length; j++)
		{ if (obj.childNodes[j].nodeType != 1 || !obj.childNodes[j].name || obj.childNodes[j].name !== 'minversion' || !obj.childNodes[j].value) { continue; }
		
		  value = obj.childNodes[j].value.replace(/[^\d\.\,]/g, '');
		  value = value.replace(/(\.|\,)+/g, ',');
		  value = value.replace(/^,+|,+$/, '');
		  
		  if (value === '') { continue; }
		  
		  $access = true;
		  
		  num = explode(',', value);
		  for (var k in num)
		  { if (typeof fv[k] === 'undefined' || intval(fv[k]) < intval(num[k]))
		    { $access = false;
			  break;
			}
		  }
		  
		  if ($access !== true && confirm('На данной странице находиться flash объекты которым требуется версия flash не ниже: ' + value +
		                                  '\nУ вас установлена: ' + fv + '\n\nПерейти на страницу обновления flash?'))
		  { location.href = 'http://get.adobe.com/flashplayer/'; }
		}
	  }
	}
  }
}