function El(id){
return document.getElementById(id);
}
function GetPosts(){
var posts = new Array();
posts = document.getElementsByClassName('post');
return posts;
}
function GetMsgs(){
var msgs = new Array();
msgs = document.getElementsByClassName('msg');
return msgs;
}

function UserStat(stat){
	document.write("<input type='text' value='"+stat+"' />");
}

// Ввод параметров
function ask(act, msg){
	var ans = prompt(msg,'');
	if(ans == '' || ans == null || ans == undefined) return '';
	else return (' '+act+'="'+ans+'"');
}
function ask2(msg){
	var ans = prompt(msg,'');
	if(ans == '' || ans == null || ans == undefined) return '';
	else return ans;
}

//Бинарные функции для работы с группами
function Bin2Dec(binnum)
{
	numlen=binnum.length;
	answer=0;
	place=numlen-1;
	for(x=0; x < numlen; x++)
	{
		if(binnum.substr(x, 1) == 1)
		{
			answer = answer + Math.pow(2, place)
		}
		else if(binnum.substr(x, 1) != 0) 
		{
			return 0;
		}
		place--;
	}
	return answer;
}

function Dec2Bin(dec) 
{
	if (dec == "")
	{
		return 0;
	}
	else 
	{
		return bnr(dec);
	}
}

function bnr(decm)
{
	var dec=new Number(); dec=decm; i=dec;
	var hit="";
	while(i >= 1)
	{
		var m=(i*10)/4;
		while(m > 1){m=m-5;};
		if(m < 0){i=(i-1)/2;hit+="1";}else{i=i/2;hit+="0";};
	}
	var b ="";
	var bin;
	bin=hit.length;
	for(a=hit.length;a>=0;a--)
	{
		b += hit.substring(a-1,a);
	}
	return b;
}

function RecountStats(id)
{
	var a = "";
	var i;
	for (i=0; i<16; i++)
	{
		if (((i > 4) && (i < 13)) || (i == 0)) {a = a.concat("0"); continue;}
		a = a.concat(document.getElementById('sc_'+id+i).checked ? "1" : "0");
	}
	var de = Bin2Dec(a);
	document.getElementById('si_'+id).value = de;
	return 0;
}
/***************************************/

// Вставка в текстформу
/***************************************/
function Paste(dest,before,after)
{
	var el = document.getElementById(dest);
	el.focus();
	if (el.selectionStart == null){
		el.value = el.value + before + after;
	} else {
		el.value = el.value.substring(0,el.selectionStart) +
		before +
		el.value.substring(el.selectionStart,el.selectionEnd) +
		after +
		el.value.substring(el.selectionEnd);
	}
}
// Кнопка текстформы
function Button(title,action){
	document.write("<input type=\"button\" value=\""+title+"\" onclick=\""+action+"\">");
}
// Ввод картинки
function InsertImg(tx){
	var tag = ask('src','Ссылка на изображение:\n\nhttp://');
	if(tag){
		tag = "<img" + tag + ask('alt','Описание (не обязательно):') + " />";
		Paste(tx,tag,"");
	}
}
// Ввод флешки
function InsertEmbed(tx){
	var tag = ask('src','Ссылка на флешку:\n\nhttp://');
	if(tag){
		tag = "<embed type='application/x-shockwave-flash' " + tag +
		ask('width','Ширина (не обязательно):') + 
		ask('height','Высота (не обязательно):') + " />";
		Paste(tx,tag,"");
	}
}
// Ввод мп3
function InsertMp3(tx){
	var tag = ask2('Ссылка на мп3-файл\n\nhttp://***/file.mp3');
	if(tag){
		tag = "[mp3]" + tag + "[/mp3]";
		Paste(tx,tag,"");		
	}
}
// Ввод ссылки
function InsertA(tx){
	var tag = ask('href','Ссылка:\n\nhttp://');
	if(tag){
		var txt = ask2('Текст:');
		if(!txt) txt=tag;
		tag = "<a" + tag + " target=_blank>" + txt;
		Paste(tx,tag,"</a>");
	}
}
// Ввод шрифта
function InsertFont(tx){
	var tag = ask('color','Цвет (не обязательно):');
	tag += ask('size','Размер (не обязательно):');
	if(tag){
		tag = "<font" + tag + ">";
		Paste(tx,tag,"</font>");
	}zf
}
// Ввод фона
function InsertBg(tx){
	var tag = ask('bgcolor','Цвет фона (не обязательно):');
	tag += ask('background','Ссылка на картинку (не обязательно):');
	if(tag){
		tag = "<table><tr><td" + tag + ">";
		Paste(tx,tag,"</td></tr></table>");
	}

}
// Ввод движения
function InsertMove(tx){
	var tag = ask('behavior','Тип движения (не обязятельно):\n\nalternate - в обе стороны\nscroll - в одну сторону\nslide - до остановки');
	tag += ask('direction','Направление (не обязательно):\n\nleft | right | up | down');
	tag += ask('scrollamount','Скорость (не обязательно):\n\nРекомендуется: 10 - 100');
	tag += ask('bgcolor','Цвет фона (не обязательно):');
	tag = "<marquee" + tag + ">";
	Paste(tx,tag,"</marquee>");
}
// набор кнопок
function ButtonSet(tx){
	Button("Жърне",			"Paste('"+tx+"','<b>','</b>');");
	Button("Курсив",		"Paste('"+tx+"','<i>','</i>');");
	Button("Подчеркнуте",	"Paste('"+tx+"','<u>','</u>');");
	Button("Зачеркнуте",	"Paste('"+tx+"','<s>','</s>');");
	Button("БКБ",			"Paste('"+tx+"','<bkb>','</bkb>');");
	Button("Телетайп",		"Paste('"+tx+"','<tt>','</tt>');");
	Button("Эпилепсия",		"Paste('"+tx+"','<span class=\'effekt\'>','</span>');");
	Button("Мигалка",		"Paste('"+tx+"','<span class=\'blink\'>','</span>');");
document.write("&nbsp;");
	Button("Коде",			"Paste('"+tx+"','<code>','</code>');");
	Button("Цитате",		"Paste('"+tx+"','<quote>','</quote>');");
document.write("&nbsp;");
	Button("Центре",		"Paste('"+tx+"','<center>','</center>');");
	Button("Сверху",		"Paste('"+tx+"','<sup>','</sup>');");
	Button("Снизу",			"Paste('"+tx+"','<sub>','</sub>');");
	Button("Ссылка",		"InsertA('"+tx+"')");
	Button("Картинка",		"InsertImg('"+tx+"')");
	Button("Флеш",			"InsertEmbed('"+tx+"')");
	Button("mp3",			"InsertMp3('"+tx+"')");
document.write("&nbsp;");
	Button("Шрифт",			"InsertFont('"+tx+"')");
	Button("Фон",			"InsertBg('"+tx+"')");
	Button("Движение",		"InsertMove('"+tx+"')");
document.write("&nbsp;");
	Button("Линия",			"Paste('"+tx+"','<hr>','');");
document.write("<br />");
}

//-------------------JX(modif)----------------------
jx = {
	getHTTPObject : function() {
		var http = false;
		if(typeof ActiveXObject != 'undefined') {
			try {http = new ActiveXObject("Msxml2.XMLHTTP");}
			catch (e) {
				try {http = new ActiveXObject("Microsoft.XMLHTTP");}
				catch (E) {http = false;}
			}
		} else if (window.XMLHttpRequest) {
			try {http = new XMLHttpRequest();}
			catch (e) {http = false;}
		}
		return http;
	},
	load : function (url,callback,param,mode) 
	{
		var http = this.init();
		if(!http||!url) return;
		if (http.overrideMimeType) http.overrideMimeType('text/html');

		if(!format) var format = "text";
		format = format.toLowerCase();

		var now = "randm=" + new Date().getTime();
		url += (url.indexOf("?")+1) ? "&" : "?";
		url += now;

		http.open("GET", url, (mode != 5));

		http.onreadystatechange = function () 
		{
			if (http.readyState == 4)
			{
					var result = "";
					if(http.responseText) result = http.responseText;
					if(callback)
					{
						switch(mode)
						{
							case 1: callback(result); break;
							case 2: callback(result,param);break;
							case 3: callback(result,param,http.status);break;
							default: callback(result,param);break;
						}
					}
			}
		}
		http.send(null);	
	},
	post: function(url,callback,param,mode,data)
	{
		var http = this.init();
		http.open("POST",url,true);
		//Send the proper header information along with the request
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", data.length);
		http.setRequestHeader("Connection", "close");

		http.onreadystatechange = function() 
		{
			if(http.readyState == 4) 
			{
				var result = "";
				if(http.responseText) result = http.responseText;
				if(callback)
				{
					switch(mode)
					{
						case 1: callback(result); break;
						case 2: callback(result,param);break;
						case 3: callback(result,param,http.status);break;
						default: callback(result,param,http.status);break;
					}
				}
			}
		}
		http.send(data);
		return true;
	},
	init : function() {return this.getHTTPObject();}
}
//-------------------/JX---------------------------

function isuint(sText)
{
   var ValidChars = "0123456789";
   var IsNumber=true;
   var Char;
 
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
}

function ValidatePM(obj)
{
	var un = (obj.pm_uname.value.replace('\\','')).replace('/','');//filtering
	if (un == '') return false;

	obj.pm_s.style.display = 'none';
	obj.pm_load.style.display = 'block';
	
	jx.load('user/'+un+'/check',function(data,param){
		var d = data;
		if(isuint(data))
		{param.pm_uid.value = d; param.submit();}
		else
		{param.pm_uname.value="Такого юзера нет!";	param.pm_s.style.display = 'block';param.pm_load.style.display = 'none';}
		return true;
	},obj,2);
	return false;
}
//-----------------messages------------------------
function setElementOpacity(sElemId, nOpacity)
{
  var opacityProp = getOpacityProperty();
  var elem = document.getElementById(sElemId);

  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;
}

function getOpacityProperty()
{
  if (typeof document.body.style.opacity == 'string') // CSS3 compliant (Moz 1.7+, Safari 1.2+, Opera 9)
    return 'opacity';
  else if (typeof document.body.style.MozOpacity == 'string') // Mozilla 1.6 и младше, Firefox 0.8 
    return 'MozOpacity';
  else if (typeof document.body.style.KhtmlOpacity == 'string') // Konqueror 3.1, Safari 1.1
    return 'KhtmlOpacity';
  else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) // Internet Exploder 5.5+
    return 'filter';

  return false; //нет прозрачности
}

function ShowInfo(text,type)
{
	var i = 0;
	var newid;
	var obj;
	
	while(El("shinfo"+i)){i++;} //find the last one
	newid = "shinfo"+i; //non-existing
	
	obj = document.createElement('div');
	obj.setAttribute('class', (type?'shinfo sherror':'shinfo'));
	obj.setAttribute('id', newid);
	obj.style.display = 'none';
	obj.style.position = "fixed";
	obj.innerHTML = text;
	document.body.appendChild(obj);
	obj.style.display = 'block';
	var t=0; //infoblock height
	for(var x=0;x<i;x++)
	{
		t += El("shinfo"+i).offsetHeight*1;
	}
	obj.style.top = t+"px";
	setElementOpacity(newid, 0); // hide
	InfoOpacity(newid,1); //on
	return true;
}

function InfoOpacity(id,mode)
{
	var op = El(id).style[getOpacityProperty()]*1;
	var speed = 0.1; //10 frames
	speed = (mode?speed:-speed); //fade in/out
	var step = 100; //100ms
	var delay = 2000; //2000ms //pause
	if (op+speed>1)
	{
		op = 1;
		setElementOpacity(id,op);
		setTimeout('InfoOpacity("'+id+'",0)',delay);
		return false;
	}
	else if(op+speed < 0)
	{
		op = 0;
		setElementOpacity(id,op);
		DeleteElem(id);
		return true;
	}
	else
	{
		op = op + speed;
		setElementOpacity(id,op);
		setTimeout('InfoOpacity("'+id+'",'+mode+');',step);
		return true;
	}
	return true;
}

function ToHtml(type,msg,code,http)
{
	switch(type)
	{
		case 'wait':
			return "<div class='wait'>\n"+
			"<h1>Подождите</h1>\n"+
			"<p>"+msg+"</p>\n"+
			"</div>\n";
		break;
		case 'error':
			return "<div class='error'>\n"+
			"<img src='/img/error/error.png' alt='"+code+"' />\n"+
			"<h1>"+code+" "+http+"</h1>\n"+
			"<p>"+msg+"</p>\n"+
			"</div>\n";
		break;
		default:
		case 'msg':
			return "<div class='alert'>\n"+
			"<img src='/img/error/warning.png' alt='Сообщение' />\n"+
			"<p>"+msg+"</p>\n"+
			"</div>\n";
		break;
	}
}
function BigMsg(text) //to remove call BigMsg("")
{
	var shadow, wind, fr = false;
	shadow = El('shadow');
	wind = El('shbox');
	if (!shadow)
	{
		fr = true;
		shadow = document.createElement('span');
		shadow.setAttribute('class', 'shadow');
		shadow.setAttribute('id', 'shadow');
	}
	if (!wind)
	{
		fr = true;
		wind = document.createElement('div');
		wind.setAttribute('class', 'shbox');
		wind.setAttribute('id', 'shbox');
	}
	
	if (!text)
	{
		wind.style.display='none';
		shadow.style.display='none';
		DeleteElem('shadow'); DeleteElem('shbox');
		return false;
	}
	wind.innerHTML = text;
	if (fr) //не повторный запуск
	{
		document.body.appendChild(shadow);//темно
		document.body.appendChild(wind);//окошко
	}
	return true;
}
//-------------------elements----------------------------------
function DeleteElem(id)
{
	var obj = El(id);
	if (obj) obj.parentNode.removeChild(obj);
	return true;
}

function ToggleElem(id)
{
	var obj = El(id);
	var s = (obj.style.display=="none");
	obj.style.display = (s)?"block":"none";
	return s;
}

function NewElem(tag,id,_class,inner)
{
	return true;
}
//--------------------menu control-------------------------
/*
function MoveMenu(posx)
{
	var obj = El("menu");
	obj.style.position = "fixed";
	var menupos = obj.style.top.substring(0,obj.style.top.length-2)*1; //px
	if (posx == menupos) return true;
	var speed;
	if(posx>menupos)
	speed = 22;
	else speed = -22;
	if (posx - menupos < speed)
	{
		obj.style.top = posx + "px";
		return true;
	}
	obj.style.top = (menupos + speed) + "px";
	setTimeout("MoveMenu("+posx+");",30);
	return false;
}*/

//------------------hash--------------------------------------
function GetHashSync()
{
	var h = El("hash");//store
	if (!h)
	{
		h = document.createElement('input');
		h.setAttribute('id', 'hash');
		h.setAttribute('type','hidden');
		document.body.appendChild(h);//хэш
	}
	h = El('hash');
	h.value='';
	jx.load('hash.[upyachka]',function(data,param){param.value=data;},h,5);
	return El('hash').value;
}

//----------------Submitters-----------------------------
function SubmitForm(form)
{
	var m=0;
	switch(form.method.toLowerCase())
	{
		case 'post': m=0; break;
		case 'get': m=1; break;
		default: return true; break;
	}
	var e = 0;
	var data = "";
	var val = "";
	for(var i=0;i<form.elements.length;i++)
	{
		e = form.elements[i];
		if(e.name)
		{
			var tag = e.tagName.toLowerCase();
			switch(tag)
			{
			case "input":
				switch(e.type.toLowerCase())
				{
				case "checkbox":
					if(e.checked) val=1;
					else val=0;
					break;
				default:
					val = e.value;
				}
			break;
			case "textarea":
			case "select":
			default:
				val = e.value;
			}
				if (data == "") data = e.name+"="+encodeURIComponent(val);
				else data = data+"&"+e.name+"="+encodeURIComponent(val);
		}
	}
	BigMsg(ToHtml('msg',"Подача запроса...",0,0));
	var call = function(data,param)
	{
		var obj;
		try
		{obj = eval('('+data+')');}
		catch(a)
		{alert('Ошибка в ответе; передайте админам:\n\n'+data);obj=eval("({type: 'error', msg: 'Ошибка в ответе сервера', code: 500, http: 'Internal Server Error'})");}
		BigMsg(ToHtml(obj.type,obj.msg,obj.code,obj.http));
		if((obj.type.indexOf("error") != -1) && (!obj.redirect)) //err
		{setTimeout("BigMsg('');",2000);}
		else
		{setTimeout("document.location."+(obj.redirect?"href='"+obj.redirect+"'":"reload(true)")+";",2000);}
	}
	try { var h = GetHashSync(); } catch(a){ call("{type: 'error', msg: 'Ошибка получения хеша.', code: 500, http: 'Internal Server Error'}",0); return false; }
	//alert(h);
	switch(m)
	{
		case 0: jx.post(form.action+".["+h+"]",call,0,2,data); break;
		case 1: jx.load(form.action+".["+h+"]"+"?"+data,call,0,2); break;
		default: alert('SubmitForm FFUUUUUU'); return true; //wtf? No wai.
	}
	return false;
}

function RqstLink(obj)
{
	var href = obj.href+".["+GetHashSync()+"]";
	jx.load(href,function(data,param){
		var o;
			try {o= eval('('+data+')');} catch(a) {alert('Ошибка в отаете сервера. Передайте админам:\n\n'+data);ShowInfo("Ошибка в ответе сервера.",1); return false;}
		if(o.type.indexOf('error') != -1)
		{ShowInfo(o.msg,1);}//err
		else
		{
			ShowInfo(o.msg,0);
			var as = obj.href.lastIndexOf("/")+1;
			switch(o.action)
			{
				case 'del': //hide post
					ToggleElem(param.parentNode.parentNode.id);
				break;
				case 'vote':
					El('bljsloe'+o.postid).innerHTML=o.mark;
				break;
				default:
				//	ShowInfo(o.action,1);
			}
			if(o.redirect) setTimeout("document.location.href='"+o.redirect+"';",2000);
		}
	},obj,2);
	return false;
}