// Проверка форм @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;
}

// поиск города в разделе Section и вставка в поле с id ElementId (библиотека citysearch)
function CityOldSearch(ElementId, Section)
{
	NewWindow("/lib/citysearch_old/?elementid="+ElementId+"&section="+Section, 480, 500);
	return false;
}

// установка переменной what значения value в сессии (эмуляция метода POST)
function SetSession(what, value, param)
{
	JsHttpRequest.query
	(
		'/lib/ajax/setsession/',
		{
			"what": what,
			"value": value,
			'param' : param
		},
		function(result)
		{
			if (result.result != 'yes') alert('function SetSession('+what+', '+value+'): Нет доступа.');
			else if (result.param && result.param != 'undefined') window.location = result.param;
		},
		true
	)
}

// отрезание страниц у ссылки и перезагрузка
function CutPages()
{
	loc = window.location.href;
	return loc.replace(/pages\/\d+\//, '');
}

// открытие нового окна
function NewWindow(url, w, h, scrollbars)
{
	if (typeof scrollbars == "undefined") scrollbars = 0; 
	var myname = 'name';
	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();}
}

// определение формы слова для заданного числа
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 Trim(str)
{
	return 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 == '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("http://www.talarii.ru/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.length == 0) return false;
	if (val == arr) return true;
	for (var key in arr) if (arr[key] == val) return true;
	return false;
}

// проверка наличия значения в ключах массива или объекта
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 = new Array;
		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 = new 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:document.body.clientWidth;
}
function getClientHeight()
{
  return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
}

// получение скрола (прокрученности)
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;
	
	while (elem) {l += elem.offsetLeft; t += elem.offsetTop; elem = elem.offsetParent;}
	
	return {"left":l, "top":t, "bottom":t+h , "width":w, "height":h};
}

// Посимвольное отображение строки с задержками
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 MarkField(field, focus)
{
	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(inputObject)
{
	inputObject.focus();
	if (inArray(inputObject.type, ['checkbox', 'radio'])) return; // если нетекстовый объект, выходим
	
	if (inputObject.createTextRange)
	{
		var r = inputObject.createTextRange();
		r.collapse(true);
		r.select();
	}
	else if (inputObject.selectionStart)
	{
		inputObject.setSelectionRange(0,0);
		inputObject.focus();
	}
}


/////////////////////////////////////////////////////////////////////////
// показ страниц (возвращает строку)
// 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="http://www.talarii.ru/images/busy.gif">';
	if (indicator) pages_link += '<img src="http://www.talarii.ru/images/busy.gif">';
	else pages_link += '<img src="" width="0" height="15">';
	
	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)
{
	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 id="jsMessageP"><img src="http://www.talarii.ru/images/busy.gif"> '+text+'</p>';
	
	div.style.height = 'auto'; // возвращаем исходную высоту по-умолчанию
	div.innerHTML = inner;
	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 Subscribe(what, button)
{
	var form = button.form;
	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/',
		{
			"what": what,
			"from": document.getElementById('subscribe'),
			'ajax': true
		},
		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
	)	
}
				   
