// JavaScript Document
//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// 																																 //
//****** функции для простой навигации по DOM-структуре HTML-документа ********// 
//																																//
//   prev(elem) == previousSibling без учета текстовых узлов											//
//   next(elem) == nextSibling	-------------//-------------//-------------										//
//   first(elem) == firstChild	-------------//-------------//-------------											//
//   last(elem) == lastChild	-------------//-------------//-------------											//
//   parent(elem) == parentNode	-------------//-------------//-------------									//
//																																//			
//*************поиск элементов, получение их атрибутов и стилей****************//
//																																//	
//   tag(name, elem) == getElementsByTagName															//
//   id(name) == getElementById																					//
//																																//
//   hasClass(name, elem) - функция для получения элементов с заданным именем			//
//									  класса (из всего документа если не задан elem  и из числа     //
//									  элементов с тегом elem если он задан)						    	    //
//																																//																											
//   text(elem) - функция для получения текста из заданного										//
//				  		элемента, даже если он содержит другие											//
//                		элементы																							//
//																																//
//	  attr(elem, name, value) - функция для получения и установки									//
//										  атрибутов элемента															//
//																																//
//   getStyle(elem, name) - функция обеспечивает поиск для элемента 							//
//									   вычисляемых значений стиля												//
//																																//
//************************************************************************//
//																																//
//   domReady(f) - функция контроля за загрузкой DOM перед										//
//        		           выполнением сценария																	//
//																																//
//************функции для позиционирования элементов на странице*************//
//
//    pageX(elem), pageY(elem) - функции для определения реальных координат
//    										   элемента в пределах страницы
//
//   parentX(elem), parentY(elem) - функции для определения реальных координат
//    											   элемента в пределах родителя
//
//   posX(elem), posY(elem) - функции для определения реальных координат в
// 										  пределах CSS контейнера
//
//   setX(elem, pos), setY(elem, pos) - функции для точного указания положения 
//													   элемента на странице не зависимо от его 
//													   текущего положения
//
//   addX(elem, pos), addY(elem, pos) - функции для указания положения 
//													    элемента на странице относительно его 
//													    текущего положения
//
//   getWidth(elem), getHeight(elem) - функции для определения ширины и высоты 
//														элемента
//
//   fullHeight(elem), fullWidth(elem) - функции для определения высоты элемента
//													  даже если он скрыт
//
//*********************функции для анимирования  объектов******************************
//
//   hide(elem), show(elem) - функции для скрытия и отображения элементов
//
//   slideDown(elem), slideUp(elem) - функции для разворачивания и сворачивания
//   												элементов


//////////////////////////////////////////////////////////MOVING THROUGH HTML DOCUMENT////////////////////////////////////////////////////////////

function prev(elem) {
	do{
		elem=elem.previousSibling;
	} while (elem&&elem.nodeType!=1)
	return elem;
}

function next(elem) {
	do{
		elem=elem.nextSibling;
	} while (elem&&elem.nodeType!=1)
	return elem;
}

function last(elem) {
	do{
		elem=elem.lastChild;
	} while (elem&&elem.nodeType!=1)
	return elem;
}

function first(elem) {
	do{
		elem=elem.firstChild;
	} while (elem&&elem.nodeType!=1)
	return elem;
}

function parent(elem, num){
	num=num||1;
	for(var i=0; i<num;i++)
		if( elem!=null)elem=elem.parentNode;
	return elem;
}

/////////////////////////////////////////////////GETTING ELEMENTS ATTRIBUTES AND STYLE///////////////////////////////////////////////////////////////////////////

function tag(name,elem){
	return(elem||document).getElementsByTagName(name);
}

function id(name){
	return document.getElementById(name);
}

function hasClass(name, elem){
	var r=[];
	var e=document.getElementsByTagName(elem||"*");
	for (var j=0; j<e.length; j++){
			if (attr(e[j], "class")==name) r.push(e[j]);
		}
	return r;	
}

function text(elem){
	elem=elem.childNodes||elem;
	for (var j=0; j<elem.length; j++){
		t+=elem[j].nodeType!=1 ? elem[j].nodValue : text(e[j].childNodes);
	}
	return t;
}

function attr(elem, name, value){
	//Гарантирование допустимости предоставленного имени
	if (!name || name.constructor != String) return "";
	
	// определение не относится ли имя к запрещенным именам
	name= { "for" : "htmlfor", "class" : "className" }[name]||name;
	
	//если пользователь устанавлвает значение, то
	if (typeof  value != "undefined"){
	//сначала установить быстрый способ
		elem[name]=value;
		//по возможности воспользоваться setAttribute
		if (elem.setAttribute)
		elem.setAttribute (name, value);
		}
		//вернуть значение аттрибута
		return elem[name] || elem.getAttribute(name) || "";
}

function getStyle(elem, name){
	if (elem.style[name])
		return elem.style[name];
	else if (elem.currentStyle)
		return elem.currentStyle[name];
	else if (document.defaultView&&document.defaultView.getComputedStyle){
		name=name.replace(/([A-Z])/g,"-$1");
		name=name.toLowerCase();
		var s=document.defaultView.getComputedStyle(elem, "");
		return s && s.getPropertyValue(name);
	} else
	return null;
}

///////////////////////////////////////////////////////////////LOAD CONTROL//////////////////////////////////////////////////////////////////////////

function domReady(f){
	//если DOM уже загружена немедленно выполнить функцию
	if (domReady.done) return f();
	
	//если мы уже дополнили функцию
	if (domReady.timer){
		//внести ее в список исполняемых
		domReady.ready.push(f);
	} else {
		//подключение события завершения загрузки страницы на случай
		//если ее загрузка закончится первой (для супер реактивного FireFox)
		//window.onload=isDOMReady();
		addEvent (window, "load", isDOMReady);
		//инициализация массива исполняемых функций
		domReady.ready=[f];
		
		//проверка DOM на готовность проводимая, как можно скорее
		domReady.timer=setInterval(isDOMReady,13);
	}
}

//проверка DOM на готовность к перемещению по ее структуре
function isDOMReady(){
	//если мы уже определили готовность страницы проигнорировать
	// дальнейшее выполнение
	if (domReady.done) return false;
	
	//проверка доступности некоторых элементов и функций
	if(document && document.getElementsByTagName &&
	   document.getElementById && document.body){
		
		//если они готовы, можно прекратить проверку
		clearInterval(domReady.timer);
		domReady.timer=null;
		
		// выполнение всех ожидающих функций
		for (var i=0; i<domReady.ready.length; i++)
		domReady.ready[i]();
		
		//сохранение того, что только что было сделано
		domReady.ready=null;
		domReady.done=true;
	}
}

////////////////////////////////////////////////////////////////POSITION/////////////////////////////////////////////////////////////////////

function pageX(elem){
	return elem.offsetParent ? elem.offsetLeft+pageX(elem.offsetParent) : elem.offsetLeft;
}

function pageY(elem){
	return elem.offsetParent ? elem.offsetTop+pageY(elem.offsetParent) : elem.offsetTop;
}

function parentX(elem){
	return elem.parentNode == elem.offsetParent ? elem.offsetLeft : pageX(elem) - pageX(elem.parentNode);
}

function parentY(elem){
	return elem.parentNode == elem.offsetParent ? elem.offsetTop : pageY(elem) - pageY(elem.parentNode);
}

function posX(elem){
	return parseInt(getStyle(elem,"left"));
}

function posY(elem){
	return parseInt(getStyle(elem,"top"));
}

function setX(elem, pos){
	if (parentX(elem)!=null)
		elem.style.left=pos -(pageX(elem)-parentX(elem))+"px";
	else if (getStyle(elem,"left") = "auto")
		elem.style.left=pos-8+"px";
	else 
		elem.style.left=pos +"px";

}

function setY(elem, pos){
	if (parentY(elem)!=null)
		elem.style.top=pos -(pageY(elem)-parentY(elem))+"px";
	else if (getStyle(elem, "top") = "auto")
		elem.style.top=pos-8+"px";
	else 
		elem.style.top=pos +"px";
}

function addX(elem, pos){
	setX(elem, pageX(elem)+pos);
}

function addY(elem, pos){
	setY(elem, pageY(elem)+pos);
}
function getWidth(elem){
	return (getStyle(elem, "width"));
}

function getHeight(elem){
	return (getStyle(elem, "height"));
}

function fullHeight(elem){
	if (getStyle(elem, "display") != "none")
		return elem.offsetHeight || getHeight(elem);
	var old= resetCSS (elem, {display:"", visibility:"hidden"});
	var h = elem.clientHeight || getHeight (elem);
	restoreCSS (elem, old);
	return h;
}

function fullWidth(elem){
	if (getStyle(elem, "display") != "none")
		return elem.offsetWidth || getWidth(elem);
	var old= resetCSS (elem, {display:"", visibility:"hidden"});
	var w = elem.clientWidth || getWidth (elem);
	restoreCSS (elem, old);
	return w;
}


function resetCSS (elem, prop){
	for(var i in prop){
		var old={};
		old[i]=elem.style[i];
	}
	elem.style.display="block";
	elem.style.visibility="hidden";
}

function restoreCSS (elem, prop){
	for(var i in prop){
		elem.style[i]=prop[i];
	}
	
	elem.style.display="none";
	elem.style.visibility="";
}


///////////////////////////////////////////////////////////////ANIMATION//////////////////////////////////////////////////////////////////////////////

function hide(elem){
	var curDisplay=getStyle(elem, "display");
	if(curDisplay!="none")
	elem.$oldDisplay=curDisplay;
	elem.style.display="none";
	}
	
function show(elem){
	elem.style.display=elem.$oldDisplay||"block";
	}
	
function slideDown(elem){
	var pos=0, timer;
	var h = parseInt(fullHeight(elem)); 
	elem.style.height="0px";
	show(elem);
	timer=setInterval(function(){
		pos+=4;
		if (pos>=100){
			clearInterval(timer);
		}
		elem.style.height=((pos/100)*h)+"px";
	}, 25);
}

function slideUp(elem){
	var pos=0, timer;
	var h = parseInt(fullHeight(elem));
	timer=setInterval(function(){
		pos+=4;
		if (pos>100){
			clearInterval(timer);
			hide(elem);
			elem.style.height=h+"px";
		}
		elem.style.height=(h-(pos/100)*h)+"px";
	}, 25);
}


