// ###############################
// #### useful DOM one-liners ####
// ###############################

function el(elm) {return typeof elm == 'string' ? document.getElementById(elm) : elm}
function show(elm) {if (el(elm)) el(elm).style.display = 'block'}
function showInline(elm) {if (el(elm)) el(elm).style.display = 'inline'}
function hide(elm) {if (el(elm)) el(elm).style.display = 'none'}
function toggle(elm) {if (el(elm)) el(elm).style.display = el(elm).style.display == 'block' ? 'none' : 'block'}

function setClass(elm, name)   {if (el(elm)) el(elm).className = name}
function hasClass(elm, c) {return el(elm).className.match("\\b" + c + "\\b")}
function addClass(elm, c) {if (!hasClass(elm, c)) el(elm).className += " " + c;}
function removeClass(elm, c) {el(elm).className = el(elm).className.replace(new RegExp("\\s*\\b" + c + "\\b"), "");}

function setContent(elm, text) {if (el(elm)) el(elm).innerHTML = text}
function addContent(elm, text) {if (el(elm)) el(elm).innerHTML += text}

function nl2br(text) {return text.replace(/\n/g, "<br />");}


function addHandler(target, eventName, handler)
{
	if (target.attachEvent)
	{
		target.attachEvent('on'+eventName, handler);
	}
	else
	{
		target.addEventListener(eventName, handler, false);
	}
}


function addLoadEvent(func)
{
	addHandler(window, 'load', func);
}

function forElementsInClass(classname, func)
{
	var elms = document.getElementsByTagName('*');
	for (var i = 0; i < elms.length; i++)
	{
		var elm = elms[i];
		if (!hasClass(elm, classname)) continue;
		func(elm);
	}
}

function fixHovers()
{
	forElementsInClass('hover', function(elm){
		elm.onmouseover = function(){this.className = 'active';};
		elm.onmouseout = function(){this.className = ''};
	});
}

function addReportLinks()
{
	forElementsInClass('reportlink', function(elm)
	{
		var area = elm.href.indexOf('forum') != -1 ? 'forum' : 'site';
		elm.onclick = function()
		{
			var url = elm.href;
			var msg = prompt('Отправка сообщения об ошибке или нарушении\nКомментарий (не обязателен)', '');
			if (msg == null) return false;
			load_data(area == 'forum' ? '../report.php' : 'report.php', function(data)
			{
				if (data == 'OK')
				{
					// todo: display acknowledgement
				}
			}, false, {'url' : url, 'comment' : msg});
			return false;
		};
		if (!elm.innerHTML)
		{
			elm.innerHTML = area == 'site' ? '&nbsp;[!] &laquo;' : '[!]&nbsp;';
		}
		elm.style.display = 'inline';
		elm.title = 'сообщить администрации';
	});
}

function clear_selection()
{
	if (document.selection && document.selection.empty)
	{
		document.selection.empty();
	}
	else
	{
		var sel = window.getSelection();
		sel.removeAllRanges();
	}
}


// ########################
// #### ajax functions ####
// ########################

var _data_handlers = {};
var _data_urls = {};
var _data_count = 0;
var _data_sid = Math.round(Math.random() * 9000) + 1000;
var _data_timeout = 15000;

function exec_script(href, id, postvars)
{
	var req;
	var postdata = '';
	if (postvars)
	{
		for (var i in postvars)
		{
			postdata += encodeURIComponent(i);
			postdata += '=';
			postdata += encodeURIComponent(postvars[i]);
			postdata += '&';
		}
	}
	postdata += 'js_id=' + id;
	if (typeof session_id != 'undefined')
	{
		postdata += '&s=' + encodeURIComponent(session_id);
	}
	if (window.XMLHttpRequest)
	{
		req = new XMLHttpRequest();
		req.onreadystatechange = function(){_processonchange(id)};
		req.open("post", href, true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send(postdata);
	}
	else if (window.ActiveXObject && (req = new ActiveXObject("Microsoft.XMLHTTP")))
	{
		req.onreadystatechange = function(){_processonchange(id)};
		req.open("post", href, true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send(postdata);
	}
	else
	{
		href += (href.indexOf('?') == -1 ? '?' : '&') + postdata;
		var span = null;
		span = document.body.appendChild(document.createElement('SPAN'));
		span.style.display = 'none';
		span.innerHTML = '.<s'+'cript></' + 'script>';
		setTimeout(function() {
			var s = span.getElementsByTagName("script")[0];
			s.language = "JavaScript";
			if (s.setAttribute) s.setAttribute('src', href); else s.src = href;
		}, 10);
	}

	setTimeout(function() {
		if (!_data_handlers[id])
		{
			return;
		}
		var req = _data_handlers[id].req;
		var foo = _data_handlers[id].handler;
		_release_id(id);
		req.abort();
		foo();
	}, _data_timeout);

	return req;
}

function _processonchange(id)
{
	if (!_data_handlers[id])
	{
		return;
	}
	var req = _data_handlers[id].req;
	var foo = _data_handlers[id].handler;
	if (req.readyState == 4)
	{
		if (req.status == 200 && req.responseText.substring(0, 13) == '_return_data(')
		{
			eval(req.responseText);
		}
		else
		{
			_release_id(id);
			foo();
		}
	}
}

function load_data(href, handler, allow_dupe, postvars)
{
	if (!allow_dupe && _data_urls[href])
	{
		return false;
	}
	var id = _data_sid + _data_count++;
	_data_urls[href] = id;

	var req = exec_script(href, id, postvars);
	_data_handlers[id] =
	{
		handler: handler,
		url: href,
		req: req
	};
	return true;
}

function _release_id(id)
{
	delete _data_urls[_data_handlers[id].url];
	delete _data_handlers[id];
}

function _return_data(id, data)
{
	if (!_data_handlers[id])
	{
		return;
	}
	var foo = _data_handlers[id].handler;
	if (foo)
	{
		_release_id(id);
		foo(data);
	}
}

// #################
// #### cookies ####
// #################

function setcookie(name, value, days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		var expires = "; expires=" + date.toGMTString();
	}
	else var expires = "";
	document.cookie = name + "=" + value + expires + "; path=/";
}

function getcookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i = 0; i < ca.length; i++)
	{
		var c = ca[i];
		while (c.charAt(0) == ' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
	}
	return null;
}

function unsetcookie(name)
{
	setcookie(name, "", -1);
}

function set_select_options(sel, options)
{
	var cur = sel.options[sel.selectedIndex].value;
	var new_index = 0;
	var i = 1;
	sel.options.length = 1;
	for (var k in options)
	{
		sel.options.length++;
		sel.options[i].value = k;
		sel.options[i].text = options[k];
		if (k == cur)
		{
			new_index = i;
		}
		i++;
	}
	sel.selectedIndex = new_index;
}

function insertText(name, text, resetsel)
{
	var elm = document.getElementById(name);
	elm.focus();
	if (document.selection)
	{
		document.selection.createRange().text = text;
		return;
	}
	var newText = elm.value.substring(0, elm.selectionStart);
	newText += text;
	newText += elm.value.substring(elm.selectionEnd);
	var oldPos = elm.scrollTop;
	var oldStart = elm.selectionStart;
	elm.value = newText;
	elm.scrollTop = oldPos;
	elm.selectionStart = oldStart;
	elm.selectionEnd = oldStart + text.length;
	if (resetsel)
	{
		elm.selectionStart = elm.selectionEnd;
	}
}

function getSelectedText(name)
{
	var elm = document.getElementById(name);
	if (document.selection)
	{
		return document.selection.createRange().text;
	}
	return elm.value.substring(elm.selectionStart, elm.selectionEnd);
}


