// ###############################
// #### 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 !!(new RegExp("\\b" + c + "\\b").exec(el(elm).className))}
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 fixNospam()
{
	forElementsInClass('nospam', function(elm){
		var a = elm.innerHTML.split(" ");
		var mail = a[0] + '@' + a[1] + '.' + a[2];
		elm.innerHTML = '<a href="mailto:' + mail + '">' + mail + '</a>';
	});	
}

function fixHovers()
{
	forElementsInClass('hover', function(elm){
		elm.onmouseover = function(){this.className = 'active';};
		elm.onmouseout = function(){this.className = ''};
	});
}

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);
}

// #########################
// #### form validation ####
// #########################

function validate_field(field, value)
{
	if (value.match(/^\s*$/))
	{
		if (field['required'])
		{
			return 'не заполнено необходимое поле';
		}
		return '';
	}
	if (field['maxlength'] && value.length > field['maxlength'])
	{
		return 'не длиннее ' + field['maxlength'] + ' символов';
	}
	if (field['minlength'] && value.length < field['minlength'])
	{
		return 'не короче ' + field['minlength'] + ' символов';
	}
	if (field['regex'])
	{
		var regex = new RegExp("^(" + field['regex'] + ")$");
		if (!regex.exec(value))
		{
			return 'некорректный формат';
		}
	}
	return '';
}

function validate_form(form, fields, formname)
{
	var errors = {};
	for (var name in fields)
	{
		var field = fields[name];
		if (field['type'] == 'password_new')
		{
			var val1 = form[name + '[0]'].value;
			var res = validate_field(field, val1);
			if (res != '')
			{
				errors[name] = res;
				continue;
			}
			var val2 = form[name + '[1]'].value;
			if (val1 != val2)
			{
				errors[name] = 'пароли не совпадают';
				continue;
			}
		}
		else
		{
			var value = form[name].value;
			var res = validate_field(field, value);
			if (res != '')
			{
				errors[name] = res;
				continue;
			}
		}
	}
	
	var haserrors = false;
	for (var name in fields)
	{
		var elm = document.getElementById(formname + '_' + name + '_error');
		if (errors[name])
		{
			elm.innerHTML = errors[name];
			elm.style.display = 'block';
			haserrors = true;
		}
		else
		{
			elm.innerHTML = '';
			elm.style.display = 'none';
		}
	}
	return !haserrors;
}

function popup(URL, width, height)
{
	win = window.open("",new Date().getTime(),"top=200,left=200,scrollbars=0,dialog=yes,minimizable=0,modal=yes,width="+(width-6)+",height="+(height-6)+",resizable=0");
	win.document.write('<html style="margin: 0px; padding: 0; border: 0;"><body style="margin: 0px; padding: 0; border: 0;">');
	win.document.write('<img style="margin:0; padding: 0" src="'+URL+'" width="'+width+'" height="'+height+'" />');
	win.document.write('</body></html>');
	win.document.close();
	win.focus();
}

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;
}

