/*************************************************************
* Определение броузера.
* Взято с kruglov.ru
*************************************************************/
isDOM = document.getElementById //DOM1 browser (MSIE 5+, Netscape 6, Opera 5+)
isOpera = isOpera5 = window.opera && isDOM //Opera 5+
isOpera6 = isOpera && window.print //Opera 6+
isOpera7 = isOpera && document.readyState //Opera 7+
isMSIE = document.all && document.all.item && !isOpera //Microsoft Internet Explorer 4+
isMSIE5 = isDOM && isMSIE //MSIE 5+
isNetscape4 = document.layers //Netscape 4.*
isMozilla = isDOM && navigator.appName == "Netscape" //Mozilla или Netscape 6.*

function getScrollLeft()
{
    return  window.pageXOffset
            || document.documentElement.scrollLeft
            || document.body.scrollLeft
            || 0;
}
    
function getScrollTop()
{
    return window.pageYOffset
           || document.documentElement.scrollTop
           || document.body.scrollTop
           || 0;
}

function getClientHeight()
{
    return document.documentElement.clientHeight;
}

function getClientWidth()
{
    return document.documentElement.clientWidth;
}

function openW(src,name,w,h)
{
    popup.show_size_image(src,w,h);
}

var msg_paste_name = 'Вставить в текст сообщения имя этого пользователя.';
var msg_about_user = 'Информация о пользователе (откроется в новом окне).';
var msg_deleted_user = 'Пользователь не существует. Удалён или никогда не существовал.';
var msg_img_mail = 'Из-за соображений политики безопасности электропочта выводится в качестве рисунка, а не гиперссылки. Запомните визуально адрес и впишите в свой почтовый клиент.';
var msg_robot_delete  = 'Вырезано роботом: Недопустимая длинна слова.';
var msg_edit_message = 'Редактировать сообщение';
var msq_quote_all = 'Цитировать всё';
var red_star = "Это поле является обязательным для заполнения.";
var msg_logout = 'Выйти из системы';
var msg_edit_data = 'Изменить персональные данные';
var msg_userinfo = 'Посмотреть персональные данные';
var msg_edit_post = "Править своё сообщение";
var msg_select_quote = "Вставить цитатой в текстовое поле выделение на странице";
var msg_users_list = 'Список пользователей';

/*
* Открытие окна с информацией о пользователе.
*/
function openTextWindow(p)
{
	window.open(p, '', 'width=600, height=400, ,toolbar=0,menubar=0,scrollbars=1,resizable=1,location=0,status=0,left=100,top=100');
}

function print(path, config)
{
	window.open(path, "", config);
}

function get_selection()
{
	if (document.getSelection){selection = document.getSelection();} 
	else {selection = document.selection.createRange().text;}
}


var paste_name = 'Вставить в текст сообщения имя этого пользователя.';
var msg_about_user = 'Информация о пользователе (откроется в новом окне).';
var msg_deleted_user = 'Пользователь не существует. Удалён или никогда не существовал.';
var msg_robot_delete  = 'Вырезано роботом: Недопустимая длинна слова.';
var red_star = "Это поле является обязательным для заполнения.";

var color_3 = "#CC0000";
var color_5 = "#000000";

//***** Скрытие-открытие слоёв *******************************************************
//
//Функция возвращает строку, которая представляет собой описание блока
//Это для обеспечения совместимости между броузерами
//display="" - это значит сделать отображение по умолчанию. 
//если был блок - станет блок, был none - будет none. 
//была ячейка таблички - будет ячейкой и пр.
function get_block(){
if(document.getElementById)
		return "block";
	else return "";
}

//Функция предназначена для скрытия/открытия блоков с помощью событий типа click
//Принимает id элемента, которого нужно обработать и flag
//Если flag в истине, то идёт внутренний переход на #id_элемента
function hide_show_layer(i,flag){
	var lnk = document.getElementById(i)
	var status = get_block();
	
	if(lnk.style.display=="none"){
		lnk.style.display=status;
		if(flag)	location.href = "#"+i;
		return true;
		}
	else if(lnk.style.display==status){
		lnk.style.display="none";
		return true;
		}
}
//Показать блок
function show_layer(i){
	var status = get_block();
	document.getElementById(i).style.display=status;
}
//Скрыть блок
function hide_layer(i){
	document.getElementById(i).style.display="none";
}
//************************************************************************************



//Функция сканирует поля формы form, вытаскиваем имена областей типа text, password и textarea 
//и помещает их в массив
//Используется в функциях: put_num_chars, is_empty_input
function get_input(form)
{
	var my_array = new Array();
	var j=0;
	
	for (var i=0; i<document.forms[form].elements.length; i++)
	{
		var type = document.forms[form].elements[i].type;
		
		if (type=="text" || type=="password" || type=="textarea")
		{
			my_array[j++] = document.forms[form].elements[i].name;
		}
	}
	
	return my_array;
}

//Устанавливает фокус на элементы формы form
function put_focus(form){
	//	АЛГОРИТМ:
	//	Если поле заполнено, то мы переходим к следующему полю, указанному в массиве
	//		Если оно пусто, то ставим фокус и выходим.
	//		Иначе продолжаем цикл с помощью continue.
	//	Если поле не заполнено, ставим фокус, выходим.	
	
	for(var i=0;i<document.forms[form].length-1;i++){
		if(document.forms[form].elements[i].value!="")
			if(document.forms[form].elements[i+1].value!="")
				continue;
			else {
				if(document.forms[form].elements[i+1].offsetHeight != 0){
  					document.forms[form].elements[i+1].focus();
				}
			break;
			} 
		else {
			if(document.forms[form].elements[i].offsetHeight != 0){
  				document.forms[form].elements[i].focus();
			}
		break;
		}
	}
}// End function put_focus

//Функция считает количесто символов в полях ввода и текстовых областях form_node_id, а затем выводит это количество
//в узлах view_node_id
//Принимет в качестве параметров имя узла view_node_id и id элемета формы form_node_id, значение которого нужно подсчитать.
function count(view_node_id, form_node_id){
	var textId = document.getElementById(view_node_id);
	var formId = document.getElementById(form_node_id);
	var len = 0;
	
	if(formId.nodeName.toUpperCase()=="INPUT"){
	len = formId.value.length;
		textId.firstChild.nodeValue = len;
			if(len)	document.getElementById(view_node_id).style.color = color_3;
			else document.getElementById(view_node_id).style.color = color_5;
	}
	else if(formId.nodeName.toUpperCase()=="TEXTAREA"){
		//Если текстовая област не имеет деток, в лице первого узла - значения textarea,
		//то мы просто не входим туда для подсчёта символов
		if(formId.firstChild!=null){
		len = formId.firstChild.nodeValue.length;
		}
		textId.firstChild.nodeValue = len;
			if(len)	document.getElementById(view_node_id).style.color = color_3;
			else document.getElementById(view_node_id).style.color = color_5;
	}
	
return true;
}

//Тут идёт учёт вводимых символов и отображение их на экран
//в качестве значения передаём имя формы, в которой будем работать
//ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: get_input
//
function put_num_chars(form){
	var my_array = get_input(form);
	var len;
	for(var i=0; i<my_array.length; i++){
		if((len = document.forms[form].elements[my_array[i]].value.length)!=0)
			count('n_' + my_array[i],my_array[i]);
	}
}

//Функция проходит по форме form, сканирует поля ввода
//Если хотя бы одно поле пустое (не содержит данных или содержит проблы и пр. не word-символы), то выдаёт false
//ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: get_input
//
function is_empty_input(form){
	var array = get_input(form);
	
		for (var i=0; i<array.length; i++)
		{
			var str = document.forms[form].elements[array[i]].value;
			var len = str.length;
			var err = null;
			var s = 0;
				if(len == 0){
					err = i;
					break;
				} else {
					for(var j=0; j<len; j++){
						if(str.charAt(j)!=" " && str.charAt(j)!="\n" && str.charAt(j)!="\t" && str.charAt(j)!="\r"){
							s = 1;
							break;
						}
					}
					
					if(!s){
					err = i;
					break;
					}
				}//end else
		}//end for
	
	if (err != null)
	{
		alert("Заполнены не все поля!");
		document.forms[form].elements[array[i]].focus();
		return false;
	}
	
	return true;
}
//===========================================================================================

//***** Функция устанавливает логическое значение bool для свойства disabled на элемент element формы form
//Используется в функциях: image_type
function set_disabled(form,element,bool){
	document.forms[form].elements[element].disabled = bool;
}
//*********************************************************************************************************

//Проверка допустимости пользовательского изображения.
//Функция принимает путь, указывающий на картинку на машине клиента
//а так же имя формы и имя элемента(кнопки), которой нужно сделать дисейбл, если файл будет с неправельным разрешением
//ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: set_disabled
//
function image_type(path, form, element){
	if(path==""){
	set_disabled("begin","submit",false);
	return;
	}
var type = path.substr(path.lastIndexOf(".")+1).toLowerCase();
	if(type!="gif" && type!="jpg" && type!="jpeg"){
		alert(type + " - недопустимый тип изображения!\nУкажите путь к *gif, *jpg или *jpeg изображению.");
	set_disabled("begin","submit",true);
	} else set_disabled("begin","submit",false);
}
//===========================================================================================


//***** Открытие окна с информацией о пользователе **********************************
function infoWindow(path){
	var t = (screen.availWidth - 600)/2;
	var l = (screen.availHeight - 350)/2;
		
	var win = window.open(path, '', 'width=600, height=350, ,toolbar=0,menubar=0,scrollbars=1,resizable=1,location=0,status=0,left=' + l + ',top=' + t + '');
	win.focus();
}
//************************************************************************************


//***** Функция вставляющая значение str в элемент element формы form ****************
//Используется в функциях: insert_tag, insert_url
function insert(form,element,str){
var a = document.forms[form].elements[element].value;
document.forms[form].elements[element].focus();
document.forms[form].elements[element].value = a + str;
document.forms[form].elements[element].focus();
}
//************************************************************************************

//***** Скрытие-открытие всплывающей подсказки *****
//
var mouseX = 0;
var mouseY = 0;
//Функция определяющая координаты мыши. Переменные mouseX, mouseY становятся глобальными.
function get_mouse_coords(){
		// Это ИЕ
		if (isMSIE || isOpera7) {
			// Если это событие onmousemove
    		document.onmousemove = function(){
    		// Определяем координаты мыши
    		mouseX = event.clientX + document.documentElement.scrollLeft;
    		mouseY = event.clientY + document.documentElement.scrollTop;
			}	
		} 
		else if (isOpera)
		{
	    	document.onmousemove = function() {
        		mouseX = event.clientX;
        		mouseY = event.clientY;
    		}
		// Если это Mozilla	
		} else if (isNetscape4 || isMozilla) {
			// Если это событие onmousemove
    		document.onmousemove = function(e){
				// Определяем координаты мыши
        		mouseX = e.pageX;
        		mouseY = e.pageY;
    		}
		} // конец если это Mozilla	 
}


//Функция показывающая всплывающий блок div, в котором отобразиться надпись str
//ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: get_mouse_coords
//
function show_Explanatory(div, str){
	//Определяем размер документа в пикселях
	var w = document.body.clientWidth;
	//делим этот размер пополам
	var w2 = Math.ceil(w/2);
var a = document.getElementById(div);
get_mouse_coords();
a.childNodes[0].nodeValue = str;
a.style.display = 'block';
a.style.zindex = 1;
	//Если координаты Х мыши больше, чем половина размера документа, 
	//то высплывающий блок выводится с правой направленностью, иначе, по умолчанию - с левой
	if(mouseX > w2)	mouseX =  mouseX - a.offsetWidth;
a.style.top = mouseY + 22 + 'px';
a.style.left = mouseX + -2 + 'px';
}
//скрыть DIV-блок
function hide_Explanatory(div){
document.getElementById(div).style.display = 'none';
}
//**************************************************


//***** Блок работы со спец. тегами *****
//Массив, отображающий закрытые и открытые теги
var tagMas  = [0, 0, 0, 0];
//Массивы тегов
var startTagMas = ["[I]", "[B]", "[U]", "[K]", "[Q]"];
var stopTagMas = ["[/I]", "[/B]", "[/U]", "[/K]", "[/Q]"];

//Функция вставляет тэег с индексом i в элемент element формы form,
//а так же, указывает человекопонятным текстом, зыкрыт или открыт тег, используя цветовую окраску.
//Текст вставлятся с помощью DOM в элемент SPAN с id = i + N, где N - индекс тега.
//ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: insert insert(form,element,str)
//
function insert_tag(i, form, element){
var flag = null;
	
		if(!tagMas[i]){
		tagMas[i] = flag = 1;
		insert(form, element, startTagMas[i]);
		}
		else{
		tagMas[i] = flag = 0;
		insert(form, element, stopTagMas[i]);
		}
		
	var str = (flag ? "Закрыть тег" : "Открыть тег");
	var id = document.getElementById("i" + i);
	id.style.color = flag ? color_3 : color_5;
	id.style.fontWeight = flag ? "bold" : "normal";
	id.replaceChild(document.createTextNode(str), id.childNodes[0]);
}

//Функция, проверяющая, существует ли открытый тег, открытый програмно с помощью функции insert_tag.
//Если тег не закрыт, возвращает FALSE. Используется при SUBMIT-e формы.
function is_open_tag(element){
var str = '';
	for(var i=0; i<tagMas.length; i++){
		if(tagMas[i])
		str += "Не закрыт тег " + stopTagMas[i] + "!\n";
	}
	if(str){
	alert(str);
	document.getElementById(element).focus();
	return false;
	}
return true;
}
//*******************************************************

//Функция ставит checked на элемент elname под индексом idx формы formid
//Используется при событии onclick, когда нажимают элемент(часто-текст) перед радиокнопкой (+) или чекбоксом
//Если элемент, от имени которого используется функция, является checkbox, 
//то повторный клик снимает с него checked-выделение, а если radio - то выделение не снимается.
function check(formid,elname,idx){
var lnk = document.getElementById(formid).elements[elname][idx];
	if(lnk.type=="radio"){
		lnk.checked=true;
	} else if(lnk.type="checkbox"){
		if(lnk.checked==true)
			lnk.checked=false;
		else 	lnk.checked=true;
	}
return true;
}



//Функция получает выделение со страницы.
function get_selection(){
var selection='';
	if (document.getSelection)
		return selection = document.getSelection();
	else if (document.selection && document.selection.createRange)
		if(document.selection.type=="Text")
			return selection = document.selection.createRange().text;
return false;
}

//Вставка в качестве цитаты пользовательского выделения на странице
//Функция принимает ID формы и имя элемена формы, в который нужно вставить выделенное значение
function select_quote(user_id){
var selec = get_selection();
	if(!selec)
		alert("Для вставки цитаты необходимо выделить нужное мышью");
	else {
	var lnk = document.getElementById('gb').elements['user_message'];
	var oldval = lnk.value;
	lnk.value = oldval + "[Q][user " + user_id + "] пишет: " + selec + "[/Q] ";
	alert("Выделение прошло успешно");
	lnk.focus();
	}
}

//ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: insert 
function insert_url(form,element){
	var url = prompt('Введите URL-адрес','http://');
	if(url==null){
	alert("Необходимо ввести URL-адрес");
	return false;
	}
	var anhor = prompt('Введите якорь (название ссылки)','');
	if(!anhor) anhor = url;
	insert(form,element,"[URL=" + url + "]" + anhor + "[/URL]");
}

/**
* Функция возвращает читабельную строку - 
* размер числа i в байтах, Кбайтах или Мбайтах
* Используется в функциях: ereg_uniqImg
* @param int число, размер изображения в байтах
* @return string числа i в байтах, Кбайтах или Мбайтах
*/
function get_size_string(i)
{
	if (i<1024) {
		return i + " байт";
	} else if (i>=1024 && i<=1024*1024)	{
		return Math.round(i/1024) + " Кбайт";
	} else if (i>=1024*1024) {
		return (i/1024/1024).toFixed(2) + " Мбайт";
	}
}
/**
* Функция вызывается после полной загрузки страницы.
* Функция проходит по массиву изображений документа, 
* выделяет изображения с id=uniqImg_([a-z0-9])+,
* изображения, что были вставлены в документ пользователем,
* а после этого уменьшает их ширину, если она больше size-числа пикселов.
* Высоту изображения любой нормальный броузер вычисляет сам, исходя из ширины.
* ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: get_size_string
* @param int максимально-допустимый размер изображения по ширине
* @return void
*/
function ereg_uniqImg(size)
{
	var re = new RegExp("uniqImg_([a-z0-9])+","i");
	
	for (i=0; i<document.images.length; i++)
	{
		var curId = document.images[i].id;
		//Это изображение подходит - оно вставлено пользователем
		if (curId.match(re)) {
			var l = document.getElementById(curId);
			l.alt = l.alt + " (" + get_size_string(l.fileSize) + ")";
				if (l.width>size) {
					l.width = l.width-(l.width-size);
				}
		}
	}
}

function createPlayerObject(url)
{
    var swf = "/server/player/musicplayer_f6.swf?song_url=" + url + "&b_bgcolor=FFFFFF&";
    var obj;

    try {
       obj = document.createElement('<object type="application/x-shockwave-flash" data="' + swf + '" width="17" height="17">');
       var p = document.createElement('param');
       p.name = 'movie';
       p.value = swf;
       obj.appendChild(p);
    } catch (e) {
       obj = document.createElement('object');
       obj.type = 'application/x-shockwave-flash';
       obj.data = swf;
    }
    obj.width = 17;
    obj.height = 17;
    // obj.setAttribute('style', 'margin:0 10px 0 2px');
    
    return obj;
}

/**
* Возвращает nextSibling типа тег узла node. 
* 
* @param object
* @return object
*/
function getNextSiblingTag(node)
{
    node = node.nextSibling;
    
    while (node && node.nodeType != 1)
    {
        node = node.nextSibling;
    }

    return node;
}

/**
* Возвращает firstChild типа тег узла node. 
* 
* @param object
* @return object
*/
function getFirstChildTag(node)
{
    var node = node.firstChild;

    while (node && node.nodeType != 1)
    {
        node = node.nextSibling;
    }

    return node;
}

function addPlayerInSongList()
{
    var ols = document.getElementsByTagName('ol');
    for (var i=0; i<ols.length; i++)
    {
        var li = getFirstChildTag(ols[i]);
        do
        {
            var a = getFirstChildTag(li);
            if (!a || a.tagName != 'A' || !a.href) continue;
            li.insertBefore(createPlayerObject(a.href), a);
            var text = document.createTextNode(' ');
            li.insertBefore(text, a);
            
        }
        while(li = getNextSiblingTag(li));

    }
}