//
// Ctrl+ENTER stuff.
//
document.onkeydown = catchKey;
function catchKey(event)
{
	if (window.event)
		event = window.event;

	if (event.ctrlKey) {
		switch (event.keyCode ? event.keyCode : event.which ? event.which : null) {
		case 13:
			if (window.misprint_popup)
				window.misprint_popup.close();
			window.misprint_popup = window.open("misprint.php", "Misprint", 'width=400,height=400');
			break;
		}
	}
}

//
//	From: http://www.robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/
//	Example call of the function:
//	getStyle(document.getElementById("container"), "font-size");
//
function getStyle(oElm, strCssRule)
{
	var strValue = "";
	try {
		if (document.defaultView && document.defaultView.getComputedStyle) {
			strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
		}
		else if (oElm.currentStyle) {

			strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1) {
				return p1.toUpperCase();
			});
			strValue = oElm.currentStyle[strCssRule];
		}
	}
	catch(e) {
		// Used to prevent an error in IE 5.0
	}
	return strValue;
}

function isHidden(e, bNoCheckType)
{
	if ( getStyle(e, 'visibility') == 'hidden' )
		return true;
	for(var e1 = e; e1 && e1.tagName; e1 = e1.parentNode)	// No 'display' inheritance.
		if ( getStyle(e1, 'display') == 'none' )
			return true;

	if (bNoCheckType)
		return false;

	var sz = e.getAttribute('type');
	return sz && sz.toLowerCase() == 'hidden';
}

//
// From http://xpoint.ru/know-how/JavaScript/PoleznyieFunktsii#UstanovkaObrabotchikaSobyitiya
//
function setGlobalOnLoad(f) {
	var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
	if (root) {
		if (root.addEventListener)
			root.addEventListener("load", f, false);
		else if (root.attachEvent)
			root.attachEvent("onload", f);
	} else if (typeof window.onload == 'function') {
		var existing = window.onload;
		window.onload = function() {
			existing();
			f();
		}
	} else {
		window.onload = f;
	}
}

function isIE()
{
	return /*@cc_on!@*/false;
}

//	<!--[if lt IE 7]>
function correctPNG() // correctly handle PNG transparency in Win IE 5.5 & 6.
{
   var arVersion	= navigator.appVersion.split("MSIE")
   var version		= parseFloat(arVersion[1])
   if ( (version >= 5.5) && (document.body.filters) )
   {
      for(var i = 0; i < document.images.length; i++)
      {
         var img = document.images[i]
         var imgName = img.src.toUpperCase()
         if ( imgName.substring(imgName.length - 3, imgName.length) == "PNG" )
         {
            var imgID = (img.id) ? "id='" + img.id + "' " : ""
            var imgClass = (img.className) ? "class='" + img.className + "' " : ""
            var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
            var imgStyle = "display:inline-block;" + img.style.cssText
            if (img.align == "left") imgStyle = "float:left;" + imgStyle
            if (img.align == "right") imgStyle = "float:right;" + imgStyle
            if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
            var strNewHTML = "<span " + imgID + imgClass + imgTitle
            + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
            + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
            + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
            img.outerHTML = strNewHTML
            i = i-1
         }
      }
   }
}
if ( window.attachEvent )
	window.attachEvent("onload", correctPNG);
//	<![endif]-->

function getX(e)
{
	if ( typeof(e.offsetParent) != 'undefined' ) {
		for(var iRes = 0; e; e = e.offsetParent)
			iRes += e.offsetLeft;
		return iRes;
	} else
		return e.screenLeft;
}
function getY(e)
{
	if ( typeof(e.offsetParent) != 'undefined' ) {
		for(var iRes = 0; e; e = e.offsetParent)
			iRes += e.offsetTop;
		return iRes;
	} else
		return e.screenTop;
}

//
// Превращение iframe в область редактирования.
//
function CWysiwig()
{
	var	m_frame		= null	// <iframe> element,
		,	m_area		= null	// <textarea> element,
		,	m_doc			= null	//
		,	m_wnd			= null	//
		,	m_bShowHTML	= false;	//

	this.init = function(szFrameID, bShowHTML, szText)
	{
		m_bShowHTML = bShowHTML;

		m_frame = frames[szFrameID] ? frames[szFrameID] : document.getElementById(szFrameID);
		if (!m_frame) {
			alert("Ошибка: не найден фрейм с ID = " + szFrameID);
			return -1;
		}

		m_area = document.createElement("textarea");
		if ( isIE() )
			m_frame.document.innerHTML += m_area.innerHTML;
		else
			m_frame.parentNode.insertBefore(m_area, m_frame);
		m_area.style.position	= 'absolute';
		m_area.style.top			= getY(m_frame);
		m_area.style.left			= getX(m_frame);
		m_area.style.width		= m_frame.clientWidth ? m_frame.clientWidth : '100%';
		m_area.style.height		= m_frame.clientHeight ? m_frame.clientHeight : '100%';

		// 1) получить указатель.
		m_doc = m_frame.document		? m_frame.document		: m_frame.contentDocument	? m_frame.contentDocument	: false;
		m_wnd = m_frame.contentWindow	? m_frame.contentWindow	: m_frame.window				? m_frame.window				: false;
		if (!m_doc) {
			alert("Ошибка: броузер не поддерживает <iframe>::document");
			return -2;
		}
		if (!m_wnd) {
			alert("Ошибка: броузер не поддерживает <iframe>::window");
			return -2;
		}

		// 2) Оформить iframe HTML документ.
		if (!m_doc.designMode) {
			alert("Ошибка: броузер не поддерживает <iframe>::document::designMode");
			return -3;
		}
		this.setText(szText);
	}

	this.setText = function(sz)
	{
		if (m_bShowHTML) {
			(m_frame.frameElement ? m_frame.frameElement : m_frame).style.display	= 'none';
			m_doc.designMode			= 'off';
			m_area.style.display		= 'inline';
			m_area.value				= sz;
			return;
		}
		m_area.style.display		= 'none';
		(m_frame.frameElement ? m_frame.frameElement : m_frame).style.display	= 'inline';

		m_doc.open();
		m_doc.write("<html><head></head><body style='background: #fff;'>");
		m_doc.write(sz);
		m_doc.write("</body></html>");
		m_doc.close();

		// Установить designMode.
		m_doc.designMode = 'on';
	}

	this.getText = function()
	{
		return m_bShowHTML ? m_area.value : m_doc.body.innerHTML;
	}

	this.setMode = function(bShowHtml)
	{
		if (bShowHtml == m_bShowHTML)
			return;

		document.getElementById('cmdBold').disabled		=
		document.getElementById('cmdItalic').disabled	=
		document.getElementById('cmdUnd').disabled		=
		document.getElementById('cmdStrike').disabled	=
		document.getElementById('txtPicPath').disabled	=
		document.getElementById('cmdAddPic').disabled	= bShowHtml;

		var sz = this.getText();
		m_bShowHTML = bShowHtml;
		this.setText(sz);
	}

	this.exec = function(szCommand)
	{
		m_wnd.focus();
		m_doc.execCommand(szCommand, null, '');
	}

	this.insertPicture = function()
	{
		// Хитрое определение IE ;)
		var isIE = /*@cc_on!@*/false;

		// Если в IE не установить фокус на окне редактируемого фрейма,
		// то в дальнейшем он может вставить код наверх вашей страницы, а не во фрейм ;)
		m_wnd.focus();
		var SelectionRange = isIE ? m_doc.selection.createRange() : m_wnd.getSelection().getRangeAt(0);

		// вставим картинку.
		var html = "__PICTURE__";

		if (isIE) {
			// тут все просто.
			SelectionRange.pasteHTML(html);
		} else {
			// для остальных используем вспомогательный тег.
			SelectionRange.deleteContents();
			var el = document.createElement("SPAN");
			m_doc.getElementsByTagName("BODY")[0].appendChild(el);

			// Firefox не поймет, если вы сразу замените outerHTML. В версиях ниже 3-ей такое свойство вообще у него отсутствует.
			el.innerHTML = html;
			SelectionRange.insertNode(el);
			el.outerHTML = html;
		}
	}

	this.focus = function()
	{
		var e =	this.m_bShowHTML
				?  m_area
				:  this.m_wnd;
		e.focus();
	}
};

//
function CRoller(eDiv)
{
	var	m_eDiv		//
		,	m_bGrow		//
		,	m_interval;	//

	this.init = function(eDiv)
	{
		if (typeof eDiv == 'string')
			eDiv = document.getElementById(eDiv);

		var r = window.g_CRoller;
		if (r) {
			if (r.m_eDiv == eDiv)
				r.m_bGrow = !r.m_bGrow;
			return;
		}
		window.g_CRoller = this;

		this.m_eDiv	= eDiv;
		//alert(window.g_CRoller.m_eDiv);
		//return;
		this.m_bGrow	= (eDiv.style.display == 'none');

		if (this.m_bGrow) {
			eDiv.parentNode.style.height = '0';
			eDiv.style.display = '';
			var e = get_neighbour_user(eDiv, 1);
			if ( e && is_parent(eDiv, e) ) {
				try {
					e.focus();
				}
				catch(excpt) {
				}
			}
		}
		else
			eDiv.parentNode.style.height = eDiv.offsetHeight + 5 + 'px';
		eDiv.parentNode.style.overflow = 'hidden';

		this.m_interval = setInterval("__animateCRoller()", 20);
	}

	this.init(eDiv);
}

function __animateCRoller()
{
	var r = window.g_CRoller;
	if (!r)
		return;

   var   e1 = r.m_eDiv
      ,  e  = e1.parentNode;

   var   sz = e.style.height;
   if ( sz.substring(sz.length - 2) == "px" )
      sz = sz.substring(0, sz.length - 2);

   var i = parseInt(sz);
   i += r.m_bGrow ? 15 : -15;

   if (r.m_bGrow)
   {
		if (i > e1.offsetHeight + 5) {
			window.clearInterval(r.m_interval);
			e.style.height = 'auto';
			window.g_CRoller = null;
	//    eSel.focus();
			return;
		}
	}
	else
	{
		if (i <= 0) {
			window.clearInterval(r.m_interval);
			e1.style.display = 'none';
			window.g_CRoller = null;
	//    eSel.focus();
			return;
		}
	}

   e.style.height = i + "px";
}

//
String.prototype.LTrim = function(sz)
{
	if (!sz)
		sz = ' \t\n';
	return (String)( !this.length || sz.indexOf(this.charAt(0)) == -1 ? this : this.substr(1).LTrim(sz) );
}
String.prototype.RTrim = function(sz)
{
	if (!sz)
		sz = ' \t\n';
	return (String)( !this.length || sz.indexOf(this.charAt(this.length - 1)) == -1 ? this : this.substr(0, this.length - 1).RTrim(sz) );
}
String.prototype.Trim = function(sz)
{
	return this.LTrim(sz).RTrim(sz);
}
String.prototype.strip_tags = function()
{
	str = this;
	str = str.replace(/<o:p>\s*<\/o:p>/g, "") ;
	str = str.replace(/<o:p>.*?<\/o:p>/g, "&nbsp;") ;
	str = str.replace( /\s*mso-[^:]+:[^;"]+;?/gi, "" ) ;
	str = str.replace( /\s*MARGIN: 0cm 0cm 0pt\s*;/gi, "" ) ;
	str = str.replace( /\s*MARGIN: 0cm 0cm 0pt\s*"/gi, "\"" ) ;
	str = str.replace( /\s*TEXT-INDENT: 0cm\s*;/gi, "" ) ;
	str = str.replace( /\s*TEXT-INDENT: 0cm\s*"/gi, "\"" ) ;
	str = str.replace( /\s*TEXT-ALIGN: [^\s;]+;?"/gi, "\"" ) ;
	str = str.replace( /\s*PAGE-BREAK-BEFORE: [^\s;]+;?"/gi, "\"" ) ;
	str = str.replace( /\s*FONT-VARIANT: [^\s;]+;?"/gi, "\"" ) ;
	str = str.replace( /\s*tab-stops:[^;"]*;?/gi, "" ) ;
	str = str.replace( /\s*tab-stops:[^"]*/gi, "" ) ;
	str = str.replace( /\s*face="[^"]*"/gi, "" ) ;
	str = str.replace( /\s*face=[^ >]*/gi, "" ) ;
	str = str.replace( /\s*FONT-FAMILY:[^;"]*;?/gi, "" ) ;
	str = str.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
	str = str.replace( /<(\w[^>]*) style="([^\"]*)"([^>]*)/gi, "<$1$3" ) ;
	str = str.replace( /\s*style="\s*"/gi, '' ) ;
	str = str.replace( /<SPAN\s*[^>]*>\s*&nbsp;\s*<\/SPAN>/gi, '&nbsp;' ) ;
	str = str.replace( /<SPAN\s*[^>]*><\/SPAN>/gi, '' ) ;
	str = str.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
	str = str.replace( /<SPAN\s*>(.*?)<\/SPAN>/gi, '$1' ) ;
	str = str.replace( /<FONT\s*>(.*?)<\/FONT>/gi, '$1' ) ;
	str = str.replace(/<\\?\?xml[^>]*>/gi, "") ;
	str = str.replace(/<\/?\w+:[^>]*>/gi, "") ;
	str = str.replace( /<H\d>\s*<\/H\d>/gi, '' ) ;
	str = str.replace( /<H1([^>]*)>/gi, '' ) ;
	str = str.replace( /<H2([^>]*)>/gi, '' ) ;
	str = str.replace( /<H3([^>]*)>/gi, '' ) ;
	str = str.replace( /<H4([^>]*)>/gi, '' ) ;
	str = str.replace( /<H5([^>]*)>/gi, '' ) ;
	str = str.replace( /<H6([^>]*)>/gi, '' ) ;
	str = str.replace( /<\/H\d>/gi, '<br/>' ) ; //remove this to take out breaks where Heading tags were
	str = str.replace( /<(U|I|STRIKE)>&nbsp;<\/\1>/g, '&nbsp;' );
	str = str.replace( /<(B|b)>&nbsp;<\/\b|B>/g, '' );
	str = str.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' );
	str = str.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' );
	str = str.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' );
	//some RegEx code for the picky browsers
	var re = new RegExp("(<P)([^>]*>.*?)(<\/P>)","gi");
	str = str.replace( re, "<div$2</div>" );
	var re2 = new RegExp("(<font|<FONT)([^*>]*>.*?)(<\/FONT>|<\/font>)","gi");
	str = str.replace( re2, "<div$2</div>");
	str = str.replace( /size|SIZE = ([\d]{1})/g, '' );
	str = str.replace( /<BR>/gi, '' );

	return str ;
}



// ***************************** abc NEW *****************************************BEGIN V

// Find bottom-level nodes.
function getNeighbourNode(e, bNext)
{
	if (!e)
		return;
	var eRes = bNext ? e.nextSibling : e.previousSibling;
	if (eRes) {
		while(true)
		{
			var nodes = eRes.childNodes;
			if (	!nodes.length
				|| eRes.tagName
				&& (	eRes.tagName.toLowerCase() == 'select'
					||	eRes.tagName.toLowerCase() == 'script'
					)
				)
				return eRes;
			eRes = nodes[bNext ? 0 : nodes.length - 1];
		}
	}

	eRes = e.parentNode;
	if (!eRes)
		return null;
	if ( eRes.tagName && eRes.tagName.toLowerCase() == 'select' )
		return eRes;
	return getNeighbourNode(eRes, bNext);
}

//
function getNeighbourElem(e, iNext, szTagName, szAttr, szValue)
{
	if (!iNext)
		return e;

	var bNext = (iNext > 0);

	while( e = getNeighbourNode(e, bNext) )
	{
		if (	e.nodeType == 1	//	<< ELEMENT_NODE.)
			&&	(	!szTagName
				||	e.tagName.toLowerCase() == szTagName.toLowerCase()
				)
			&& (	!szAttr
				|| e.getAttribute(szAttr) == szValue
				)
			)
		{
			if (bNext)
				iNext--;
			else
				iNext++;

			if (!iNext)
				return e;
		}
	}
}

//
function getNeighbourInput(e, n, szAttr, szValue)
{
	return getNeighbourElem(e, n, 'input', szAttr, szValue);
}

//
function getParentNode(e, szTagName)
{
	while(e) {
		if (!e.tagName)
			return null;
		if ( e.tagName.toLowerCase() == szTagName.toLowerCase() )
			break;
		e = e.parentNode;
	}
	return e;
}

//
function is_parent(eParent, eChild)
{
	while(eChild) {
		eChild = eChild.parentNode;
		if (eChild == eParent)
			return true;
	}
	return false;
}

//
function get_neighbour_impl(e, bNext)
{
	if (bNext) {
		if (e.firstChild)
			return e.firstChild;

		for( ; e; e = e.parentNode)
		{
			if (e.nextSibling)
				return e.nextSibling;
		}
	}
	else {
		if (!e.previousSibling)
			return e.parentNode;

		e = e.previousSibling;
		while(e.lastChild)
			e = e.lastChild;
		return e;
	}
}

function get_neighbour(e, iNext, szTagName, szAttr, szValue)
{
	if (!iNext)
		return e;

	var bNext = (iNext > 0);

	while( e = get_neighbour_impl(e, bNext) )
	{
		if (	e.nodeType == 1	//	<< ELEMENT_NODE.
			&&	(	!szTagName
				||	(	typeof szTagName == 'string'
					?	e.tagName.toLowerCase() == szTagName.toLowerCase()
					:	szTagName(e, szAttr, szValue)
					)
				)
			&& (	!szAttr
				|| ( szAttr == 'class' ? e.className : e.getAttribute(szAttr) ) == szValue
				)
			)
		{
			if (bNext)
				iNext--;
			else
				iNext++;

			if (!iNext)
				return e;
		}
	}
}

function get_neighbour_input(e, iNext, szAttr, szValue)
{
	return get_neighbour(e, iNext, 'input', szAttr, szValue);
}

function get_neighbour_user(e, iNext, szAttr, szValue)
{
	function __isUser(e)
	{
		switch( e.tagName.toLowerCase() ) {
		case 'input':
		case 'textarea':
		case 'select':
			return true;
		}
	}
	return get_neighbour(e, iNext, __isUser, szAttr, szValue);
}

function getElementText(e)
{
	if (e.textContent != undefined)
		return e.textContent;
	if (e.innerText != undefined)
		return e.innerText;
	if (e.outerText != undefined)
		return e.outerText;
}

//
function __chkFld_helper(bOK, bErr, e, sz, bSelect)
{
	var eLabel = document.getElementById( 'lbl' + (e.name ? e.name : (e[0] ? e[0].name : null)) );
	if (!eLabel)
	{
		var eL = e;
		while( eL = getNeighbourNode(eL) )
		{
			if (	eL.nodeType == 3 /*	<< TEXT_NODE */
				&& eL.data.Trim().length > 3
				&&	!getParentNode(eL.parentNode, 'SELECT')
				)
			{
				eLabel = eL.parentNode;
				break;
			}
		}
	}

	if (eLabel && !sz) {
		sz = eLabel.innerHTML.Trim(': \t\r\n').strip_tags();
	//	sz = sz.charAt(0).toLowerCase() + sz.substr(1);
		sz = sz.replace('(*)', '').Trim();
	}

	if	(	sz
		&&	sz.toLowerCase().indexOf('e-mail') != -1
		&&	e.getAttribute('type').toLowerCase() == 'text'
		)
		bOK	=	e.value.indexOf('@')		!= -1
				&& e.value.indexOf('.')		!= -1
				&& e.value.indexOf(' ')		== -1
				&& e.value.Trim().length	> 5;

	if (bOK) {
		if (eLabel) {
			var original_color = eLabel.getAttribute('original_color');
			eLabel.style.color = original_color;
		}
		return bErr;
	}

	if (eLabel) {
		eLabel.setAttribute('original_color', eLabel.style.color);
		eLabel.style.color = "red";
	}

	if (bErr)
		return true;

	if (!bSelect) {
		if (e.length)
			e = e[0];
		if (e.focus)
			e.focus();	//	try { e.focus(); } catch(xxx) {}
	}
	alert('Заполните поле "' + sz + '".');
	return true;
}

//
// Returns true on error 'The field is empty'.
//
function chkFld(bErr, e, sz)
{
	if (!e)
		return bErr;

//	var bSelect = e.tagName && e.tagName == 'SELECT';
	var bSelect =	(e.nodeType == 1)		//	<< ELEMENT_NODE, https://developer.mozilla.org/En/DOM/Node.nodeType .
					&& e.tagName;
	if (bSelect)
		bSelect = ( e.tagName.toLowerCase() == 'select' );
	if ( e.length && /*e[0].checked == undefined && */ !bSelect ) {
		for(var i = 0; i < e.length; i++)
			bErr = chkFld(bErr, e[i], sz);
		return bErr;
	}

	if (/*e.tagName &&*/ isHidden(e) )	// Let invisible INPUTs be empty.
		return bErr;

	var bOK;
	if (e.length) {
		for(var i = 0; i < e.length; i++) {
			if (bSelect ? e[i].selected : e[i].checked) {
				bOK = !bSelect || (e[i].value && e[i].style.fontStyle != 'italic');
				break;
			}
		}
	}
	else if ( e.tagName.toLowerCase() == 'input'&& e.getAttribute('type') && e.getAttribute('type').toLowerCase() == 'radio' ) {
		var eNodeList = document.getElementsByName(e.name);
		if (e != eNodeList[0])
			return bErr;

		for(var i = 0; i < eNodeList.length; i++)
			if (eNodeList[i].checked) {
				eNodeList = null;
				break;
			}

		bOK = (eNodeList == null);
	}
	else {
	//if (sz)		alert(sz.toLowerCase().indexOf('e-mail'));

		bOK = e.value.Trim().length;
	}

	return __chkFld_helper(bOK, bErr, e, sz, bSelect);
}
// ******************************* abc New ***************************************END	 ^

/***************************************************************************** abc OLD
//
function getNeighbourNode(e, bNext)
{
	var eRes = bNext ? e.nextSibling : e.previousSibling;
	if (eRes) {
		while(true)
		{
			var nodes = eRes.childNodes;
			if (!nodes.length)
				return eRes;
			eRes = nodes[bNext ? 0 : nodes.length - 1];
		}
	}

	eRes = e.parentNode;
	return eRes ? getNeighbourNode(eRes, bNext) : null;
}

//
// Returns true on error 'The field is empty'.
//
function chkFld(bErr, e, sz)
{
	var bSelect = e.tagName && e.tagName == 'SELECT';
	if ( e.length && e[0].checked == undefined && !bSelect ) {
		for(var i = 0; i < e.length; i++)
			bErr = chkFld(bErr, e[i], sz);
		return bErr;
	}

	if (e.tagName)															// Let invisible INPUTs be empty.
	{
		if ( getStyle(e, 'visibility') == 'hidden' )
			return bErr;
		for(var e1 = e; e1 && e1.tagName; e1 = e1.parentNode)	// No 'display' inheritance.
			if ( getStyle(e1, 'display') == 'none' )
				return bErr;

	}

	var eLabel = document.getElementById( 'lbl' + (e.name ? e.name : (e[0] ? e[0].name : null)) );
	if (!eLabel)
	{
		var eL = e;
		while( eL = getNeighbourNode(eL) )
		{
			if (eL.nodeType == 3 / *	<< TEXT_NODE * / && eL.data.Trim().length > 1)
			{
				eLabel = eL.parentNode;
				break;
			}
		}
	}

	var bOK;
	if (e.length) {
		alert('aaa');
		for(var i = 0; i < e.length; i++) {
			if (bSelect ? e[i].selected : e[i].checked) {
				bOK = !bSelect || e[i].value;
				break;
			}
		}
	}
	else {
		alert('bbb');
		bOK = e.value.Trim().length;
	}


	if (bOK) {
		if (eLabel)
			eLabel.style.color = "black";
		return bErr;
	}

	if (eLabel) {
		eLabel.style.color = "red";
		if (!sz) {
			sz = eLabel.innerHTML.Trim(': \t').strip_tags();
		//	sz = sz.charAt(0).toLowerCase() + sz.substr(1);
			sz = sz.replace('(*)', '').Trim();
		}
	}
	if (!bErr) {
		if (!bSelect) {
			if (e.length)
				e[0].focus();
			else if (e.focus)
				e.focus();
		}
		alert('Введите ' + sz + '.');
	}
	return true;
}
*********************************************************            abc ****************/

//
// Returns true on error 'The field is empty'.
//
function chkFld2(eErrBox, szDivID, bCondition)
{
	var eDiv	= document.getElementById(szDivID);

	var eLabel = document.getElementById ('lbl' + e.name);
	if (e.value) {
		if (eLabel)
			eLabel.style.color = 0;
		return bErr;
	}
	if (eLabel)
		eLabel.style.color = "red";
	if (!bErr) {
		e.focus();
		alert('Введите ' + sz);
	}
	return true;
}

function addToName(szName, szAdd)
{
	var iLen = szName.length - 2;
   return   szName.substr(iLen) != '[]'
         ?  szName + szAdd
         :  szName.substr(0, iLen) + szAdd + '[]';
}

function isRadio(e)
{
	if ( !e.tagName || e.tagName.toLowerCase() != 'input' )
		return false;
	var sz = e.getAttribute('type');
	return sz && sz.toLowerCase() == 'radio';
}

function setElemValue(e, szVal)
{
	if ( e.length && isRadio(e[0]) ) {
		for(var i = 0; i < e.length; i++)
		{
			var ee = e[i];
			setElemValue(ee, ee.value == szVal);
		}
		return;
	}

	if ( isRadio(e) )
	{
		szVal = !!szVal;
		if (szVal == !!e.checked)
			return;
		e.checked = szVal;
		if (e.onclick)
			e.onclick.call(e);
	}
	else
	{
		if (szVal == e.value)
			return;
		e.value = szVal;
	}
	if (e.onchange)
		e.onchange.call(e);
}

function parseIntEx(val)
{
	while( val.substring(0, 1) == '0' && val.length > 1 )
		val = val.substring(1);
	var iVal = parseInt(val);
	return ('' + iVal) == val ? iVal : NaN;
}

function chkDate(bErr, szName, bRequired, sz, i)		// Use with dateBox() php.
{
	if (bErr && bErr.tagName && szName == undefined)
		szName = bErr.name.slice(0, -1);

	var es = document.getElementsByName(szName);		//	<< hidden input(s).
	if (!es)
		return bErr;

	if ( isNaN(i) ) {
		if (es.length == 1)
			i = 0;
		else {
			for(var i = 0; i < es.length; i++)
				bErr = chkDate(bErr, szName, bRequired, sz, i)
			return bErr;
		}
	}

	var	e		= es[i]	//	<< hidden input.
		,	eD = document.getElementsByName( addToName(szName, 'd') )[i];
	if ( !e || !eD || isHidden(eD) )
		return bErr;

	var	d	= eD.value
		,	eM = document.getElementsByName( addToName(szName, 'm') )[i]
		,	m	= eM.value
		,	y	= document.getElementsByName( addToName(szName, 'y') )[i].value
		,	eH = document.getElementsByName( addToName(szName, 'h') )[i]
		,	eI = document.getElementsByName( addToName(szName, 'i') )[i]
		,	h		// hour,
		,	i2;	// minute ('i' is busy).

	function enlargeTo2(e)
	{
		var d = e.value;
		if ( parseInt(d) && d.length == 1 ) {
			e.value = '0' + d;
			e.setAttribute('last_length', '2');
		}
	}

	enlargeTo2(eD);
	enlargeTo2(eM);

	if (eH) {	// eI must be set valid too.
		h		= eH.value;
		i2		= eI.value;
		enlargeTo2(eH);
		enlargeTo2(eI);
	}

	// Validate a Gregorian date.
	var myDate = new Date()
				,	bEmpty = !d && !m && !y;
	if (eH)
		bEmpty = bEmpty && !h && !i2;

	myDate.setFullYear( y, (m - 1), d );
	var bOk	=	isHidden(eD)	// Let invisible INPUTs be empty.
				|| (bEmpty && !bRequired)
				||	(	( (myDate.getMonth() + 1) == m )
					&& (d < 32)
					&& (y > 1900)
					&& (y < 2200)
					);
	__chkFld_helper(bOk, bErr, eD, sz);
	if (!bOk) {
		e.setAttribute('error_flag', 1);
		setElemValue(e, '');
	}
	if ( !bOk || (bErr && !bErr.tagName) )
		return true;

	e.removeAttribute('error_flag');
	var sz = y + '-' + eM.value + '-' + eD.value;
	if (eH)
		sz += ' ' + h + ':' + i2;
	setElemValue(e, bEmpty ? '' : sz);
}

//
function fixPosition(szDivId, bShow)
{
	var e = document.getElementById(szDivId);									// Div whose position needs fix,
	if (!e)
		return;

	if (bShow != null)
		e.style.visibility = bShow ? 'visible' : 'hidden';
	else
		bShow = e.style.visibility != 'hidden';

	var s = document.forms[0].getElementsByTagName('div')[0].style;	// Style of {body\form\div} div.

	switch(e.className) {
	case 'fixTop':
		var iOffset = bShow ? e.offsetHeight : 0;
		s.paddingTop = iOffset;
		var elems = document.getElementsByTagName('a');
		for( var i = 0; i < elems.length; i++ ) {
			var elem = elems[i];
			if (!elem.name)
				continue;
			iOffset += 0.1;
			elem.style.marginTop		= "-" + iOffset;
			elem.style.paddingTop	= iOffset;
		}
		break;
	case 'fixBottom':
		s.paddingBottom = bShow ? e.offsetHeight : 0;
		break;
	case 'fixWnd':
		var	w = window.innerWidth	? window.innerWidth	: document.body.offsetWidth
			,	h = window.innerHeight	? window.innerHeight	: document.body.offsetHeight;

		e.style.top		= ( (h - e.offsetHeight) / 2 ) + 'px';
		e.style.left	= ( (w - e.offsetWidth)  / 2 ) + 'px';

		if (bShow) {
			var elems = document.getElementsByTagName('div');
			for( var i = 0; i < elems.length; i++ ) {
				var elem = elems[i];
				if (elem.className == 'fixWnd' && elem != e)
					fixPosition(elem.id, false);
			}
		}
		break;
	default:
		alert('Unknown class of div to fix position: ' + e.className);
	}
	if (!bShow)
		return;

	var elems = e.getElementsByTagName('input');
	for( var i = 0; i < elems.length; i++ ) {
		var elem = elems[i];
		try {
			elem.focus();
		}
		catch(excpt) {
			continue;
		}
		break;
	}
}

//
function getRadioVal(eRadio)
{
	for(var i = 0; i < eRadio.length; i++) {
		var e = eRadio[i];
		if (e.checked)
			return e.value;
	}
}

//
function storeControls(eControls, eContent, bStoreInputs)
{
	function replaceElem(e, text, addElem)
	{
		var	newElem	= document.createElement("span");
		if (text) {
			newText	= document.createTextNode(text);
			newElem.appendChild(newText);
		}
		var	h = e.clientHeight
			,	w = e.clientWidth;
		e.parentNode.replaceChild(newElem, e);
		if (addElem)
			addElem.appendChild(e);

		newElem.style.height = h;
		newElem.style.width	= w;
		newElem.style.border = '1px inset #aaa';
	}

	eControls.style.visibility = 'hidden';
	eControls.style.cursor		= 'wait';
	var	addElem	= document.createElement('span')
		,	newText	= document.createTextNode('Пожалуйста, подождите');
	addElem.appendChild(newText);
	eControls.parentNode.insertBefore(addElem, eControls);

	if (bStoreInputs) {
		addElem	= document.createElement('div');
		addElem.style.display = 'none';
		eControls.parentNode.insertBefore(addElem, eControls);
	}
	else
		addElem	= null;

   var elems = eControls.getElementsByTagName('INPUT');
   for(var i = elems.length - 1; i >= 0; i--)
   {
      var e = elems[i];
      switch( e.type.toLowerCase() ) {
      case 'text':
			replaceElem(e, e.value, addElem)
			break;
      case 'checkbox':
      case 'radio':
			replaceElem(e, e.checked ? '<X>' : null, addElem);
			break;
		case 'button':
		case 'submit':
			e.parentNode.removeChild(e);
			break;
		}
   }

	elems = eControls.getElementsByTagName('SELECT');
   for(var i = elems.length - 1; i >= 0; i--)
   {
      var	eSELECT	= elems[i]
			,	sz			= '';;
      if (bStoreInputs) {
			var newSELECT = eSELECT.cloneNode(true);
			newSELECT.value = eSELECT.value;
			addElem.appendChild(newSELECT);
		}

      var elems2 = eSELECT.getElementsByTagName('OPTION');
		for(var j = elems2.length - 1; j >= 0; j--)
		{
			var e = elems2[j];
			if (e.selected) {
				if (sz)
					sz += '<br>';
				sz += e.text;
			}
		}
		replaceElem(eSELECT, sz);
   }

   elems = eControls.getElementsByTagName('TEXTAREA');
   for(var i = elems.length - 1; i >= 0; i--)
   {
      var e = elems[i];
      replaceElem(e, e.value, addElem);
   }

	function _removeHidden(e)
	{
		for(var i = 0; i < e.childNodes.length; i++)
		{
			var eChild = e.childNodes[i];
			if (	(	eChild.getAttribute
					&&	eChild.getAttribute('no_store')
					)
				||	(	eChild.style
					&& (	eChild.style.display == 'none'
						|| eChild.style.visibility == 'hidden'
						)
					)
				)
				eChild.parentNode.removeChild(eChild);
			else
				_removeHidden(eChild);
		}
	}

	_removeHidden(eControls);

	for(var i = 0; i < 10; i++)
	{
		elems = eControls.getElementsByTagName('SCRIPT');
		for(var j = 0; j < elems.length; j++)
		{
			var e = elems[j];
			e.parentNode.removeChild(e);
		}

		var k = eControls.getElementsByTagName('SCRIPT').length;
		if (!k)
			break;
	}

   eContent.value = eControls.innerHTML;
}

//
function getUserFrm()
{
	return document.getElementById('frmUser');
}

//
function queryGetParam(szParamName)
{
   var loc = location.search.substring(1, location.search.length);
   var szParamValue = false;

   var params = loc.split("&");
   for(i = 0; i < params.length; i++) {
      param_name = params[i].substring( 0, params[i].indexOf('=') );
      if (param_name == szParamName) {
         szParamValue = params[i].substring( params[i].indexOf('=') + 1 );
      }
   }
   if (szParamValue) {
      return szParamValue;
   }
   else {
      return false; // Here determine return if no szParamName is found.
   }
}

//
function updateClock()
{
	if (!document.all && !document.getElementById)
		return;
	var thelement	= document.getElementById ? document.getElementById("clock") : document.all.clock;
	var d				= new Date();
	var hours		= d.getHours();
	var minutes		= d.getMinutes();
	var seconds		= d.getSeconds();

	var weekday		= new Array(7);
	weekday[0]		= "Воскресенье";
	weekday[1]		= "Понедельник";
	weekday[2]		= "Вторник";
	weekday[3]		= "Среда";
	weekday[4]		= "Четверг";
	weekday[5]		= "Пятница";
	weekday[6]		= "Суббота";

	var month		= new Array(7);
	month[0]			= "января";
	month[1]			= "февраля";
	month[2]			= "марта";
	month[3]			= "апреля";
	month[4]			= "мая";
	month[5]			= "июня";
	month[6]			= "июля";
	month[7]			= "августа";
	month[8]			= "сентября";
	month[9]			= "октября";
	month[10]		= "ноября";
	month[11]		= "декабря";

	if (minutes <= 9)
		minutes		= "0" + minutes;
	if (seconds <= 9)
		seconds		= "0" + seconds;
	var	sz			= "<font color='" + (seconds % 2 ? "#EEE" : "white") + "'>:</font>"
		,	sz2		= "<font color='" + (seconds % 2 ? "white" : "#EEE") + "'>" + seconds + "</font>"
		,	ctime		= weekday[d.getDay()] + ", " + d.getDate() + " " + month[d.getMonth()] + " " + hours + ":" + minutes + sz + sz2;

	thelement.innerHTML = "<b>" + ctime + "</b>";
	setTimeout("updateClock()", 1000);
}

//
// sprintf function for javascript.
//
function sprintf() {
	if (!arguments || arguments.length < 1 ||!RegExp) { return; }
	var str = arguments[0];
	var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
	var a = b = [], numSubstitutions = 0, numMatches = 0;
	while (a = re.exec(str)) {
	var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
	var pPrecision = a[5], pType = a[6], rightPart = a[7]; numMatches++;
	if (pType == '%') {
	subst = '%';
	} else {
	numSubstitutions++;
	if (numSubstitutions >= arguments.length) {
	alert('Error! Not enough function arguments (' +
	(arguments.length - 1) + ', excluding the string)\n' +
	'for the number of substitution parameters in string (' +
	numSubstitutions + ' so far).');
	}
	var param = arguments[numSubstitutions];
	var pad = '';
	if (pPad && pPad.substr(0,1) == "'") {
	pad = leftpart.substr(1,1);
	} else if (pPad) {
	pad = pPad;
	}
	var justifyRight = true;
	if (pJustify && pJustify === "-") justifyRight = false;
	var minLength = -1;
	if (pMinLength) minLength = parseInt(pMinLength);
	var precision = -1;
	if (pPrecision && pType == 'f') {
	precision = parseInt(pPrecision.substring(1));
	}
	var subst = param;
	switch (pType) {
	case 'b': subst = parseInt(param).toString(2); break;
	case 'c': subst = String.fromCharCode(parseInt(param)); break;
	case 'd': subst = parseInt(param)? parseInt(param) : 0; break;
	case 'u': subst = Math.abs(param); break;
	case 'f': subst = (precision > -1)?
	Math.round(parseFloat(param) * Math.pow(10, precision)) /
	Math.pow(10, precision) : parseFloat(param); break;
	case 'o': subst = parseInt(param).toString(8); break;
	case 's': subst = param; break;
	case 'x': subst = ('' +
	parseInt(param).toString(16)).toLowerCase(); break;
	case 'X': subst = ('' +
	parseInt(param).toString(16)).toUpperCase(); break;
	}
	var padLeft = minLength - subst.toString().length;
	if (padLeft > 0) {
	var arrTmp = new Array(padLeft+1);
	var padding = arrTmp.join(pad?pad:" ");
	} else {
	var padding = ""; } }
	str = leftpart + padding + subst + rightPart;
	}
	return str;
}

function cancelEdit(szLink)
{
	if ( !confirm('Отменить все внесенные на странице изменения?') )
		return false;
//	window.location.reload();
	document.forms[0].subject.value = null;
	showPageCover();
	if (!szLink)
		szLink = window.location.href;
	window.location.href = szLink;
	if ( szLink.indexOf('#') != -1 )
		window.location.reload(true);
//	history.go(0);
	return false;
}

//
// ========== DATA HIERARCHY POSTING ==========
//
// Old engine (no deep hierarchy support).
//
function addArrayItem(szTmplWrapper)
{
   var   eWrap = document.getElementById(szTmplWrapper)
		,	eTmpl = eWrap.getElementsByTagName('div')[0]
      ,  eNew	= eTmpl.cloneNode(true);

   eWrap.parentNode.insertBefore(eNew, eWrap);

   // Focus 1st visible DIV.
   var arr = eNew.getElementsByTagName('input');
   for(var i = 0; i < arr.length; i++) {
		var e = arr[i];
		if ( e.getAttribute('type').toLowerCase() != 'hidden' && !isHidden(e) && !e.value ) {
			e.focus();
			break;
		}
	}
}

function delArrayItem(e)
{
   if ( !confirm(e.title + '?') )
      return false;
	e.parentNode.getElementsByTagName('input')[1].value = '';
   e.parentNode.style.display = 'none';
   return true;
}

function tuneArrayItems(szHiddenNodeName)
{
	if (!szHiddenNodeName)
		return false;

   var es = document.getElementsByName(szHiddenNodeName);

   // Count visible DIVs.
   var n = 0;
   for(var x = 0; x < es.length; x++)
   {
      var e = es[x];
      if (e.nodeType != 1)      //	<< ELEMENT_NODE, https://developer.mozilla.org/En/DOM/Node.nodeType .
         continue;
      var eDiv = getParentNode(e, 'div');
      if (eDiv && eDiv.style.display != 'none')
         n++;
   }

	// Show/hide 'Delete' buttons.
   var bRes = n > 2;
   for(var x = 0; x < es.length; x++)
   {
      var e = es[x];
      if (e.nodeType != 1)      //	<< ELEMENT_NODE, https://developer.mozilla.org/En/DOM/Node.nodeType .
         continue;
      var eDiv = getParentNode(e, 'div');
      if (!eDiv)
         continue;
      var buttons = eDiv.getElementsByTagName('BUTTON');
      if (!buttons.length)
			continue;

      var eBtn = buttons[0];
      if (eBtn.nodeType != 1)   //	<< ELEMENT_NODE.
         continue;
      eBtn.style.display = bRes ? 'inline' : 'none';
   }
   return false;
}


//
//
// ========== DATA HIERARCHY POSTING ==========
//
// New engine (deep hierarchy support).
//
function addArrayItem2(eBtn, iNode)
{
	function renameElem(e, szNewName) {
		if ( !isIE() ) {
			e.setAttribute('name', szNewName);
			return e;
		}

		var	szHtml0	= e.outerHTML
			,	szHtml1;
		do {
			szHtml1 = szHtml0.replace('name="' + e.name + '"', 'name="' + szNewName + '"');
			if (szHtml1 != szHtml0)
				break;

			szHtml1 = szHtml0.replace("name='" + e.name + "'", "name='" + szNewName + "'");
			if (szHtml1 != szHtml0)
				break;
			szHtml1 = szHtml0.replace("name="	+ e.name + " ", "name='" + szNewName + "' ");
			if (szHtml1 != szHtml0)
				break;
			szHtml1 = szHtml0.replace("name="	+ e.name + ">", "name='" + szNewName + "'>");
			if (szHtml1 == szHtml0)
				throw "Failed to rename element";
		} while(false);

		var eNew = document.createElement(szHtml1);
		for(var i = 0; i < e.childNodes.length; i++)
		{
			var	elOpt		= e.childNodes[i]
				,	elOpt2	= elOpt.cloneNode(true);
			eNew.insertBefore(elOpt2, null);
		}

		e.parentNode.replaceChild(eNew, e);
		return eNew;
	}


	function __modifyName(e, iNode) {
		if (e.name)
			e = renameElem( e, e.name.replace('_N0_', '_N' + iNode + '_') )
		for(var i = 0; i < e.childNodes.length; i++)
			__modifyName(e.childNodes[i], iNode);
	}

   var   eWrap = eBtn, szTagName;
   for(;;) {
		eWrap = eWrap.nextSibling;
		szTagName = eWrap.tagName;
		if (!szTagName)
			continue;
		szTagName = szTagName.toLowerCase();
		if (szTagName == 'div')
			break;
		if (szTagName != 'table')
			continue;
		var tbs = eWrap.getElementsByTagName('tbody');
		if (tbs.length)
			eWrap = tbs[0];
		break;
   }
/*
   while(!eWrap.tagName || eWrap.tagName.toLowerCase() != 'div')
		eWrap = eWrap.nextSibling; */
   var	eTmpl = szTagName == 'div' ? eWrap.getElementsByTagName('div')[0] : eWrap.getElementsByTagName('tr')[0]
      ,  eNew	= eTmpl.cloneNode(true);

//	eNew.style.display = 'block';
	if ( isIE() )
		eNew.style.display = '';
	else
		eNew.style.removeProperty("display");
	eNew = eWrap.insertBefore(eNew, null);

	if (iNode)
		__modifyName(eNew, iNode);

   // Focus 1st visible INPUT.
   var arr = eNew.getElementsByTagName('input');
   for(var i = 0; i < arr.length; i++) {
		var e = arr[i];
		if ( isHidden(e) || e.value )
		   continue;
	   try {
		   e.focus();
		   break;
		}
		catch(e) {
		}
	}

	return eWrap;
}

function delArrayItem2(eBtn, bTable)
{
   if ( !confirm(eBtn.title + '?') )
      return false;

	var e;
	if (bTable) {
		e = get_neighbour(eBtn, -1, 'tr');
		e.style.display = 'none';
	}
	else {
		e = eBtn;
		do {
			e = e.nextSibling;
		} while( !e.className || e.className.toLowerCase() != 'div_edit' );

		eBtn.parentNode.style.display = 'none';
	}
	var es = e.getElementsByTagName('input');
	if (es.length) {
		es[0].value = '';
		return true;
	}
	e = e.getElementsByTagName('select')[0];
	var os = e.options;
	for(var i = 0; i < os.length; i++)
	{
		var o = os[i];
		if (!o.value)
		{
			o.selected = true;
			return true;
		}
	}

	var o = new Option('', 0);
	o.selected = true;
	os[os.length] = o;
//	eBtn.parentNode.style.display = 'none';
	return true;
}

function tuneArrayItems2(eWrap)
{
	function ourItem(e)
	{
		var sz = e.tagName;
		if (!sz)
			return;
		sz = sz.toLowerCase();
		return	(	(sz == 'div' && e.className == 'div_edit')
					||	sz == 'tr'
					)
					&&	!isHidden(e);
	}

	if ( ourItem(eWrap) )
		eWrap = eWrap.parentNode;
   var es = eWrap.childNodes;

	// Count visible DIVs/TRs.
   var n = 0;
   for(var i = 0; i < es.length; i++)
   {
      var e = es[i];
      if ( ourItem(e) )
			n++;
   }

	// Show/hide 'Delete' buttons.
   var bRes = n > 1;
   for(var i = 0; i < es.length; i++)
   {
      var e = es[i];
      if ( !ourItem(e) )
         continue;
      var eBtn = e.getElementsByTagName('BUTTON')[0];
		if (eBtn)
			eBtn.style.display = bRes ? 'inline' : 'none';
   }
   return false;
}

//
function setElementOpacity(elem, nOpacity)
{
	var opacityProp = false;
	if (typeof document.body.style.opacity == 'string')               // CSS3 compliant (Moz 1.7+, Safari 1.2+, Opera 9),
		opacityProp = 'opacity';
	else if (typeof document.body.style.MozOpacity == 'string')       // Mozilla 1.6 и младше, Firefox 0.8,
		opacityProp = 'MozOpacity';
	else if (typeof document.body.style.KhtmlOpacity == 'string')     // Konqueror 3.1, Safari 1.1,
		opacityProp = 'KhtmlOpacity';
	else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) // Internet Exploder 5.5+,
		opacityProp = 'filter';                                        // нет прозрачности.

	if (!elem || !opacityProp)
		return; // Если не существует элемент с указанным id или браузер не поддерживает ни один из известных функции способов управления прозрачностью.

	if (opacityProp == "filter")  // Internet Exploder 5.5+.
	{
		nOpacity *= 100;
		// Если уже установлена прозрачность, то меняем её через коллекцию filters, иначе добавляем прозрачность через style.filter
		var oAlpha = elem.filters['DXImageTransform.Microsoft.alpha'] || elem.filters.alpha;
		if (oAlpha)
			oAlpha.opacity = nOpacity;
		else
			elem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")"; // Для того чтобы не затереть другие фильтры используем "+=".
	}
	else // Другие браузеры.
		elem.style[opacityProp] = nOpacity;
}

var pageCoverOpacity = 0, g_intervalPageCover;
function __pageCoverAnimate()
{
	var e = document.getElementById('pageCover');
	if (e.style.display == 'none') {
		clearInterval(g_intervalPageCover);
		return;
	}
	if (pageCoverOpacity < 0.7) {
	//	setElementOpacity(e, pageCoverOpacity);
		if (pageCoverOpacity * 5 % 5)
			//e.style.backgroundColor = 'rgb(' + Math.floor(0xCC * pageCoverOpacity) + ',' + Math.floor(0xCC * pageCoverOpacity) + ',' + Math.floor(0xCC * pageCoverOpacity) + ')';
			setElementOpacity(e, pageCoverOpacity);
		pageCoverOpacity += 0.05;
	}
	var img = e.getElementsByTagName('img')[0];
	setElementOpacity(img, 1);
	var i = parseInt( img.src.substr(img.src.length - 5, 1) );
	img.src = 'icons1/loading/' + (i + 1) % 10 + '.gif';
//	setTimeout('__pageCoverAnimate();', 50);
}

function showPageCover()
{
	setConfirmUnload(false);
	document.body.style.overflow = 'hidden';
	var e = document.getElementById('pageCover');
	if (!e)
		return;
	pageCoverOpacity = 0.2;
	setElementOpacity(e, pageCoverOpacity);
	e.style.display = 'block';
//	setElementOpacity(e, 0.7);
	var eImg = e.getElementsByTagName('img')[0];
//	setElementOpacity(eImg, 1);

//	__pageCoverAnimate();
	g_intervalPageCover = setInterval('__pageCoverAnimate()', 50);
	return false;
}

function stopPageCover(/*bFull*/)
{
	if ( !confirm('Отменить запрос к серверу?') )
		return;
//	if (bFull) {
	if ( isIE() )
		document.execCommand('Stop');
	else
		window.stop();
//	}
	document.body.style.overflow = 'auto';
	var e = document.getElementById('pageCover');
	e.style.display = 'none';
	setElementOpacity(e, 0);
	setConfirmUnload(true);
}

function setConfirmUnload(bON, w)
{
	if (!w)
		w = window;
	w.onbeforeunload = bON ? function() { return 'ВНИМАНИЕ! Введенные данные не сохранены на сервер.\nПри уходе со страницы они будут утеряны!'; } : null
}

function tuneCollapseAll()
{
	var	e	= document.getElementById('cmdCollapseAll')
		,	es = document.getElementsByTagName('div');

	var bVisible = false;
	for(var i = 0; i < es.length; i++)
	{
		var eDiv = es[i];
		if (eDiv.className != 'div_move')
			continue;

		if (!eDiv.style.height) {
			bVisible = true;
			break;
		}
	}

	e.title		=
	e.innerHTML	= bVisible ? 'Свернуть все' : 'Развернуть все';
	return bVisible;
}

function collapseMove(e, bVisible)
{
	if (!e)
		return;
	var 	bDiv 	= (e.tagName.toLowerCase() == 'div')
		,	eDiv 	= bDiv ? e : e.parentNode;

	if (bDiv)
		e = get_neighbour(e, 1, 'button');

	var eDivMove = eDiv.nextSibling;
	if (bVisible == null)
		bVisible = eDivMove.style.height;
	eDivMove.style.height = bVisible ? null : '0';
	eDivMove.style.overflow = 'hidden';

	e.title		= bVisible ? 'Свернуть' : 'Развернуть';
	tuneCollapseAll();
	return false;
}

function collapseAllMoves(e)
{
	var bVisible = !tuneCollapseAll();
	var es = document.getElementsByTagName('div');
	for(var i = 0; i < es.length; i++)
	{
		var eDiv = es[i];
		if (eDiv.className != 'title')
			continue;
		collapseMove(eDiv, bVisible);
	}
	return false;
}

function fireEvent(obj, evt)
{
	var fireOnThis = obj;
	if (document.createEvent) {
		var evObj = document.createEvent("MouseEvents");
		evObj.initEvent(evt, true, false);
		fireOnThis.dispatchEvent(evObj);
    }
	else if (document.createEventObject) {
		fireOnThis.fireEvent("on" + evt);
	}
}

function commonOnChange(w, bPassive)
{
	if (typeof g_bFalseChange != 'undefined' && g_bFalseChange)
		return true;

	if (!w)
		w = window;
	var cmdSave = w.document.getElementById('cmdSave');
	if (!cmdSave)
		return;
	cmdSave.disabled	= false;

   if (bPassive)
		return;
   w.document.getElementById('cmdCancel').disabled = false;
	setConfirmUnload(true, w);
}

function runSelectAction(szURL, target, target2)
{
	window.selectionTarget  = (typeof target  == 'string') ? document.getElementById(target)  : target;
	window.selectionTarget2 = (typeof target2 == 'string') ? document.getElementById(target2) : target2;
	window.open(szURL, "_blank", "left=150,top=120,status=0,toolbar=0,location=0,menubar=0,resizable=1,width=800,height=550,scrollbars=1");
   return false;
}

function runSelectAction2(e, szURL, bSingle)
{
	e.blur();

	if ( e.tagName.toLowerCase() == 'button' )
		e = get_neighbour_input(e, -1, "type", "text");

	if (bSingle)
		return runSelectAction(szURL, e)

	var e2 = get_neighbour_input(e, -1, "type", "hidden");
	return runSelectAction(szURL, e2, e);
}

function runSelectAction3(e, szUrlTemplate)
{
	var	eHidden	= get_neighbour_input(e, -1, "type", "hidden")
		,	szURL		= szUrlTemplate.replace('%DATA%', eHidden.value);
	return runSelectAction2(e, szURL);
}

function endSelectAction(res1, res2)
{
	function setVal(e, val)
	{
		e.style.border =
		e.style.borderColor = '';
		e.value = val;
	}

	var w = window.opener;
	if (!w) {
		alert('Родительское окно не надено, выбор не возможен');
		window.close();
		return false;
	}

	var	e1 = w.selectionTarget
		,	e2	= w.selectionTarget2;

	setVal(e1, res1);
	if (e2)
		setVal(e2, res2);
	window.close();
	if (e1.onchange)
		e1.onchange.call(e1);
	try {
		(e2 ? e2 : e1).focus();
	}
	catch(e) {}
   return false;
}

function doInfoClick(e, szUrlTemplate, bFar)
{
	var szVal;
	if (typeof bFar == "string" && bFar == "select")
	{
		var eSelect = get_neighbour(e, -1, 'select');
		szVal	= eSelect.value;
	}
	else
	{
		var eHidden	= get_neighbour_input(e, bFar ? -2 : -1, "type", "hidden");
		szVal = eHidden.value;
		if (bFar)
			szVal = szVal.substring(2) + '&kind=' + szVal.substring(0, 2);
	}

	var szURL = szUrlTemplate.replace('%DATA%', szVal);

	e.blur();
	e.getElementsByTagName('img')[0].blur();
	window.open(szURL, '_blank', 'left=150,top=120,status=0,toolbar=0,location=0,menubar=0,resizable=1,width=800,height=550,scrollbars=1');
	return false;
}

function tuneRed(fnChk, eThis, parm1, parm2, parm3)
{
	var szErr = (typeof fnChk != 'function') ? fnChk :	fnChk(eThis, parm1, parm2, parm3);
	eThis.style.border = szErr ? '1px solid red' : ( isIE() ? '1px solid #aaa' : '');

	var eErr = get_neighbour(eThis, 1);
	if (eErr)
		if ( !eErr.tagName || eErr.tagName.toLowerCase() != 'span' || eErr.className != 'error' )
			eErr = null;

	if (!szErr) {
		if (eErr)
			eErr.parentNode.removeChild(eErr);
		return true;
	}

	if (typeof szErr != 'string')
		szErr = '';

	if (eErr)
		eErr.innerHTML = szErr;
	else {
		eErr = document.createElement('span');
		eErr.className = 'error';
		var eErr_content = document.createTextNode(szErr);
		eErr.appendChild(eErr_content);
		eThis.parentNode.insertBefore(eErr, eThis.nextSibling);
	}

	try {
		eThis.focus();
	}
	catch(e) {}
	window.do_not_scroll = true;
	return false;
}

function tuneRed2(bErr, eThis)
{
	eThis.style.border	= bErr ? '1px solid red'	: ( isIE() ? '1px solid #aaa' : '');
	eThis.style.color		= bErr ? 'red'					: ( isIE() ? '#000'				: '');
	return bErr;
}

function chkDatePart(e, iMin, iMax)
{
	if ( isIE() )	// Let's not fine-tune buggy IE.
		return;
	function chkDatePart_impl(e, iMin, iMax)
	{
		var val = e.value.Trim();
		e.value = val;
		if (!val)
			return;
		val = parseIntEx(val);
		if ( isNaN(val) || iMin > val || (iMax && val > iMax) )
			return true;
	}
	var	bPrevErr	= isRed(e)
		,	bErr		= tuneRed2( chkDatePart_impl(e, iMin, iMax) , e );
	slipNext(e, bErr, bPrevErr);
}

function isRed(e)
{
	var sz = e.style.border;
   return sz && sz.indexOf('red') != -1;
}

function slipNext(e, bErr, bPrevErr)
{
	var	iMaxLen	= e.getAttribute('maxlength')
		,	iLast		= e.getAttribute('last_length')
		,	iNew		= e.value.length;
	e.setAttribute('last_length', iNew);
	if ( !(	!bErr
			&& (	iLast == iMaxLen - 1
				||	(	iLast == iMaxLen
					&&	bPrevErr
					)
				)
			&& iNew == iMaxLen
			)
		)
		return;
	for(;;) {
		e = get_neighbour(e, 1);
		switch( e.tagName.toLowerCase() ) {
		case 'input':
		case 'select':
		case 'textarea':
			if (	e.getAttribute('readonly')
				|| e.getAttribute('disabled')
				)
				break;
			e.focus();
			return;
		}
	}
}

function updateTooltipBox(e)
{
   var	eBox	= get_neighbour(e, 1, 'div', 'class', 'tooltip_box')
		,	eOpt	= e.selectedIndex < 0 ? null : e.options[e.selectedIndex]
		,	sz		= eOpt ? eOpt.getAttribute('title') : '';

	eBox.innerHTML = sz;
	eBox.style.display = sz ? '' : 'none';
}

function tune_list(e, bSel)
{
	if (typeof bSel == 'boolean')
	{
		e.blur();
		var e = get_neighbour(e, -1, 'select');
		for(var i = 0; i < e.options.length; i++)
		{
			var o = e.options[i];
			o.selected = bSel;
		}
		if (e.onchange)
			e.onchange.call(e);
		return false;
	}
	if (e.disabled)
		return;
	var b1, b2, sz = '';
	for(var i = 0; i < e.options.length; i++)
	{
		var o = e.options[i];
		if (o.selected) {
			b1 = true;
			sz += o.value + ';';
		}
		else
			b2 = true;
	}
	var	eAll = get_neighbour(e, 1, 'button')
		,	eNo  = get_neighbour(eAll, 1, 'button');
	eNo.disabled = !b1;
	eAll.disabled = !b2;

	e = get_neighbour(e, -1, 'input', 'type', 'hidden');
	setElemValue(e, sz);
}

function create_bookmark(szUrl, szTitle)
{
   if (window.sidebar) {                     // Mozilla Firefox Bookmark,
      window.sidebar.addPanel(szTitle, szUrl, "");
   } else if (window.external) {             // IE Favorite,
      window.external.AddFavorite(szUrl, szTitle);
   }
   else if (window.opera && window.print) {  // Opera Hotlist.
      return true;
   }
   else
      alert('Ваш браузер не поддерживает автоматическое создание закладок. Добавьте закладку на эту страницу вручную через интерфейс браузера');
}

function selector_func(e, szTagName, iCount)
{
	if (!szTagName)
		szTagName = 'span';
   var	iSelection = parseInt(e.value)
		,	bON =  e.checked;
   e = get_neighbour(e, 1, szTagName);
   for(var i = 1; e; e = e.nextSibling)
   {
      if ( !e.tagName || e.tagName.toLowerCase() != szTagName)
         continue;
		var b = iSelection == ( iCount ? i++ : e.getAttribute('data_kind') );
		if (!bON && !b)	// Turned-off radio affects only itself.
			continue;
		b = bON && b;
      e.style.display = b ? '' : 'none';
      for( var ee = e; (ee = get_neighbour_user(ee, 1)) && is_parent(e, ee); )
			ee.disabled = !b;
      if (iCount && i > iCount)
			break;
   }
}

function showDivPopup(e, bShow, bSelf)
{
   if (!bSelf)
   {
      var eDiv = get_neighbour(e, -1, "div");
      if (bShow && !bSelf) {
			y = getY(e) - window.pageYOffset;
         var bUp = (y * 2 > window.innerHeight);
         eDiv.style.bottom = bUp ? "-10px" : null;
         eDiv.style.top		= bUp ? null : "22px";
      }
      e = eDiv;
   }
   e.style.display = bShow ? "inline" : "none";
}
