// Проверка форм @param1 Object — ссылка на элемент FORM;
function checkForm(obj)
{
	var element,pattern;
	for (var i = 0; i < obj.elements.length; i++) // пробегаемся по всем элементам формы
	{
		
		element = obj.elements[i];
		if (document.getElementById("company"))
		{
			// Если элемен не виден, не проверяем 
			if (document.getElementById("company").style.display == "none")
			{
				pattern = new RegExp("^company\.+$", "g");
				if (pattern.test(element.name)) continue;
			}
		}
		if (document.getElementById("card"))
		{
			if (document.getElementById("card").style.display == "none")
			{
				pattern = new RegExp("^card\.+$", "g");
				if (pattern.test(element.name)) continue; 
			}	
		}
		// И только если есть чего говорить юзеру в случае ошибки
		if (!element.getAttribute("alt")) continue;
		if (pattern = element.getAttribute("check_pattern")) { // если задан рег
			pattern = new RegExp(pattern, "g");
			if (!pattern.test(element.value)) {
			alert(element.getAttribute("alt"));
			element.focus();
			return false;
		}
		} else if(/^\s*$/.test(element.value)) { // иначе просто проверка что поле не пустое
			alert(element.getAttribute("alt"));
			element.focus();
			return false;
		} 
	}
	return true;
}

function CheckForm(url)
{
	var form = document.getElementById('form');

	// сначала только проверяем ошибки
	JsHttpRequest.query
	(
		url,
		{
			'form' : form,
			'check_errors' : true
		},
		function(result, errors)
		{
			document.getElementById('AjaxErrors').innerHTML = errors;
				
			var form = document.getElementById('form');
			if (result.errors.length > 0)
			{
				for (var i=0;i<result.errors.length;i++) result.errors[i] = result.errors[i].replace(/<\/?[^>]+>/gi, '');
				window.alert('Ошибки:\n'+result.errors.join('\n'));
				for (var i=0;i<result.fields.length;i++) {MarkField(field); if (!i) SelectField(field);}
			}
			else form.submit();
		},
		true
	)
	
	return false;
}

function FalseEnterSubmit(e)
{
	var e = e || window.event; // событие
	var key = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0))
	var target = e.target || e.srcElement
	if (target.onkeypress) return null; // у поля уже есть свой обработчик
	else if (key == 13 && target.tagName.toLowerCase() != 'textarea') return false;
	else return true;
}

// поиск города в разделе Section и вставка в поле с id ElementId (библиотека citysearch)
function CityOldSearch(ElementId, Section)
{
	NewWindow("/lib/citysearch_old/?elementid="+ElementId+"&section="+Section, 480, 500);
	return false;
}

// установка переменной what значения value для текущей страницы
function SetPageOptions(keys, values, url)
{
	JsHttpRequest.query
	(
		'/lib/ajax/setpageoptions/',
		{
			'keys': keys,
			'values': values,
			'url' : (url) ? url : ''
		},
		function(result, errors)
		{
			document.getElementById('AjaxErrors').innerHTML = errors;
			if (result.url) window.location = result.url;
		},
		true
	)
}

// отрезание страниц у ссылки и перезагрузка
function CutPages()
{
	var loc = window.location.href;
	return loc.replace(/pages\/\d+\//, '');
}

// открытие нового окна
function NewWindow(url, w, h, scrollbars)
{
	if (typeof scrollbars == "undefined") scrollbars = 0; 
	var myname = 'name' + Math.floor(1000000*Math.random());
	if (h >= screen.height || w >= screen.width) scrollbars = 1;
	LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
	TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
	settings = 'location=0, height=' + h + ', width=' + w + ', top=' + TopPosition + 
	',left=' + LeftPosition + ', resizable=0, scrollbars=' + scrollbars;
	win = window.open(encodeURI(url), myname, settings);
	if (win.window.focus) {win.window.focus();}
	return false;
}

// определение формы слова для заданного числа
function WordForm(num, form1, form2, form3)
{
	if (typeof(form3) == 'undefined') form3 = form2;
	num = '' + num;
	last_num = num.substr(num.length-2, 1);
	last_twonums = num.substr(num.length-3, 2);
	//window.alert(last_twonums);

	str = '';
	// определяемся с морфологией
	if (last_num == '1') str = form1;
	else if (last_num == '2' || last_num == '3' || last_num == '4') str = form2;		
	else if (last_num == '5' || last_num == '6' || last_num == '7' || last_num == '8' || last_num == '9'
			|| last_num == "0") str = form3;
		
	if (last_twonums == '11' || last_twonums == '12' || last_twonums == '13' || last_twonums == '14') str = form3;
	return str;
}

function ToggleDiv(a, div)
{
	Animation(div, a.innerHTML == 'скрыть' ? 'slideUp' : 'slideDown');
	a.innerHTML = a.innerHTML == 'скрыть' ? 'подробнее' : 'скрыть';
	return false;
}

// отрезание пробелов
function Trim(str)
{
	return str.replace(/^\s+|\s+$/g, ''); //str.replace(/^\s+/, '').replace(/\s+$/, '');
}

// добавление элемента option для select-а
function addOption (oListbox, text, value, isDefaultSelected, isSelected)
{
	var is_ie = (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent));
	if (is_ie) oListbox.options[oListbox.options.length] = new Option(text, value);
	else
	{
		var oOption = document.createElement("option");
		oOption.appendChild(document.createTextNode(text));
		oOption.setAttribute("value", value);
	
		if (isDefaultSelected) oOption.defaultSelected = true;
		else if (isSelected) oOption.selected = true;
	
		oListbox.appendChild(oOption);
	}
}

ArrayToTr = new Array (
	'а','A', 'б','B', 'в','V', 'г','G', 'д','D', 'е','E', 'ё','YO', 'ж','ZH', 'з','Z', 'и','I', 'й','J', 'к','K', 'л','L',
	'м','M', 'н','N', 'о','O', 'п','P', 'р','R', 'с','S', 'т','T', 'у','U', 'ф','F', 'х','H', 'ц','CZ', 'ч','CH', 'ш','SH',
	'щ','SHH', 'ь','', 'ы','Y', 'ъ','', 'э','E', 'ю','YU', 'я','YA',
	
	'А','A', 'Б','B', 'В','V', 'Г','G', 'Д','D', 'Е','E', 'Ё','YO', 'Ж','ZH', 'З','Z', 'И','I', 'Й','J', 'К','K', 'Л','L',
	'М','M', 'Н','N', 'О','O', 'П','P', 'Р','R', 'С','S', 'Т','T', 'У','U', 'Ф','F', 'Х','H', 'Ц','CZ', 'Ч','CH', 'Ш','SH',
	'Щ','SHH', 'Ь','', 'Ы','Y', 'Ъ','', 'Э','E', 'Ю','YU', 'Я','YA'
);

// перевод строки в транслит
function Translit(ruString)
{
	var TrString = ruString;
	for (j=0;j<=130;j+=2)
	{
		while (TrString.indexOf(ArrayToTr[j]) != -1)
		{
			TrString = TrString.replace(ArrayToTr[j], ArrayToTr[j+1]);
		}
	}
	return TrString;		
}

// обработчик ошибок
function myErrHandler(msg, url, lno)
{
	window.alert('Ошибка JavaScript в файле ' + url + ' в строке № '+lno + '\n' + msg);
	return false;
}

function getCursorPosition(obj)
{
	if (typeof(obj) == 'string') obj = document.getElementById(obj);
	
	var pos = 0;
	if (document.selection)
	{
		var range = document.selection.createRange();
		range.moveStart('textedit', -1);
		pos = range.text.length;
	}
	else if (typeof(obj.selectionStart) == "number") pos = obj.selectionStart;
	return pos;
}

function oalert(object, write)
{
	var str = '';
	for (var key in object) str += 'Object['+key+'] = '+object[key]+((write)?'<br>':'\n');
	if (write) document.write(str);
	else alert(str);
}

function showOffice(officeNum)
{
	if (typeof(officeNum) == "undefined") officeNum = document.getElementById("talarii_office").value;
	if (!officeNum) window.alert("Для просмотра на карте выберите офис из списка.");
	else
	{
		var w = 600+20, h = 600+25;
		if (officeNum == 'mow') {w = 577+20; h = 577+25}
		if (officeNum == 'mow2') {w = 400+20; h = 300+25}
		if (officeNum == 'spb') {w = 600+20; h = 600+25}
		if (officeNum == 'pp') {w = 681+20; h = 577+10}
		if (officeNum == 'nsh') {w = 930+20; h = 629+10}
		if (officeNum == 'nk') {alert('Для этого офиса нет карты.'); return}
		NewWindow(CONFIG['site_url']+'files/common/offices/'+officeNum+".jpg", w, h);
	}
}

// эл. почта
String.prototype.printAddr = 
function (_hamper,_prefix,_postfix,_face)
{
	_hamper=
	_prefix+
	"@"+
	this+
	(_postfix || '')
	document.write((_face||_hamper).link("mailto:"+_hamper));
}


// преобразование строки в число
function number(str, type)
{
	var newStr = '';
	var numbers = new Array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-');
	if (type != 'int') numbers.push('.');
	for (var i=0;i<str.length;i++)
	{
		simbol = str.charAt(i);
		if (inArray(simbol, numbers)) newStr += ('' + simbol);
	}
	return (newStr - 1) + 1;
}

function toNumber(str, type)
{
	var str = (typeof(str) != 'undefined') ? str : '';
	var type = (typeof(type) != 'undefined') ? type : 'int';
	str += '';
	var newStr = '';
	var numbers = new Array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-');
	if (type != 'int') numbers.push('.');
	for (var i=0;i<str.length;i++)
	{
		simbol = str.charAt(i);
		if (simbol == ',') simbol = '.';
		if (inArray(simbol, numbers)) newStr += ('' + simbol);
	}
	return (newStr - 1) + 1;
}

function isNumber(str)
{
	var str = (typeof(str) != 'undefined') ? str : '';
	str += '';
	var numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
	for (var i=0;i<str.length;i++)
	{
		var simbol = str.charAt(i);
		if (!inArray(simbol, numbers)) return false;
	}
	return true;
}

// проверка наличия значения в массиве или объекте
function inArray(val, arr)
{
	if (!arr || arr.length == 0) return false;
	if (val == arr) return true;
	for (var key in arr) if (arr[key] == val) return true;
	return false;
}

function getVariableType(object)
{
	var type = typeof(object);
	if (type == 'object' && !object) return 'null';
	if (type == 'object')
	{
		if (!object.constructor) return 'object';
		var cons = object.constructor.toString();
		var match = cons.match(/(\w+)\(/);
		if (match) cons = match[1].toLowerCase();
		var types = ['boolean', 'number', 'string', 'array'];
		for (var key in types) if (cons == types[key]) {type = types[key]; break;}
	}
	return type;
};

// проверка наличия значения в ключах массива или объекта
function inArrayKeys(val, arr)
{
	for (var key in arr) if (key == val) return true;
	return false;
}

// получение ключей массива или объекта
function ArrayKeys(arr)
{
	var keys = new Array();
	var i = 0;
	for (var key in arr) {keys[i] = key; i++;}
	return keys;
}

// перемена местами ключей и значений массива или объекта
function ArrayFlip(arr)
{
	flip = new Object();
	for (var key in arr) flip[arr[key]] = key;
	return flip;
}

// объединение нумерованных массивов
function NumArrayMerge(arr1, arr2)
{
	var arr = [];
	for (var i=0;i<arr1.length;i++) arr.push(arr1[i]);
	for (var i=0;i<arr2.length;i++) if (!inArray(arr2[i], arr)) arr.push(arr2[i]);	
	return arr;
}

// проверка равенства нумерованных массивов
function NumArrayEqual(arr1, arr2)
{
	if (arr1.length != arr2.length) return false;
	for (var i=0;i<arr1.length;i++) if (arr1[i] != arr2[i]) return false;
	return true;
}

// определение пустоты пересечения массивов
function arrayIntersectEmpty(arr1, arr2)
{
	for (var key in arr1) if (inArray(arr1[key], arr2)) return false;
	return true;
}

// получение выбранных значений select-a (может быть multiselect или обычный)
function getSelectedValues(element)
{
	if (element.multiple)
	{
		var result = [];
		for (var i=0;i<element.length;i++) if (element[i].selected) result.push(element[i].value);
	}
	else var result = element.value;
	
	return result;
}

// получение всех значений select-a
function getSelectValues(element)
{
	var result = new Array;
	for (var i=0;i<element.length;i++) result.push(element[i].value);
	return result;
}

// получение значения radio-элемента
function getRadioValue(radio)
{
	if (!radio.length) {if (radio.checked) return radio.value; else return false} // одиночный radio
	if (!radio[0]) return false;
	for (var i=0;i<radio.length;i++) if (radio[i].checked) return radio[i].value;
	return false;
}

// замена в строке
function StrReplace(from, to, str)
{
	str += '';
	if (typeof(from) == 'string') var from = [from]; if (typeof(to) == 'string') var to = [to];
	
	for (var i=0;i<from.length;i++)
	{
		if (typeof(to[i]) == 'undefined') to[i] = to[to.length-1];
		str = str.split(from[i]+'').join(to[i]+'');
	}
	
	return str;
}

// корректировка ввода в поле
function CheckField(evt, type)
{
	// массив допустимых символов
	type = (typeof(type) == 'undefined') ? 'count' : type;
	if (type == 'count') var array = new Array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
	else if (type == 'weight') var array = new Array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '.');
	else if (type == 'price') var array = new Array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
	else if (type == 'phone') var array = new Array ('(', ')', '-', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+');
	else var array = [' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+'];
	
	evt = (evt) ? evt : event; // событие
	var charCode = (evt.charCode ? evt.charCode : (evt.keyCode ? evt.keyCode : (evt.which?evt.which:0)))
	
	simbol = String.fromCharCode(charCode);
	
	if (inArray(simbol, array)) return true;
	else return false;
}

// вычисленное свойство элемента
function getElementComputedStyle(elem, prop)
{
	if (typeof elem != "object") elem = document.getElementById(elem);
	
	// external stylesheet for Mozilla, Opera 7+ and Safari 1.3+
	if (document.defaultView && document.defaultView.getComputedStyle)
	{
		if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
		return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
	}
	
	// external stylesheet for Explorer and Opera 9
	if (elem.currentStyle)
	{
		var i;
		while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
		return elem.currentStyle[prop];
	}
	
	return "";
}

// ширина и высота клиентской (рабочей) области окна 
function getClientWidth()
{
	return (document.compatMode=='CSS1Compat' && !window.opera) ? document.documentElement.clientWidth : window.innerWidth;
}
function getClientHeight()
{
	return (document.compatMode=='CSS1Compat' && !window.opera) ? document.documentElement.clientHeight : window.innerHeight;
}

// получение скрола (прокрученности)
function getBodyScrollTop()
{
	return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}
function getBodyScrollLeft()
{
	return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
}

// получение положения элемента
function getElementPosition(elem)
{
	if (typeof elem == 'string') var elem = document.getElementById(elem);
	
	var w = elem.offsetWidth, h = elem.offsetHeight;
	var l = 0, t = 0;
	
	var str = '';
	while (elem)
	{
		// проблемы с элементами <a>
		//if (elem.offsetParent && elem.offsetParent.style) elem.offsetParent.style.border="1px solid red";
		//str += (elem.offsetParent?elem.offsetParent.tagName:'')+' ' + elem.offsetTop+' '
		l += elem.offsetLeft;
		t += elem.offsetTop;
		elem = elem.offsetParent;
	}
	//alert(str);
	
	return {"left":l, "top":t, "width":w, "height":h};
}


// плоожение курсора мыши
function getMousePosition(e)
{
	var x = 0, y = 0;
	
	if (!e) e = window.event;
	
	if (e.pageX || e.pageY) {x = e.pageX; y = e.pageY;}
	else if (e.clientX || e.clientY)
		{x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
		y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;}
	
	return {"x":x, "y":y};
}

// Посимвольное отображение строки с задержками
String.prototype.delayingWrite = function(obj, delay)
{
	if (this.length>0)
	{
		if (typeof obj == 'string') obj = document.getElementById(obj);
		
		obj.innerHTML += this.charAt(0);
		s = this.substr(1);

		if (s) setTimeout(function(){s.delayingWrite(obj, delay);},delay);
	}
}

// добавление обработчика для события
function addEvent(element, eventType, func, useCapture)
{
	if (element.addEventListener) {element.addEventListener(eventType, func, useCapture ? true : false); return true;}
	else if (element.attachEvent) return element.attachEvent('on' + eventType, func); // ie, opera
	else element['on' + eventType] = func;
}

function setPasswordInput(input, type, value, is_focus)
{
	if (type == 'start') {type = (input.value) ? 'password' : 'text'; value = (input.value) ? input.value : 'Пароль';} // загрузка страницы
	var value = (typeof(value) != 'undefined') ? value : input.value;
	var id = input.id || 'setInputType' + Math.random();
	var name = input.name;	
	$(input).replaceWith('<input type="'+type+'" name="'+name+'" '+(value?'value="'+value+'"':'')
		+ 'onblur="if (!this.value) setPasswordInput(this,\'text\',\'Пароль\')" '
		+ 'onfocus="if (this.value==\'Пароль\' && this.type==\'text\') setPasswordInput(this,\'password\',\'\',1)" id="'+id+'">');
	if (is_focus) setTimeout('document.getElementById("'+id+'").focus()', 10);
}

function removeEvent(elem, type, handler)
{
	// (1)
	var handlers = elem.events && elem.events[type]  
	if (!handlers) return;
	
	// (2)
	delete handlers[handler.guid]
	
	// (3)
	for(var any in handlers) return
	// (3.1)
	if (elem.removeEventListener)
	elem.removeEventListener(type, elem.handle, false)
	else if (elem.detachEvent)
	elem.detachEvent("on" + type, elem.handle)
	
	delete elem.events[type]
	
	// (3.2)
	for (var any in elem.events) return
	try {
	delete elem.handle
	delete elem.events 
	} catch(e) { // IE
		elem.removeAttribute("handle")
		elem.removeAttribute("events")
	}
}


// временное выделение поля цветом и установка на него фокуса (опциально)
function MarkField(field, focus)
{
	if (field.length && !field.tagName) {for (var i=0;i<field.length;i++) MarkField(field[i], i==0?focus:false); return;}
	if (!field || !field.style || field.UseMarkFieldFunction) return;
	
	field.id = field.id || 'MarkField' + Math.random();
	var id = field.id.split("'").join("\\'");
	
	if (typeof(field.MarkFieldBackgroundColor) == 'undefined') field.MarkFieldBackgroundColor = field.style.backgroundColor;
	field.style.backgroundColor = '#FFB0B0';
	
	if (field.MarkFieldTimeMark) clearTimeout(field.MarkFieldTimeMark);
	field.MarkFieldTimeMark = window.setTimeout("if (document.getElementById('"+id+"')) "
		+ "document.getElementById('"+id+"').style.backgroundColor = document.getElementById('"+id+"').MarkFieldBackgroundColor;", 3000);
	if (focus) field.focus();
}

// установка курсора на начало поля ввода
function SelectField(field)
{
	if (field.length && !field.tagName) {SelectField(field[0]); return;}
	if (!field.offsetWidth) return;
	field.focus();
	if (inArray(field.type, ['checkbox', 'radio'])) return; // если нетекстовый объект, выходим
	
	if (field.createTextRange)
	{
		var r = field.createTextRange();
		r.collapse(true);
		r.select();
	}
	else if (field.selectionStart)
	{
		field.setSelectionRange(0,0);
		field.focus();
	}
}

function SetOpacity(element, koef)
{
	var koef = Math.round(koef*100)/100;	
	if (typeof(element.style.opacity) == 'string') element.style.opacity = koef;
	else if (typeof(element.style.MozOpacity) == 'string') element.style.MozOpacity = koef;
	else if (typeof(element.style.KhtmlOpacity) == 'string') element.style.KhtmlOpacity = koef;
	else if (element.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5)
	{
		var alpha = element.filters['DXImageTransform.Microsoft.alpha'] || element.filters.alpha;
		if (alpha) alpha.opacity = koef*100;
		else element.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+(koef*100)+")";		
	}
}

// анимация
function Animation(element, effect, func, no_animation)
{	
	if (no_animation) {element.style.display = inArray(effect, ['slideUp', 'fadeOut']) ? 'none' : ''; return;}
	
	var is_ie6 = jQuery.browser.msie && jQuery.browser.version - 0 <= 6;
	var is_ie7 = jQuery.browser.msie && jQuery.browser.version - 0 >= 7 && jQuery.browser.version - 0 < 8;
	
	// кряк для ie6,ie7
	if (inArray(effect, ['slideUp', 'slideDown']) && (is_ie7||is_ie6))
	{
		var as = $(element).find('a, input[type="checkbox"]'); if (as.length==1) var as = [as];
		for (var j=0;j<as.length;j++) $(as[j]).hide();
		if (effect == 'slideDown') var func = (func?func+';':'')+'ShowLinks(this)';
	}
	
	if (is_ie6)
	{
		if (inArray(effect, ['fadeIn'])) {$(element).css('display', ''); if (func) eval(func);}
		else if (inArray(effect, ['fadeOut'])) {$(element).css('display', 'none'); if (func) eval(func);}
		else {var func = (func) ? 'function () {'+func+'}' : ''; eval('$(element).'+effect+'('+func+')');}
	}
	else {var func = (func) ? 'function () {'+func+'}' : ''; eval('$(element).'+effect+'('+func+')');}
	
	// кряк для ie
	if (inArray(effect, ['fadeIn','fadeOut']) && jQuery.browser.msie)
	{
		var as = $(element).find('a'); if (as.length==1) var as = [as];
		for (var j=0;j<as.length;j++) Animation(as[j], effect);
	}
}
function ShowLinks(element)
{
	var as = $(element).find('a, input[type="checkbox"]'); if (as.length==1) var as = [as];
	for (var i=0;i<as.length;i++) $(as[i]).show();
}

/////////////////////////////////////////////////////////////////////////
// показ страниц (возвращает строку)
// n_visible_pages - количество видимых страниц
function Pages(n_items, n_on_page, page, onclick, indicator)
{
	n_pages = Math.ceil(n_items/n_on_page);   // всего страниц

	//if (!n_visible_pages || n_visible_pages > n_pages) n_visible_pages = n_pages;
	
	var pages_link = '';
	onclick += ';return false';
	for (var i=1;i<=n_pages;i++) pages_link += (i == page) ? i+' ' : '<a href="#" onclick="'+onclick.split('$page').join(i)+'">'+i+'</a> ';
	
	//if (n_visible_pages < n_pages) pages_link += '<img src="'+CONFIG['site_url']+'images/busy.gif">';
	if (indicator) pages_link += '<img src="'+CONFIG['site_url']+'images/busy.gif" class="indicator">';
	else pages_link += '<img src="'+CONFIG['site_url']+'common/html/images/blank.gif" style="width: 5px; height: 16px;">';
	
	var min_item = n_on_page*(page-1)+1;
	var max_item = (page == n_pages) ? n_items : n_on_page*(page-1)+n_on_page;

	pages_link += '<br><span style="font-size: 90%; color: #666666">Просмотр страницы '+page+' из '+n_pages+', показ '+min_item+' - '+max_item
		+' из '+n_items+'</span>';
	
	return pages_link;
	
}

// вывод и убирание сообщения
function Message(text, what)
{
	var is_ie = ( /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) );
	if (what == 'off')
	{
		if (document.getElementById('jsMessageDiv')) document.getElementById('jsMessageDiv').style.display = 'none';
		if (is_ie && document.getElementById('jsMessageFrame')) document.getElementById('jsMessageFrame').style.display = 'none';		
		return;
	}
	
	var width = 200, height = 70;
	
	var left = Math.round(getBodyScrollLeft() + getClientWidth()/2 - width/2);
	var top = Math.round(getBodyScrollTop() + getClientHeight()/2 - height/2);
	
	if (left < 0) left = 0; if (top < 0) top = 0;
	
	if (!document.getElementById('jsMessageDiv'))
	{
		var div = document.createElement('div');
		div.id = 'jsMessageDiv';
		document.body.appendChild(div);
	}
	else var div = document.getElementById('jsMessageDiv');
	
	if (is_ie)
	{
		if (!document.getElementById('jsMessageFrame'))
		{
			var frame = document.createElement('iframe');		
			document.body.appendChild(frame);
			frame.outerHTML = '<IFRAME id="jsMessageFrame" frameborder="0"></IFRAME>';		
		}
		var frame = document.getElementById('jsMessageFrame');
	}
	
	
	if (what == 'close') var inner = '<p>'+text+'</p><p><a href="#" onclick="Message(null, \'off\');return false;">Закрыть</a></p>';
	else var inner = '<p><img src="'+CONFIG['site_url']+'images/busy.gif" class="indicator"> '+text+'</p>';
	
	div.style.height = 'auto'; // возвращаем исходную высоту по-умолчанию
	div.innerHTML = inner;
	if (document.getElementById('Clock')) Clock('Clock');
	div.style.width = width + 'px';	
	if (div.clientHeight < height) div.style.height = height + 'px';
	div.style.left = left + 'px'; div.style.top = top + 'px';
	div.style.zIndex = '101';
	div.style.display = '';
	
	
	// подкладываем фрейм
	if (is_ie)
	{	
		width = StrReplace('px', '', getElementComputedStyle(div, 'width')) - 0
			+ (StrReplace('px', '', getElementComputedStyle(div, 'border-left-width')) - 0)
			+ (StrReplace('px', '', getElementComputedStyle(div, 'border-right-width')) - 0)
			+ (StrReplace('px', '', getElementComputedStyle(div, 'padding-right')) - 0)
			+ (StrReplace('px', '', getElementComputedStyle(div, 'padding-left')) - 0);
		height = div.clientHeight - 0 
			+ (StrReplace('px', '', getElementComputedStyle(div, 'border-top-width')) - 0)
			+ (StrReplace('px', '', getElementComputedStyle(div, 'border-bottom-width')) - 0);
			/*+ (StrReplace('px', '', getElementComputedStyle(div, 'padding-top')) - 0)
			+ (StrReplace('px', '', getElementComputedStyle(div, 'padding-bottom')) - 0);*/		
		
		frame.style.position = 'absolute';
		frame.style.width = width + 'px'; frame.style.height = height + 'px';
		frame.style.zIndex = '100';
		frame.style.left = left + 'px'; frame.style.top = top + 'px';
		frame.style.display = '';
	}
}

function Clock(div, is_repeat)
{
	if (typeof(div) == 'string') var div = $('#'+div)[0];
	if (!div) return;
	if (!div.id) div.id = 'Clock'+toNumber(Math.random());
	if (!div.start_time) div.start_time = new Date().valueOf();
	var date = new Date(new Date().valueOf() - div.start_time);
	var time = []; for (var i=0;i<2;i++) {eval('time[i] = date.get'+(i?'Seconds':'Minutes')+'()'); if (time[i]<10) time[i] = '0'+time[i];}
	div.innerHTML = time.join(':');
	setTimeout('Clock("'+div.id+'", 1)', 1000);
}

// подписка на новости
function Subscribe(what, button)
{
	var form = document.getElementById('subscribe');
	var errors = [],  fields = [];
	if (!form.email.value) {errors.push('Не указан E-mail.'); fields.push(form.email);}
	else if (!(/^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,10}$/i).test(form.email.value))
		{errors.push('E-mail адрес задан некорректно, пожалуйста, проверьте.'); fields.push(form.email);}
	if (what == 'on' && !form.name.value)
		{errors.push('Не указано '+((form.type.value=='private')?'ФИО':'название организации'))+'.'; fields.push(form.name);}
	
	if (errors.length > 0)
	{
		window.alert('Ошибки:\n'+errors.join('\n'));
		SelectField(fields[0]);
		for (var i=0;i<fields.length;i++) MarkField(fields[i]);
		return;
	}

	JsHttpRequest.query
	(
		'/users/subscribe/?ajax',
		{
			'what': what,
			'form': document.getElementById('subscribe')
		},
		function(result, errors)
		{
			document.getElementById('AjaxErrors').innerHTML = errors;			
			if (result.result == 'yes' || result.result == 'wrongemail')
			{
				if (result.what == 'on')
				{
					if (result.result == 'wrongemail') alert('Этот адрес уже подписан на рассылку.');
					else alert('Для подтверждения подписки на рассылку кликните по ссылке в письме, отправленном на указаный email.')
				}
				if (result.what == 'off')
				{
					if (result.result == 'wrongemail') alert('Этот адрес не подписан на рассылку.');
					else alert('Для подтверждения отписки от рассылки кликните по ссылке в письме, отправленном на указаный email.');
				}
			}
		},
		true
	)	
}


function CheckStartForm(what, url, form_id, form_message)
{
	if (typeof(form_message) == 'undefined') form_message = '';
	// сначала только проверяем ошибки
	
	JsHttpRequest.query
	(
		url,
		{
			'form' : document.getElementById(form_id),
			'what' : what,
			'form_id' : form_id,
			'form_message' : form_message,
			'check_errors' : true
		},
		function(result, errors)
		{
			document.getElementById('AjaxErrors').innerHTML = errors;
			if (result.errors.length > 0) {window.alert('Ошибки:\n'+result.errors.join('\n'));}
			else
			{
				var form_message = (result.form_message && typeof(result.form_message) != 'undefined' && result.form_message != 'undefined')
					? result.form_message : 'Подождите, идет обработка данных...';
				Message(form_message);
				JsHttpRequest.query
				(
					url,
					{
						'form' : document.getElementById(result.form_id),
						'what' : what					
					},
					function(result, errors)
					{
						document.getElementById('AjaxErrors').innerHTML = errors;
						if (result.message && result.message != '') Message(result.message, 'close');					
						else window.location = result.url;
					},
					true
				)			
			}
		},
		true
	)
	
	return false;
}

// проверка ошибок в стандартных полях: ФИО, телефон, почта
function CheckClaimErrors(form, errors, fields)
{
	if (form.fio.value == '') {errors.push('Не заполнено поле "Фамилия Имя Отчество"'); fields.push(form.fio);}
	if (form.phone.value == '') {errors.push('Не указан телефон'); fields.push(form.phone);}
	if (form.email.value == '') {errors.push('Не указан E-mail'); fields.push(form.email);}
	else
	{
		var emails = StrReplace(';', ',', form.email.value).split(',');
		for (var i=0;i<emails.length;i++)
			if (!(/^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,10}$/i).test(Trim(emails[i])))
			{errors.push('E-mail адрес задан некорректно, пожалуйста, проверьте'); fields.push(form.email); break;}	
	}

	return [errors, fields];
}

// динамические строки
DinamicRows = {}
DinamicRows.add = function (id, button, no_animation)
{	
	var divs = $('#'+id).children('div');
	
	if (divs.length >= DinamicRows[id].max_num) return false; //  максимальное количество
	
	// смотрим, откуда нажали
	if (button) for (var i=0;i<divs.length;i++) {var el = $(divs[i]).find('a'); for (var j=0;j<el.length;j++) if (el[j]==button) {num=i;break;}}
	else num = divs.length - 1; // добавляем в конец
	
	var inner = '<div style="display: none">'+DinamicRows[id].inner+'</div>';
	
	if (num >= 0) $(divs[num]).after(inner); else $('#'+id).html(inner);
	var divs = $('#'+id).children('div'); // переопределяем
	
	var div = divs[num+1];
	
	SetPointers(div); // поинтеры
	
	if (DinamicRows[id].func) DinamicRows[id].func(num+1);
		
	if (no_animation) div.style.display = '';
	else Animation(div, 'slideDown');
	
	return false;	
}
DinamicRows.del = function (id, button)
{
	var divs = $('#'+id).children('div');
	
	// смотрим, откуда нажали
	if (button) for (var i=0;i<divs.length;i++) {var el = $(divs[i]).find('a'); for (var j=0;j<el.length;j++) if (el[j]==button) {num=i;break;}}
	else num = divs.length - 1;
	
	if (divs.length == 1) {if(divs[num].outerHTML) divs[num].outerHTML = ''; else $(divs[num]).remove(); DinamicRows.add(id, '', 1)}
	else Animation(divs[num], 'slideUp', 'if (this.outerHTML) this.outerHTML = ""; else $(this).remove();');
	
	return false;
}



// список элементов
Listing = {}
Listing.Options = {}
Listing.EditItem = function(id)
{
	if (typeof(id) == 'undefined') id = '';
	NewWindow(this.Options.Edit[0]+'?id='+id, this.Options.Edit[1], this.Options.Edit[2], this.Options.Edit[3]);
}

Listing.DelItem = function(id)
{
	if (!window.confirm(this.Options.Del[1])) return;

	JsHttpRequest.query
	(
		this.Options.Del[0]+'?id='+id,
		{'id' : id},
		function(result, errors)
		{
			document.getElementById('AjaxErrors').innerHTML = errors;
			if (result.result == 'yes')
			{
				var table = document.getElementById('listing');
				var num = document.getElementById('tr'+result.id).rowIndex;
				table.deleteRow(num);
				for (var i=num;i<table.rows.length;i++)	table.rows[i].cells[0].innerHTML -= 1; // перенумеровываем
				if (table.rows.length <= 1)
				{
					table.style.display = 'none';
					document.getElementById('noitems_message').style.display = '';
				}
			}
		},
		true
	)	
}

Listing.jsAddItem = function(id, data)
{
	var table = document.getElementById('listing');
	table.style.display = ''; document.getElementById('noitems_message').style.display = 'none';
	
	var num = toNumber(table.rows[table.rows.length-1].cells[0].innerHTML) + 1;
	
	// определяем поддерживает ли браузер добавление атрибутов
	var old_class = document.body.className;
	document.body.setAttribute("class", "attribute-test");
	var BrowserAttributes = (document.body.className == "attribute-test") ? true : false;
	document.body.className = old_class;
	
	var tr = table.insertRow(num);
	tr.id = 'tr' + id;
	tr.insertCell(-1).innerHTML = num;
	for (var i=0;i<data.length;i++) td = tr.insertCell(-1).innerHTML = data[i];
	
	// перенумеровываем
	for (var i=num+1;i<table.rows.length;i++) table.rows[i].cells[0].innerHTML -= -1;
}

Listing.jsEditItem = function(id, data)
{
	var row = document.getElementById('tr'+id);
	for (var i=0;i<data.length;i++) row.cells[i+1].innerHTML = data[i];
}

