var d=document;
var sep_elem='NWE';
var sep='PNX';
var next='XNP';

// плавный переход от одного цвета к другому, и обратно
function Blink(startColor, endColor, obj, speed, step)
{
	var count=0, rgb=[];
	rgb[0] = hexToDec(startColor); 
    rgb[1] = hexToDec(endColor);
	int=setInterval(function(){
			if(count<step)
			{
				red = parseInt(rgb[0][0] + (rgb[1][0] - rgb[0][0]) * (count/step)); 
            	green = parseInt(rgb[0][1] + (rgb[1][1] - rgb[0][1]) * (count/step)); 
           		blue = parseInt(rgb[0][2] + (rgb[1][2] - rgb[0][2]) * (count/step)); 
				//$('message_div').innerHTML+=red+" "+green+" "+blue+"; ";
				obj.style.backgroundColor=decToHex([red, green, blue]);
				count++;
			} else 
			{
				window.clearInterval(int);
				count=0;
				rgb[0] = hexToDec(endColor); 
			    rgb[1] = hexToDec(startColor);
				int_back=setInterval(function(){
						if(count<step)
						{
							red = parseInt(rgb[0][0] + (rgb[1][0] - rgb[0][0]) * count/step); 
							green = parseInt(rgb[0][1] + (rgb[1][1] - rgb[0][1]) * count/step); 
							blue = parseInt(rgb[0][2] + (rgb[1][2] - rgb[0][2]) * count/step); 
							obj.style.backgroundColor=decToHex([red, green, blue]);
						} else 
						{
							window.clearInterval(int_back);
							obj.style.backgroundColor='#'+startColor;
						}
						count++;
					},speed);
			}

		},speed);
}
// Функция для перевода цвета из шестнадцатиричного представления формата RRGGBB 
// в массив из трех десятиричных значений формата [rrr,ggg,bbb]. 
function hexToDec(hex) { 
      var i, hash, dec = []; 
      hash = { 
            'A' : 10, 'B' : 11, 'C' : 12, 'D' : 13, 'E' : 14, 'F' : 15 
      } 
      for (i = 0; i <= 9; i++) hash[''+i] = i; 
      for (i = 0; i < hex.length; i++) { 
            if (i % 2 == 0) dec[parseInt(i / 2)] = hash[hex.charAt(i)] * 16; 
            else dec[parseInt(i / 2)] += hash[hex.charAt(i)]; 
      } 
      return dec; 
} 
// Функция обратно собирающая шестнадцатеричное представление 
function decToHex(decArray) { 
      var hex = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']; 
      var out = "#"; 
      for (var i = 0; i < decArray.length; i++) { 
            dec = parseInt(decArray[i]); 
            out += hex[parseInt(dec / 16)] + hex[dec % 16]; 
      } 
      return out; 
} 
function defMousePosition(event) { 
      var x = y = 0; 
      if (document.attachEvent != null) { // Internet Explorer & Opera 
            x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft; 
			y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop; 
      } 
      if (!document.attachEvent && document.addEventListener) { // Gecko 
            x = event.clientX + window.scrollX; 
			y = event.clientY + window.scrollY; 
      } 
      return {x:x, y:y}; 
}
function removeHTMLTags(text) {
                strInputCode = text.replace(/&(lt|gt);/g, function (strMatch, p1){
                        return (p1 == "lt")? "<" : ">";
                });
                var strTagStrippedText = strInputCode.replace(/<\/?[^>]+(>|$)/g, "");
                return strTagStrippedText;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// определяет скролл страницы
function defScroll() {
      var x=y=h=0;
      // Gecko поддерживает свойства scrollX(scrollY)
      // Для IE & Opera приходится идти в обход
      x = (window.scrollX) ? window.scrollX : document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft;
      y = y = (window.scrollY) ? window.scrollY : document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop;
      
	  var docHt = 0, sh, oh;
        if (document.height) {
                docHt = document.height;
        } else if (document.body) {
                if (document.body.scrollHeight) docHt = sh = document.body.scrollHeight;
                if (document.body.offsetHeight) docHt = oh = document.body.offsetHeight;
                if (sh && oh) docHt = Math.max(sh, oh);
        }
        h=docHt;
	  return {x:x, y:y, h:h}; 
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// выдаёт абсолютные координаты любого(!) элемента
function absPosition(obj) { 
      var x = y = 0; 
      while(obj) { 
            x += obj.offsetLeft; 
            y += obj.offsetTop; 
			obj = obj.offsetParent; 
      } 
	  return {x:x, y:y}; 
}
function fixQuotes(s)
{
	return s.replace(/\'/g,"\\'").replace(/\"/g,'\\"');
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// функция просто заменяет символ % на %% (нужно для корректного сохранения в базу)
function fixPercents(s)
{
	return s.replace(/%/g,'%%');
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ф-ия, отрезающая промежутки с обоих сторон строки
function trim(s)
{
  return rtrim(ltrim(s));
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ф-ия, отрезающая промежутки с левой стороны строки
function ltrim(s)
{
  return s.replace(/^\s+/, ''); 
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ф-ия, отрезающая промежутки с правой стороны строки
function rtrim(s)
{
  return s.replace(/\s+$/, ''); 
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция очищает нужный список obj_select (удаляются все options)
function clear_select(obj_select)
{
	for (var i=obj_select.options.length-1; i >= 0; i--)
	{
		obj_select.remove(i);
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция вставляет узел node после опорного узла referencenode в родительский узел parent
function insertAfter(parent, node, referenceNode) 
{
    parent.insertBefore(node, referenceNode.nextSibling);
}	

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция вставляет узел node на первое место в родительском узле parent
function prependChild(parent, node) 
{
    parent.insertBefore(node, parent.firstChild);
}

//---------------------------------------------------------------------------------------------------------------------------------------------------
//	object  - объект для прослушивания события
//	event   - название события (строка)
//	hfunc   - метод-обработчик 
//---------------------------------------------------------------------------------------------------------------------------------------------------
function add_event(object, event, hfunc)
{
	if (object.addEventListener)
		object.addEventListener(event,hfunc,false);
	else if (object.attachEvent)
		object.attachEvent('on'+event,hfunc);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция отображает сообщение (action- видимость сообщения; indic-тип индикатора; text-текст сообщения)
function show_msg(action, indic, text)
{
	if (action==1)
	{
		d.getElementById('sys_msg').innerHTML=text;
		if (indic==1)
			d.getElementById('img_msg').src=img_dir+'loading.gif';
		else
			d.getElementById('img_msg').src=img_dir+'msg.gif';
		d.getElementById('d_msg').style.display='inline';
	}
	else 
	{
		d.getElementById('d_msg').style.display='None';
		d.getElementById('sys_msg').innerHTML='';
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция меняет курсор при наведении на объект
function changeCursor(obj, i) 
{
	t=i;
	if(i==0)t="DEFAULT"
	else if(i==1)t="CROSSHAIR"
	else if(i==2)t="HAND"
	else if(i==3)t="MOVE"
	else if(i==4)t="TEXT"
	else if(i==5)t="WAIT"
	obj.style.cursor=t;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция создает объект Request или сообщает о неподдерживаемости этого свойста браузером
/*function createRequest() {
  try {
    request = new XMLHttpRequest();
  } catch (trymicrosoft) {
    try {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (othermicrosoft) {
      try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        request = false;
      }
    }
  }

  if (!request)
    alert("Error initializing XMLHttpRequest!");
}*/

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция создает объект Request или сообщает о неподдерживаемости этого свойста браузером
/*function createReq(objReq) {
  try {
    objReq = new XMLHttpRequest();
  } catch (trymicrosoft) {
    try {
      objReq = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (othermicrosoft) {
      try {
        objReq = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        objReq = false;
      }
    }
  }

  if (!objReq)
    alert("Error initializing XMLHttpRequest!");
}*/

function add_option(objSel, value, text, selected)
{
	var element=d.createElement("option");
	element.value=value;
	element.innerHTML=text;
	if (selected)
		element.selected=true;
	objSel.appendChild(element);
}
function getOptionByValue(parent,v)
{
	for (var j=0; j<parent.options.length; j++)
		if (parent.options[j].value==v) return parent.options[j];
	return false;
}
function getParam(param_name)
{
	var param = location.search.substring(1).split('&');
	for (var i=0; i<param.length; i++)
	{
		if (param[i].split('=')[0]== param_name)
		{
			value= param[i].split('=')[1];
			return value;
		}
		else
			alert('Неверный параметр URL: '+ param_name)
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция ЗАПОЛНЯЕТ  СПИСОК значениями
//	objSel - 		объект типа select
//	elem -		массив со строками вида 	Value Sep Text	
//	start_index -	стартовый индекс массива, с которого начинать заполнение списка 
function fill_select(objSel,response_str,clear_option)
{
	if (clear_option)
	{
		var element=d.createElement('option')
		objSel.appendChild(element);
	}
	
	var elem=response_str.split(next);
	
	if (elem[0].indexOf(sep)==-1)
		var selected=elem[0];
	if (selected)
		start_index=1
	else
		start_index=0;
		
	for (var i=start_index; i<elem.length;i++)
	{
		var element=d.createElement("option");
		element.value=elem[i].substring(elem[i][0],elem[i].indexOf(sep));
		element.innerHTML=elem[i].substring(elem[i].indexOf(sep)+sep.length,elem[i].length);
		if (selected)
			if (element.value==selected)
				element.selected=true;
		objSel.appendChild(element);
	}
	if (!selected)
		objSel.selectedIndex=-1;
}

function $(id)
{
	return document.getElementById(id)
}
// проверка правильности E-mail
function validEmail(email)
{
	invalidChars="/:,;"
	for (i=0;i<invalidChars.length;i++)
	{
		badChar=invalidChars.charAt(i)
		if (email.indexOf(badChar,0)>-1)
		{
			return false
		}
	}
	atPos = email.indexOf("@",1)
	if (atPos == -1) {return false}
	if (email.indexOf("@",atPos+1)>-1) { return false }
	periodPos= email.indexOf(".",atPos)
	if (periodPos==-1) {return false}
	if ((periodPos+3)>email.length) {return false}
	return true
}
// Базовый объект 
var net = new Object(); 
// Состояния запроса 
net.READY_STATE_UNINITIALIZED = 0; 
net.READY_STATE_LOADING = 1; 
net.READY_STATE_LOADED = 2; 
net.READY_STATE_INTERACTIVE = 3; 
net.READY_STATE_COMPLETE = 4; 
// Конструктор 
// key - Ключ запроса в массиве requestsHash 
// method - метод отправки запроса (POST, GET) 
// url - URL скрипта на сервере, который обработает запрос 
// params - параметры запроса (test=1&flag=2) 
// onload - callback-функция, обработчик после загрузки 
// onerror - callback-функция, обработчик в случае ошибки 
// contentType - тип контента запроса (text/html) 
// headers - прочие заголовки, кроме content-type, например, Expires 
net.ContentLoader = function(key, method, url, params, onload, onerror, contentType, headers) { 
      this.hashKey = key; 
      // Свойство для рапознавания браузеров, не поддерживающих request 
      this.unrequestBrowser = false; 
      // request - объект 
      this.req = null; 
      this.onload = onload; 
      // Если её нет, вызывается дефолтный обработчик 
      this.onerror = (onerror) ? onerror : this.defaultError; 
      // Вызываем метод для генерации запроса 
      this.loadXMLDoc(method, url, params, contentType, headers); 
} 
// Все методы записаны в прототип 
net.ContentLoader.prototype = { // Methods 
      // loadXMLDoc - метод, для генерации request-запроса 
      loadXMLDoc : function(method, url, params, contentType, headers) { 
            if (!method) method="GET"; 
            if (!contentType && method=="POST") contentType='application/x-www-form-urlencoded'; 
            if (window.XMLHttpRequest) { 
                  this.req=new XMLHttpRequest(); 
            } else if (window.ActiveXObject) { 
                  this.req=new ActiveXObject("Microsoft.XMLHTTP"); 
            } else { 
                  this.unrequestBrowser = true; 
                  return; 
            } 
            if (this.req) { 
                  try { 
                        this.req.open(method,url,true); 
                        if (contentType){ 
                              this.req.setRequestHeader('Content-Type', contentType); 
                        } 
                        if (headers) { 
                              for (var h in headers) { 
                                    this.req.setRequestHeader(h,headers[h]); 
                              } 
                        } 
                        var loader=this; 
                        this.req.onreadystatechange=function() { 
                              loader.onReadyState.call(loader); 
                        } 
                        this.req.send(params); 
                  } catch (err){ 
                        this.onerror.call(this); 
                  } 
            } 
      }, 
      // onReadyState - метод для обработки ответов сервера 
      onReadyState : function() { 
            var req=this.req; 
            var ready=req.readyState; 
            if (ready==net.READY_STATE_COMPLETE) { 
                  var httpStatus=req.status; 
                  if (httpStatus==200 || httpStatus==0) { 
                        this.onload.call(this); 
                  } else { 
                        this.onerror.call(this); 
                  } 
            } 
      }, 
      // defaultError - метод обработки ошибок по умолчанию 
      defaultError : function() { 
            alert("error fetching data!"+"\n\nreadyState:"+this.req.readyState +"\nstatus: "+this.req.status+"\nheaders: "+this.req.getAllResponseHeaders()); 
      } 
} 

// добавляет функцию conteins, если её не было | эта часть кода всегда должна быть в конце этого файла
if (window.Node && Node.prototype && !Node.prototype.contains)
{
	Node.prototype.contains = function (arg) {
		return !!(this.compareDocumentPosition(arg) & 16)
	}
}
