/* Получение объекта jQuery (по ID) */

function byId(obj)
{
	var $obj;

	if(typeof(obj)=="object") $obj=$(obj);
	else $obj=$("#"+obj);
	
	return $obj;
}

/* Получение объектов jQuery (по классу) */

function byClass(objs)
{
	var $objs;

	if(typeof(objs)=="object") $objs=$(objs);
	else $objs=$("."+objs);
	
	return $objs;
}

/* Функция получения объектов по классу */

function getElementsByClass(className,parent,return_array)
{
	if(typeof(parent)=="string") var oParent=document.getElementById(parent)
	else if(typeof(parent)=="object") var oParent=parent;
	else var oParent=document;
	
	var allObjects=oParent.getElementsByTagName("*");
	
	var objects=new Array();
	
	for(var i=0; i<allObjects.length; i++)
		if(allObjects[i].className.indexOf(className)+1) objects.push(allObjects[i]);
	
	if(!objects.length) return null;
	else if(objects.length==1 && !return_array) return objects[0];
	else return objects;
}

/* Перезагрузка страницы */

function pageReload()
{
	window.location.reload(); // Перезагрузка
}

/* Функция закрытия всех ссылок */

function closeLinks(link)
{
	var activeLinks=document.getElementsByName("on"); // Активные ссылки
	var inactiveLinks=document.getElementsByName("off"); // Неактивные ссылки
	
	for(var i=0; i<activeLinks.length; i++)
		if(activeLinks[i].id!=link.id) activeLinks[i].name="off"; // Выключение всех активных ссылок кроме текущей
		
	for(var i=0; i<inactiveLinks.length; i++)
		if(inactiveLinks[i].id!=link.id) inactiveLinks[i].name="off"; // Выключение всех неактивных ссылок кроме текущей
}

/* Функция закрытия всех плавающих окон */

function closeWindows(link,ending)
{
	var activeLinks=document.getElementsByName("on"); // Активные ссылки
	var inactiveLinks=document.getElementsByName("off"); // Неактивные ссылки
	
	for(var i=0; i<activeLinks.length; i++)
		if(activeLinks[i].id!=link.id) // Если не текущая активная ссылка
		{
			var oLinkObj=document.getElementById(activeLinks[i].id.substring(0,activeLinks[i].id.indexOf(ending))); // Объект, на который указывает активная ссылка
			if(oLinkObj) // Если объект существует
			{
				oLinkObj.style.display="none"; // Скрываем его
				activeLinks[i].name="off"; // Выключаем активную ссылку
			}
		}
				
	for(var i=0; i<inactiveLinks.length; i++)
		if(inactiveLinks[i].id!=link.id) // Если не текущая неактивная ссылка
		{
			var oLinkObj=document.getElementById(inactiveLinks[i].id.substring(0,inactiveLinks[i].id.indexOf(ending))); // Объект, на который указывает неактивная ссылка
			if(oLinkObj) // Если объект существует
			{
				oLinkObj.style.display="none"; // Скрываем его
				inactiveLinks[i].name="off"; // Выключаем неактивную ссылку
			}
		}
}

/* Конструктор элемента INPUT */

function createInput(parent,childId,childName,childType,childMaxLength,childDefault,disabled,childClass)
{
	// Родительский блок
	if(typeof(parent)=="string") var oParent=document.getElementById(parent); 
	else if(typeof(parent)=="object") var oParent=parent;
	
	var oChild=document.createElement("input"); // Создание элемента "input"

	if(childId) oChild.id=childId; // ID
	if(childName) oChild.name=childName; // Имя
	if(childType) oChild.type=childType; // Тип
	if(childMaxLength) oChild.maxlength=childMaxLength; // Максимальное кол-во символов (для полей ввода)
	if(childDefault) oChild.value=childDefault; // Значение
	if(disabled) oChild.disabled=true; // Выключен ли
	if(childClass) oChild.className=childClass; // Класс
	
	oParent.appendChild(oChild); // Добавление созданного input'а к родительскому элементу
}

/* Конструктор элемента DIV */

function createDiv(parentId,childId,childName,childDefault)
{
	var oChild=document.createElement("div"); // Создание блока

	if(childId) oChild.id=childId; // ID
	if(childName) oChild.name=childName; // Имя
	if(childDefault) oChild.innerHTML=childDefault; // Содержимое
	
	document.getElementById(parentId).appendChild(oChild); // Добавление созданного блока к родительскому элементу
}

/* Функция подтверждения удаления */

function confirmDelete(link,confirmText)
{
	if(confirm(confirmText)) location=link; // Если дан утвердительный ответ на вопрос, то происходит переход по указанной ссылке
}

/* Функция всплывающего блока при нажатии на ссылку */

function displayBlockL(openId,closeId,link,beforeName,afterName,link_name,no_close_others)
{
	if(!no_close_others) closeWindows(link,"_link"); // Закрытие всех блоков-окон, если не запрещено
	if(link_name) link.name=link_name; // Принудительное указание имени ссылки
	
	switch(link.name) // В зависимости от имени ссылки
	{
		case "off": default: // Если выключена - включаем
			if(closeId) document.getElementById(closeId).style.display="none"; // Закрываем блок-окно, если задан блок для закрытия
			document.getElementById(openId).style.display="block"; // Открываем блок-окно для открытия
			if(afterName) link.innerHTML=link.title=afterName; // Если указано имя ссылки после нажатия, устанавливаем его
			link.name="on"; // Включаем ссылку
			break;
			
		case "on": // Если включена - выключаем
			if(closeId) document.getElementById(closeId).style.display="block"; // Открываем блок-окно, если задан блок для закрытия
			document.getElementById(openId).style.display="none"; // Закрываем блок-окно для открытия
			if(beforeName) link.innerHTML=link.title=beforeName; // Возвращаем старое имя ссылки, если оно было изменено
			link.name="off"; // Выключаем ссылку
			break;
	}
}

/* Функция всплывающего блока при нажатии на ссылку */

function displayBlock($open,$close)
{
	// Закрытие остальных окон
	if($close)
		$close.each(function(){
			$(this).hide();
		});

	// Открытие нужных окон
	$open.each(function(){
		switch($(this).css("display")) // В зависимости от текущего состояния
		{
			case "none": // Невидимый
				$(this).show();
				break;

			default: // Видимый
				$(this).hide();
				break;
		}
	});
}

/* Функция всплывающего блока при нажатии на CheckBox */

function displayBlockCB(objId,oChbox,reverse)
{
	switch(oChbox.checked) // В зависимости от состояния checkbox'а
	{
		case true: // Если включен
			if(!reverse) document.getElementById(objId).style.display="block"; // Делаем блок видимым
			else document.getElementById(objId).style.display="none"; // Или невидимым, если задан режим инверсии
			break;
			
		case false: // Если выключен
			if(!reverse) document.getElementById(objId).style.display="none"; // Делаем блок невидимым
			else document.getElementById(objId).style.display="block"; // Или видимым, если задан режим инверсии
			break;
	}
}

/* Функция добавления поля выбора */

function inputSelect(parent,fieldsName,oField,selIndex,url)
{
	// Родительский блок
	if(typeof(parent)=="string") var oParentBlock=document.getElementById(parent); 
	else if(typeof(parent)=="object") var oParentBlock=parent;
	
	// Список полей
	if(typeof(fieldsName)=="string") var oFields=document.getElementsByName(fieldsName); 
	else if(typeof(fieldsName)=="object") var oFields=fieldsName;
	
	// Если выбрано неактивное поле
	if(oField && oField.options[oField.selectedIndex].disabled==true) 
	{
		oField.selectedIndex=0;
		return false;
	}
	
	if(oField.selectedIndex) // Если в поле выбран элемент
	{
		var emptyFields=0; // Пустые поля
		var matches=0; // Кол-во совпадений
		
		for(var i=0; i<oFields.length; i++) 
		{
			if(!oFields[i].selectedIndex) emptyFields++; // Если в поле не выбран элемент - то поле пустое
			if(oField.value==oFields[i].value) matches++; // Если значения нового поля и одного и существующих полей совпадают - то увеличивается счетчик совпадений
		}
		
		if(matches==1) // Если нет совпадений
		{
			if(!emptyFields) // Если нет пустых полей
			{
				var oLastField=oFields[oFields.length-1]; // Последнее поле
				var oSelectBlock=oLastField.parentNode; // Родитель последнего поля
				
				if(!url) // Если используется Ajax
				{
					var oNewSpec=document.createElement('DIV'); // Создается новое поле для специальности
					oNewSpec.id="field";
					oNewSpec.innerHTML=oSelectBlock.innerHTML;
					
					oNewSpec.getElementsByTagName("SELECT")[0].selectedIndex=0; // Выбор первого варианта у SELECT'а
					
					oParentBlock.appendChild(oNewSpec); // Добавляется блок
				}
				else // Без Ajax
				{
					var oNewBlock=document.createElement('DIV'); // Создается новый блок для специальности
					var oNewSpec=document.createElement('DIV'); // Создается новое поле для специальности
					
					oNewSpec.id="field";
					oNewSpec.innerHTML=oSelectBlock.innerHTML;
					
					oNewSpec.getElementsByTagName("SELECT")[0].selectedIndex=0; // Выбор первого варианта у SELECT'а
					
					var oNewGroups=document.createElement('DIV'); // Создается новое поле для групп
					oNewGroups.className="test_groups";
					
					oNewBlock.appendChild(oNewSpec); // Добавляется поле для специальности
					oNewBlock.appendChild(oNewGroups); // Добавляется поле для групп
					oParentBlock.appendChild(oNewBlock); // Добавляется блок
				}
			}
		}
		else // Если есть совпадения 
		{
			oField.selectedIndex=0; // Блок обнуляется
			if(emptyFields) // Если пустые поля уже есть
			{
				var oSelectBlock=url?oField.parentNode.parentNode:oField.parentNode;
				oParentBlock.removeChild(oSelectBlock); // Ребенок удаляется
			}
			
			alert("Данный вариант уже выбран. Вам необходимо выбрать другой вариант.");
		}
		if(url) testSpec(oField.value,oField.parentNode.parentNode,url); // Добавление поля ввода для групп
	}
	else if(oFields.length>1) // Если кол-во полей с невыбранными значениями больше 1
	{
		var oSelectBlock=url?oField.parentNode.parentNode:oField.parentNode;
		oParentBlock.removeChild(oSelectBlock); // Ребенок удаляется
	}
}

/* Проверка доступности значений в Select'е */

function selectCheck(select,oSelect)
{
	/* Список Select'ов */
	
	if(typeof(select)=="string") var oSelects=document.getElementsByName(select); 
	else var oSelects=select;
	
	// Если выбрано неактивное поле
	if(oSelect && oSelect.options[oSelect.selectedIndex].disabled==true) 
	{
		oSelect.selectedIndex=0;
		return false;
	} 
			
	/* Доступность всех пунктов меню всех списков */
	
	for(var i=0; i<oSelects.length; i++) 
		for(var j=1; j<oSelects[i].options.length; j++) 
		{
			oSelects[i].options[j].disabled=false; // Активация пункта меню
			oSelects[i].options[j].style.color="#000";  // Черный цвет (активный)
		}	

	/* Определение недоступности уже выбранных списков */

	for(var i=0; i<oSelects.length; i++)
		if(oSelects[i].value!=0) // Если выбрано значение
			for(var j=0; j<oSelects.length; j++) 
				if(i!=j) 
				{
					oSelects[j].options[oSelects[i].selectedIndex].style.color="#aaa"; // Серый цвет (неактивный)
					oSelects[j].options[oSelects[i].selectedIndex].disabled=true; // Дезактивация пункта меню, если он уже выбран в другом списке	
				} 
}

/* Проверка доступности значений в Select'ах */

function selectsCheck(parent,oSelect)
{
	var oParent=document.getElementById(parent); // Родительский блок
	var oFields=oParent.getElementsByTagName("SELECT"); // Список SELECT'ов
	
	selectCheck(oFields,oSelect); // Проверка SELECT'а 
}

/* Проверка URL */

function checkLink(link,mode)
{
	var reg;

	switch(mode)
	{
		case "url": default:
			reg=/^(?:(?:https?|ftp|telnet):\/\/(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:рф|com|net|org|mil|edu|arpa|ru|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:\/[a-z0-9.,_@%&?+=\~\/-]*)?(?:#[^ \'\"&<>]*)?$/i;
			return reg.test(link);
		
		case "email":
			reg=/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
			return reg.test(link);
	}
}

/* Функция вставки элементов B,U,I,A */

function markup(mark,mode,id,address_default)
{
	var params_str='';
	var text='';
	var sel_text='';

	if(navigator.appName=="Microsoft Internet Explorer") // Для IE
	{
		var rng;

		if(document.selection) // Если есть выделение
		{
		    document.getElementById(id).focus(); // Установка фокуса на области ввода
		    rng=document.selection.createRange(); // Создание объекта из выделения
		}

		sel_text=rng.text;
	}
	else // Для других браузеров
	{
		var textarea=document.getElementById(id); // Область ввода

		var before_select=textarea.value.substr(0,textarea.selectionStart); // Точка начала выделения
		var after_select=textarea.value.substr(textarea.selectionEnd); // Точка окончания выделения
		sel_text=textarea.value.substr(textarea.selectionStart,textarea.selectionEnd-textarea.selectionStart);
	}

	if(mark=="url" || mark=="email") // Если ссылка или e-mail
	{
		var address=prompt("Адрес",checkLink(sel_text,mark)?sel_text:address_default); // Получение адреса от пользователя
		if(address==null) return false; // Выход, если ввод отменен

		while(address=="" || address==address_default) // До тех пор, пока введенное значение не отличается от значения по умолчанию
		{
			alert("Необходимо ввести значение");
			address=prompt("Адрес",checkLink(sel_text,mark)?sel_text:address_default); // Получение адреса от пользователя

			if(address==null) return false; // Выход, если ввод отменен
		}

		address=address.replace(/"/g,''); // Удаление кавычек в адресе
		address=address.replace(/'/g,''); // Удаление апострофов в адресе
		address=address.replace(/\s/g,''); // Удаление пробелов в адресе

		var text=prompt("Текст",!checkLink(sel_text,mark)?sel_text:''); // Получение текста от пользователя
		if(text==null) return false; // Выход, если ввод отменен

		var title=prompt("Всплывающая подсказка",''); // Получение подсказки от пользователя
		if(title==null) return false; // Выход, если ввод отменен

		title=title.replace(/"/g,''); // Удаление кавычек в подсказке

		if(text!='') params_str+='='+address;
		else sel_text=address;
		if(title) params_str+=' title="'+title+'"';
	}

	if(navigator.appName=="Microsoft Internet Explorer") // Для IE
		rng.text=(mode==2)?"["+mark+params_str+"]"+rng.text+"[/"+mark+"]":"["+mark+"]"; // Добавление тэгов
	else // Для других браузеров
	{
		var select=(mode==2)?"["+mark+params_str+"]"+(text?text:sel_text)+"[/"+mark+"]":"["+mark+"]"; // Обрамление выделения тэгами
		textarea.value=before_select+select+after_select; // Вставка нового контента на место выделения
	}
}

/* Функция вставки элементов B,U,I,A */

function markupNew(mark,mode,name,address_default)
{
	var params_str='';
	var text='';
	var sel_text='';

	if(navigator.appName=="Microsoft Internet Explorer") // Для IE
	{
		var rng;

		if(document.selection) // Если есть выделение
		{
			document.getElementsByName(name)[0].focus(); // Установка фокуса на области ввода
		    rng=document.selection.createRange(); // Создание объекта из выделения
		}

		sel_text=rng.text;
	}
	else // Для других браузеров
	{
		var textarea=document.getElementsByName(name)[0]; // Область ввода

		var before_select=textarea.value.substr(0,textarea.selectionStart); // Точка начала выделения
		var after_select=textarea.value.substr(textarea.selectionEnd); // Точка окончания выделения
		sel_text=textarea.value.substr(textarea.selectionStart,textarea.selectionEnd-textarea.selectionStart);
	}

	if(mark=="url" || mark=="email") // Если ссылка или e-mail
	{
		var address=prompt("Адрес",checkLink(sel_text,mark)?sel_text:address_default); // Получение адреса от пользователя
		if(address==null) return false; // Выход, если ввод отменен

		while(address=="" || address==address_default) // До тех пор, пока введенное значение не отличается от значения по умолчанию
		{
			alert("Необходимо ввести значение");
			address=prompt("Адрес",checkLink(sel_text,mark)?sel_text:address_default); // Получение адреса от пользователя

			if(address==null) return false; // Выход, если ввод отменен
		}

		address=address.replace(/"/g,''); // Удаление кавычек в адресе
		address=address.replace(/'/g,''); // Удаление апострофов в адресе
		address=address.replace(/\s/g,''); // Удаление пробелов в адресе

		var text=prompt("Текст",!checkLink(sel_text,mark)?sel_text:''); // Получение текста от пользователя
		if(text==null) return false; // Выход, если ввод отменен

		var title=prompt("Всплывающая подсказка",''); // Получение подсказки от пользователя
		if(title==null) return false; // Выход, если ввод отменен

		title=title.replace(/"/g,''); // Удаление кавычек в подсказке

		if(text!='') params_str+='='+address;
		else sel_text=address;
		if(title) params_str+=' title="'+title+'"';
	}

	if(navigator.appName=="Microsoft Internet Explorer") // Для IE
		rng.text=(mode==2)?"["+mark+params_str+"]"+rng.text+"[/"+mark+"]":"["+mark+"]"; // Добавление тэгов
	else // Для других браузеров
	{
		var select=(mode==2)?"["+mark+params_str+"]"+(text?text:sel_text)+"[/"+mark+"]":"["+mark+"]"; // Обрамление выделения тэгами
		textarea.value=before_select+select+after_select; // Вставка нового контента на место выделения
	}
}

/* Функция подсказки в поле INPUT */

function inputCaption(oInput,caption)
{
	if(oInput.value==caption) // Если значение поля - подсказка
	{
		// Удааление полсказки
		oInput.value="";
		oInput.className="";
	}
	else if(oInput.value=="") // Если поле - пустое
	{
		//Добавление подсказки
		oInput.value=caption;
		oInput.className="input_caption";
	}
}

/* Функция удаления лишних элементов из NodeList */

function clearNodeList(oNodeList)
{
	for(var i=0; i<oNodeList.length; i++)
		if(oNodeList[i].nodeType!=1) // Если элемент иерархии - текстовый блок
		{
			oNodeList[i].parentNode.removeChild(oNodeList[i]); // Удаление элемента их иерархии объектов
			i--;
		}
}

/* Функция подсчета элементов NodeList */

function countNodeList(oNodeList)
{
	var count=0;
	
	for(var i=0; i<oNodeList.length; i++)
		if(oNodeList[i].nodeType==1) // Если элемент иерархии - тэг
			count++;
	
	return count;
}

/* Функция определения внутренностей тэга */

function tagParams(outerHTML,innerHTML)
{
	var tag=""; // Внутренности тэга
	var pos; // Точкаразрыва

	pos=outerHTML.indexOf(innerHTML); // Опредедление точки разрыва
	tag=outerHTML.substring(0,pos); // Копирование до точки разрыва
	
	return tag; // Возвращение результата
}

/* Функция преобразования строки в массив */

function explode(separator,str)
{
	var i=0;
	var arr=new Array(); // Массив
	str+=separator;
	
	while(str.length) // Пока не конец строки
	{
		var n=str.indexOf(separator); // Ищем первый разделитель
		var val=str.substring(0,n); // Получаем часть строки до первого разделителя
		str=str.substring(n+separator.length); // Вырезаем часть строки до первого разделителя
		
		arr[i++]=val*1; // Добавляем вырезанную строку в массив
	}
	
	return arr; // Возвращаем массив
}

/* Выбор категории глобального поиска */

function globalSearchSelectCat(cat)
{
	$(".cat_name").removeClass("active");
	$(".cat").hide();
	
	$("."+cat+"_name").addClass("active");
	$("."+cat+"_results").show();
}
