

var W=window,
	P=W.parent,
	T=W.top,
	D=W.document,
	BODY=D.body,
	HTML=(BODY.parentNode || BODY),
	NOW=new Date(),
	TMP;


var SITE_ROOT="",
	DATE_FORMAT=0,
	PASSWORD_MIN_LENGTH=3,

	OBJECT_OPERATIONS={
"1" : "Продажа",
"2" : "Аренда"
}
,
	OBJECT_OPERATIONS_ABBR={
"1" : "пр",
"2" : "ар"
}
,
	SEARCH_OBJECT_OPERATIONS={
"1" : "Продажа",
"2" : "Аренда",
"21" : "Посуточно",
"22" : "Почасово"
}
,
	SEARCH_OBJECT_OPERATIONS_URL={
"1" : "prodazha",
"2" : "arenda",
"21" : "posutochno",
"22" : "pochasovo"
}
,
	OBJECT_TYPES={
"1" : "Квартира",
"2" : "Комната",
"3" : "Дом, дача",
"4" : "Участок",
"5" : "Гараж, стоянка",
"10" : "Коммерческая недвижимость",
"20" : "Жилой комплекс"
}
,
	OBJECT_TYPES_ABBR={
"1" : "кв",
"2" : "ком",
"3" : "дом",
"4" : "уч",
"5" : "гар",
"10" : "кн",
"20" : "жк"
}
,
	SEARCH_OBJECT_TYPES={
"1" : "Квартира",
"2" : "Комната",
"3" : "Дом, дача",
"4" : "Участок",
"5" : "Гараж, стоянка",
"10" : "Коммерческая недвижимость",
"20" : "Жилой комплекс"
}
,
	SEARCH_OBJECT_TYPES_URL={
"1" : "kvartira",
"2" : "komnata",
"3" : "dom",
"4" : "uchastok",
"5" : "garazh",
"10" : "kommer",
"20" : "kompleks"
}
,
	OBJECT_SUBTYPES={
"3" : {
"1" : "Дом",
"2" : "Коттедж",
"3" : "Дача",
"4" : "Таунхаус"
}
,
"4" : {
"1" : "Коммерческое",
"2" : "ИЖС",
"3" : "Дача",
"100" : "Другое"
}
,
"5" : {
"1" : "Гараж",
"2" : "Стоянка"
}
,
"10" : {
"1" : "Офис",
"2" : "Магазин",
"3" : "Ресторан",
"4" : "Гостиница",
"5" : "Склад",
"6" : "Производство",
"7" : "Здание, помещение",
"100" : "Другое \/ свободное"
}

}
,
	OBJECT_SUBTYPES_ABBR={
"3" : {
"1" : "Дом",
"2" : "Кот",
"3" : "Дача",
"4" : "Тх"
}
,
"4" : {
"1" : "Ком",
"2" : "Ижс",
"3" : "Дача",
"100" : "др"
}
,
"5" : {
"1" : "Гар",
"2" : "Ст"
}
,
"10" : {
"1" : "Оф",
"2" : "Маг",
"3" : "Рест",
"4" : "Гост",
"5" : "Скл",
"6" : "Пр",
"7" : "Пом",
"100" : "др"
}

}
,
	OBJECT_ROOMS={
"1" : "1",
"2" : "2",
"3" : "3",
"4" : "4",
"5" : "5+"
}
,
	PRICE_UNITS_BASE={
"1" : "руб",
"2" : "USD",
"3" : "EUR"
}
,
	PRICE_UNITS_S={
"1" : "руб",
"2" : "USD",
"3" : "EUR",
"11" : "руб\/кв.м.",
"12" : "USD\/кв.м.",
"13" : "EUR\/кв.м."
}
,
	PRICE_UNITS_SA={
"1" : "руб",
"2" : "USD",
"3" : "EUR",
"21" : "руб\/сот.",
"22" : "USD\/сот.",
"23" : "EUR\/сот."
}
,
	REGION_DISTRICTS={
"100" : {
"101" : "Авиастроительный район",
"102" : "Вахитовский район",
"103" : "Кировский район",
"104" : "Московский район",
"105" : "Ново-Савиновский район",
"106" : "Приволжский район",
"107" : "Советский район",
"1" : "за городом"
}
,
"200" : {
"201" : "Автозаводский район",
"202" : "Комсомольский район",
"203" : "Центральный район",
"1" : "за городом"
}

}
;





// Error handling functions
//-------------------------------------\
function handleError() {
	return true;
	}
function handleErrorAlert() {
	alert("There was an Java-Script error. Operation terminated");
	return true;
	}
function disableJSError(w,alert) {
	(w || window).onerror=alert ? handleErrorAlert : handleError;
	}
//-------------------------------------/


// Disable context menu
//-------------------------------------\
function handleContext(e) {
	return (e && e.which && e.which==1) || false;
	}
function stopContext(w) {
	var d=(w || window).document;
	if (d.captureEvents) d.captureEvents(Event.MOUSEDOWN);
	d.oncontextmenu=d.onmousedown=handleContext;
	}
//-------------------------------------/


// Make Pull-Down Window
//-------------------------------------\
function makePullDown(source,name,width,height) {
	var win_prop="location=no,toolbar=no,directories=no,menubar=yes,status=yes,scrollbars=yes,resizable=yes,dependent=no,width="+width+",height="+height;
	if (W.screen) {
		var x=Math.floor((screen.width-width)/2);
		var y=Math.floor((screen.height-height)/2);
		win_prop+=",screenX="+x+",screenY="+y+",left="+x+",top="+y;
		}
	var win=W.open(source,name,win_prop);
	win.focus();
	return win;
	}
//-------------------------------------/

// Convert to upper case
//-------------------------------------\
function toUpper(str) {
	return str.toUpperCase();
	}
//-------------------------------------/


// Convert to lower case
//-------------------------------------\
function toLower(str) {
	return str.toLowerCase();
	}
//-------------------------------------/


// Check integer value
//-------------------------------------\
function checkInt(str) {
	return str.match(/^\d+$/) ? eval(str) : false;
	}
//-------------------------------------/


// Check float value
//-------------------------------------\
function checkFloat(str) {
	return str.match(/^\d+([\.,]\d+)?$/) ? eval(str.replace(',','.')) : false;
	}
//-------------------------------------/


// Check ZIP value
//-------------------------------------\
function checkZip(str) {
	return !!str.match(/^\d{5}$/);
	}
//-------------------------------------/


// Check E-mail value
//-------------------------------------\
function checkEmail(str) {
	return !!str.match(/^[\w\-\.]+@([\w\-]+\.)+\w+$/);
	}
//-------------------------------------/
 

// Check date and get its parts
//-------------------------------------\
function getDate(str,format) {
	if (format==null) format=W.DATE_FORMAT;
	var mlen=[31,28,31,30,31,30,31,31,30,31,30,31];
	var l=str.length;
	var dd=str.substr(0,2);
	var mm=str.substr(3,2);
	var yy=str.substr(6,4);
	if (format) { var tmp=dd; dd=mm; mm=tmp; }
	var d=checkInt(dd);
	var m=checkInt(mm);
	var y=checkInt(yy);
	var ml=mlen[m-1]+1+((m==2 && (y%400==0 || (y%4==0 && y%100!=0))) ? 1 : 0);
	return (l==10 && str.charAt(2)=="." && str.charAt(5)=="." && d && d<ml && m && m<13 && y) ? 
			[yy,mm,dd] : false;
	}
//-------------------------------------/


// Check time (hh:mm) and get its parts
//-------------------------------------\
function getTime(str) {
	var l=str.length;
	var hh=str.substr(0,2);
	var mm=str.substr(3,2);
	var h=checkInt(hh);
	var m=checkInt(mm);
	return  (l==5 && str.charAt(2)==":" && h!=null && h<24 && m!=null && m<60) ?
			[hh,mm] : false;
	}
//-------------------------------------/


// Compare dates
//-------------------------------------\
function cmpDate(str1,str2,format) {
	var date1=getDate(str1,format);
	var date2=getDate(str2,format);
	if (!date1) return -1;
	if (!date2) return -2;
	date1=eval(date1.join(''));
	date2=eval(date2.join(''));
	return (date2>date1) ? 2 : ((date1>date2) ? 1 : 0);
	}
//-------------------------------------/


// Compare times
//-------------------------------------\
function cmpTime(str1,str2) {
	var time1=getTime(str1);
	var time2=getTime(str2);
	if (!time1) return -1;
	if (!time2) return -2;
	time1=eval(time1.join(''));
	time2=eval(time2.join(''));
	return (time2>time1) ? 2 : ((time1>time2) ? 1 : 0);
	}
//-------------------------------------/


// Get dd.mm.yyyy/mm.dd.yyyy string
//-------------------------------------\
function getDateStr(date,format) {
	date=date || (new Date);
	if (format==null) format=W.DATE_FORMAT;
	var dd=date.getDate();
	var mm=date.getMonth()+1;
	var yy=date.getYear();
	if (dd<10) dd="0"+dd;
	if (mm<10) mm="0"+mm;
	if (format) { var tmp=dd; dd=mm; mm=tmp; }
	return (""+dd+"."+mm+"."+yy);
	}
//-------------------------------------/


// Get hh:mm string
//-------------------------------------\
function getTimeStr(date) {
	date=date || (new Date);
	var hh=date.getHours();
	var mm=date.getMinutes();
	if (hh<10) hh="0"+hh;
	if (mm<10) mm="0"+mm;
	return (""+hh+":"+mm);
	}
//-------------------------------------/


// Get hh:mm string
//-------------------------------------\
function getFullYear(date) {
	date=date || (new Date);
	var y=date.getYear();
	return (y<1000) ? y+1900 : y;
	}
//-------------------------------------/

// Check if condition is true
//-------------------------------------\
function checkCond(cond,alertMessage,field) {
	if (!cond) {
		alert((alertMessage!=null) ? alertMessage : "Error!");
		if (field) field.focus();
		return false;
		}
	return true;
	}
//-------------------------------------/


// Check if field is filled
//-------------------------------------\
function checkFilled(field,alertMessage) {
	return checkCond(field.value.length,alertMessage,field)
	}
//-------------------------------------/

// Dump variable
//-------------------------------------\
function dump(val,pattern) {
	var s='';
	var t=typeof(val);
	if (val==null) s='null';
	else if (t=='function') s=t;
	else if (t!='object') s=val.toString();
	else {
		for (var i in val) {
			if (pattern && !i.match(pattern)) continue;
			try { s+=i+' : '+val[i]+'\n'; }
			catch (E) { s+=i+' : [EXCEPION]\n'; }
			}
		}
	alert(s);
	}
//-------------------------------------/


//-------------------------------------\
function in_array(val,arr,strict) {
	if (!strict && val!=null) val=''+val;
	for (var i in arr) {
		var tmp=arr[i];
		if (tmp==null) continue;
		if (strict ? (val===tmp) : (val==(''+tmp))) return true;
		}
	return false;
	}
//-------------------------------------/


// Get element
//-------------------------------------\
function getEl(el) {
	return (typeof(el)=='string') ? D.getElementById(el) : el;
	}
//-------------------------------------/


// Has class?
//-------------------------------------\
function hasClass(el,className) {
	el=getEl(el);
	if (!el) return;
	var re=new RegExp("\\b"+className+"\\b");
	return !!el.className.match(re);
	}
//-------------------------------------/

// Add class
//-------------------------------------\
function addClass(el,className) {
	el=getEl(el);
	if (!el) return;
	if (!hasClass(el,className)) el.className+=' '+className;
	}
//-------------------------------------/

// Remove class
//-------------------------------------\
function delClass(el,className) {
	el=getEl(el);
	if (!el) return;
	var re=new RegExp("\\b"+className+"\\b","g");
	el.className=el.className.replace(re,'').replace(/^\s+|\s+$|\s+(?=\s)/,'');
	}
//-------------------------------------/


// Show/hide using 'visibility'
//-------------------------------------\
function visibilitySwitch(el,on) {
	el=getEl(el);
	if (!el) return;
	var st=el.style;
	on=(on!=null) ? !!on : (st.visibility=='hidden');
	st.visibility=(on ? '' : 'hidden');
	return on;
	}
//-------------------------------------/

// Show/hide using 'display'
//-------------------------------------\
function displaySwitch(el,on) {
	el=getEl(el);
	if (!el) return;
	var st=el.style;
	on=(on!=null) ? !!on : (st.display=='none');
	st.display=(on ? '' : 'none');
	return on;
	}
//-------------------------------------/


// Get coordinates
//-------------------------------------\
function getCoords(el) {
	el=getEl(el);
	if (!el) return;
	if (el==BODY.parentNode) el=BODY;
	var x=0, y=0, w=0, h=0;
	if (el==BODY) {
		w=Math.max(BODY.clientWidth,BODY.scrollWidth,
					(HTML.clientWidth ? Math.max(HTML.clientWidth,HTML.scrollWidth) : 0));
		h=Math.max(BODY.clientHeight,BODY.scrollHeight,
					(HTML.clientHeight ? Math.max(HTML.clientHeight,HTML.scrollHeight) : 0));
		}
	else {
		for (var tmp=el; tmp; tmp=tmp.offsetParent) {
			x+=tmp.offsetLeft-((tmp!=el) ? tmp.scrollLeft : 0);
			y+=tmp.offsetTop-((tmp!=el) ? tmp.scrollTop : 0);
			}
		w=el.offsetWidth;
		h=el.offsetHeight;
		}
	var x2=x+w-1;
	var y2=y+h-1;
	var res=[x,y,x2,y2,w,h];
	res.x=x;
	res.y=y;
	res.x2=x2;
	res.y2=y2;
	res.w=w;
	res.h=h;
	return res;
	}
//-------------------------------------/


// Get nearest child
//-------------------------------------\
function getNearestChild(el,tagName) {
	el=getEl(el);
	if (!el) return;
	return (el.getElementsByTagName(tagName)[0] || null);
	}
//-------------------------------------/

// Get nearest parent
//-------------------------------------\
function getNearestParent(el,tagName) {
	el=getEl(el);
	if (!el) return;
	tagName=tagName.toUpperCase();
	var p=el;
	while (p=p.parentNode) { if (p.tagName==tagName) break; }
	return p;
	}
//-------------------------------------/


// Get value
//-------------------------------------\
function getValue(el) {
	el=getEl(el);
	if (!el) return;
	var t=el.type;
	if (in_array(t,['text','textarea','file'])) return el.value;
	if (in_array(t,['checkbox','radio'])) return el.checked ? el.value : null;
	if (t=='select-one') return (el.selectedIndex>=0) ? el.options[el.selectedIndex].value : null;
	if (t=='select-multiple') {
		var res=[],
			opts=el.options;
		for (var l=opts.length, i=0; i<l; i++) { if (opts[i].selected) res.push(opts[i].value); }
		return res.length ? res : null;
		}
	return;
	}
//-------------------------------------/


// Set value of select element
//-------------------------------------\
function setValue(el,val) {
	el=getEl(el);
	var opts=el && el.options;
	if (!opts || !opts.length || el.type!='select-one') return;
	var oldInd=el.selectedIndex;
	for (var l=opts.length, i=0; i<l; i++) { if (opts[i].value==val) break; }
	var ind=el.selectedIndex=(i!=l) ? i : 0;
	if (ind!=oldInd && el.onchange) el.onchange();
	return;
	}
//-------------------------------------/


// Set options of select element
//-------------------------------------\
function setOptions(el,arr,start) {
	el=getEl(el);
	var opts=el && el.options;
	if (!opts) return;
	arr=arr || {};
	start=Math.min((start || 0),opts.length);
	opts.length=start;
	for (var k in arr) {
		opts[start++]=new Option(arr[k],k);
		}
	el.selectedIndex=0;
	if (el.onchange) el.onchange();
	}
//-------------------------------------/

//-------------------------------------\
function makeSure(strong,question) {
	question=(question || 'Вы уверены?');
	if (strong) {
		var t1=(new Date).getTime();
		var res=((prompt(question+'\n(введите "Y" чтобы подтвердить)','')+'').toUpperCase()=='Y');
		var t2=(new Date).getTime();
		if ((t2-t1)>10) return res;
		}
	return confirm(question);
	}
//-------------------------------------/


// Show/hide block
//-------------------------------------\
function blockSwitch(el,on,clickEl,clickElOnClass) {
	el=getEl(el);
	if (!el) return;
	on=displaySwitch(el,on);
	if (clickEl && clickElOnClass) (on ? addClass : delClass)(clickEl,clickElOnClass);
	return on;
	}
//-------------------------------------/


// Show/hide popup
//-------------------------------------\
function popupSwitch(el,on) {
	el=getEl(el);
	if (!el) return;
	if (el.style.visibility=='hidden' && on!=false) { // Center
		var st=el.style,
			iEl=el.getElementsByTagName('IFRAME')[0],
			c=getCoords(el),
			ci=getCoords(iEl),
			w=HTML.clientWidth,
			h=HTML.clientHeight;
		var tmp=iEl || st;
		if (c.w>(w-10)) tmp.width=w-10-(iEl ? c.w-ci.w : 0);
		if (c.h>(h-10)) tmp.height=h-10-(iEl ? c.h-ci.h : 0);
		c=getCoords(el);
		st.left=Math.floor((w-c.w)/2)+'px';
		st.top=Math.floor((h-c.h)/2)+'px';
		}
	return visibilitySwitch('BodyShadowLayer',visibilitySwitch(el,on));
	}
//-------------------------------------/


// Main menu switching
//-------------------------------------\
function menuSwitch(n,immediate) {
	var F=arguments.callee;
	if (F._defN==null) {
		F._menu=getEl('Menu').getElementsByTagName('TD');
		F._menu2=getEl('Menu2').getElementsByTagName('TR');
		for (var i=0, l=F._menu.length-1; i<l; i++) { if (F._menu[i].className=='curr') break; }
		F._currN=F._defN=i%l;
		}
	clearTimeout(F._t);
	if (n==null) {
		F._t=setTimeout("menuSwitch("+F._defN+",1);",600);
		return;
		}
	else if (!immediate) {
		F._t=setTimeout("menuSwitch("+n+",1);",300);
		return;
		}
	if (n==F._currN) return;
	F._menu[F._currN].className=(F._currN==F._defN) ? 'currOut' : '';
	F._menu[n].className=(n==F._defN) ? 'curr' : 'over';
	F._menu2[F._currN].style.display='none';
	F._menu2[n].style.display='';
	F._currN=n;
	}
//-------------------------------------/


// Region selection functions
//-------------------------------------\
function selectRegion(idOrInputEl,onlyTowns,unsetText) {
	var F=arguments.callee;
	var useJS=(idOrInputEl.tagName!=null);
	var inputEl=useJS ? idOrInputEl : null;
	var id=useJS ? inputEl.value : idOrInputEl;
	var el=getEl('SelectRegionPopup_'+(useJS ? 1 : 0)+'_'+(onlyTowns ? 1 : 0));
	if (F._lastEl) popupSwitch(F._lastEl,false);
	F._lastEl=el;
	F._lastInputEl=inputEl;
	if (el.style.visibility=='hidden') {
		var w=el.getElementsByTagName('IFRAME')[0].contentWindow;
		w.setUnsetText(unsetText);
		w.setCurrentRegion(id);
		}
	popupSwitch(el);
	}

function selectRegionAccept(id,nameHtml) {
	var F0=selectRegion;
	var inputEl=F0._lastInputEl;
	if (!inputEl) return;
	inputEl.value=(id || inputEl.getAttribute('x_emptyValue') || '');
	var el=inputEl.nextSibling;
	el.innerHTML=((id && nameHtml) || el.getAttribute('x_emptyValue') || '&#150;');
	if (inputEl.onchange) inputEl.onchange();
	popupSwitch(F0._lastEl,false);
	}
//-------------------------------------/


// Most common object modification functions
//-------------------------------------\
function delObj(id,forceYes) {
	if (forceYes || makeSure(true)) location.href="?action=delete&ID="+id+"&"+(W.UrlParamsStrP || '');
	}

function modObj(url,title) {
	var F=arguments.callee;
	var el=getEl('ModObjPopup');
	el.getElementsByTagName('DIV')[1].innerHTML=(title || "Редактирование...");
	var iEl=el.getElementsByTagName('IFRAME')[0];
	iEl.src="javascript:'Загрузка...'";
	iEl.src=(url || "javascript:'error'");
	popupSwitch(el,true);
	}

function modObjAccept(id) {
	popupSwitch('ModObjPopup',false);
	location.href=(W.UrlFileBasenameP || '')+"?ModifyOK=1&"+(W.UrlParamsStrP || '');
	}

function modObjPopupClose() {
	var el=getEl('ModObjPopup');
	if (el.getElementsByTagName('IFRAME')[0].contentWindow.location.search.match(/[?&]ModifyOK=1[&$]/))
		location.href=(W.UrlFileBasenameP || '')+"?"+(W.UrlParamsStrP || '');
	else popupSwitch(el,false);
	}
function modObjPopupClose2() {
	var el=getEl('ModObjPopup');
	if (el.getElementsByTagName('IFRAME')[0].contentWindow.location.search.match(/[?&]ModifyOK=1[&$]/))
		location.href=location.pathname+"?"+(W.UrlParamsStrP || '');
	else popupSwitch(el,false);
	}

function delObjImage(imgId) {
	if (makeSure()) location.href="?action=deleteImage&imgID="+imgId;
	}

function modObjImageAccept(imgId) {
	popupSwitch('ModObjPopup',false);
	location.href=location.pathname+"?ModifyImageOK=1&"+(W.UrlParamsStrP || '');
	}
//-------------------------------------/


// Search form functions
//-------------------------------------\
function setSearchObjectFormTarget(f) {
	f.action=SITE_ROOT_R+'/db-'+SEARCH_OBJECT_OPERATIONS_URL[getValue(f.so_oper)]+'-'+SEARCH_OBJECT_TYPES_URL[getValue(f.so_type)];
	}

function changeSearchObjectFormReg(f) {
	var els=f.elements;

	var e_r=els['so_reg'], v_r=e_r.value;

	var dists=REGION_DISTRICTS[v_r || 0];
	var html='';
	for (var i in dists) {
		html+="<input type=checkbox name='so_reg2[]' id='so_reg2_"+i+"'  value='"+i+"' onClick='changeSearchObjectFormReg2(this.form);'> "+
				"<label for='so_reg2_"+i+"'>"+dists[i]+"</label><br>";
		}
	getEl('SODistrictSelect').innerHTML=html;
	changeSearchObjectFormReg2(f,true);
//	setOptions(f.elements['so_reg2'],dists,1);
	displaySwitch('SODistrict',!!dists);
	}

function changeSearchObjectFormReg2(f,unset) {
	var dists=REGION_DISTRICTS[f.elements['so_reg'].value],
		els=f.elements['so_reg2[]'] || [];
	if (els.length==null) els=[els];

	var html=[];
	for (var i=0, l=els.length; i<l; i++) {
		var el=els[i];
		if (unset) el.checked=false;
		if (!el.checked) continue;
		var tmp=dists[el.value];
		html.push("<span title='"+tmp+"'>"+tmp.replace(' ','').substr(0,3)+"</span>");
		}
	html=html.join(', ');
	if (unset && getEl('SODistrictSelectBlock').style.display!='none') getEl('SODistrictSelectLink').onclick();
	var tmpEl=getEl('SODistrictSelectText');
	tmpEl.innerHTML=html || tmpEl.getAttribute('x_emptyValue') || '&#150;';
	}

function changeSearchObjectFormOperation(f) {
	setSearchObjectFormTarget(f);

	var els=f.elements;

	var e_o=els['so_oper'], v_o=e_o && getValue(e_o);

	var is_rent=(v_o==2),
		is_rent_dh=in_array(v_o,[21,22]),
		e_t=els['so_type'],
		opts=e_t.options,
		ind=e_t.selectedIndex;
	for (var i=0, l=opts.length; i<l; i++) {
		var opt=opts[i],
			v=opt.value;
		var tmp=opt.disabled=(is_rent && v=='20') || (is_rent_dh && !in_array(v,[1,2,3]));
		if (tmp && i==ind) { e_t.selectedIndex=0; if (e_t.onchange) e_t.onchange(); }
		}

	_setSearchObjectFormPrices(f);
	}

function changeSearchObjectFormType(f) {
	setSearchObjectFormTarget(f);

	var els=f.elements;

	var	e_t=els['so_type'], v_t=e_t && getValue(e_t);

	var sts=OBJECT_SUBTYPES[v_t];
	var html='';
	for (var i in sts) {
		html+="<input type=checkbox name='so_stype[]' id='so_stype_"+i+"'  value='"+i+"' onClick='changeSearchObjectFormSubtype(this.form);'> "+
				"<label for='so_stype_"+i+"'>"+sts[i]+"</label><br>";
		}
	getEl('SOSubtypeSelect').innerHTML=html;
	changeSearchObjectFormSubtype(f,true);
//	setOptions(els['so_stype'],sts,1);
	displaySwitch('SOSubtype',!!sts);
	displaySwitch('SORooms',in_array(v_t,[1,20]));
	displaySwitch('SOFloor',in_array(v_t,[1,2]));
	displaySwitch('SOST',in_array(v_t,[1,2,3,10]));
	displaySwitch('SOSL',in_array(v_t,[1,3]));
	displaySwitch('SOSK',in_array(v_t,[1,2,3]));
	displaySwitch('SOSA',in_array(v_t,[3,4]));
	displaySwitch('SOMaterial',in_array(v_t,[1,2,3,20]));
	displaySwitch('SONew',in_array(v_t,[1]));

	_setSearchObjectFormPrices(f);
	}

function changeSearchObjectFormSubtype(f,unset) {
	var tmp=getValue(f.elements['so_type']),
		sts=OBJECT_SUBTYPES[tmp],
		sts_a=OBJECT_SUBTYPES_ABBR[tmp],
		els=f.elements['so_stype[]'] || [];
	if (els.length==null) els=[els];

	var html=[];
	for (var i=0, l=els.length; i<l; i++) {
		var el=els[i];
		if (unset) el.checked=false;
		if (!el.checked) continue;
		html.push("<span title='"+sts[el.value]+"'>"+sts_a[el.value]+"</span>");
		}
	html=html.join(', ');
	if (unset && getEl('SOSubtypeSelectBlock').style.display!='none') getEl('SOSubtypeSelectLink').onclick();
	var tmpEl=getEl('SOSubtypeSelectText');
	tmpEl.innerHTML=html || tmpEl.getAttribute('x_emptyValue') || '&#150;';
	}

function _setSearchObjectFormPrices(f) {
	var els=f.elements;

	var e_o=els['so_oper'], v_o=e_o && getValue(e_o),
		e_t=els['so_type'], v_t=e_t && getValue(e_t);

	var is_rent=(v_o==2),
		is_rent_d=(v_o==21),
		is_rent_h=(v_o==22);
	displaySwitch('SOPriceTitApt',in_array(v_t,[20]));
	displaySwitch('SOPriceTitMonth',is_rent);
	displaySwitch('SOPriceTitDay',is_rent_d);
	displaySwitch('SOPriceTitHour',is_rent_h);

	var el=els['so_price_unit'],
		val=getValue(el);
	setOptions(el,in_array(v_t,[4]) ? PRICE_UNITS_SA : (in_array(v_t,[10,20]) ? PRICE_UNITS_S : PRICE_UNITS_BASE));
	setValue(el,val);
	}

function changeSearchObjectFormRooms(f,num) {
	var els=f.elements;

	var e=els['so_rooms'], e2=els['so_rooms2'];

	if (e2.selectedIndex && e.selectedIndex>e2.selectedIndex) {
		if (num!=2) e2.selectedIndex=e.selectedIndex;
		else e.selectedIndex=e2.selectedIndex;
		}
	}

function changeSearchObjectFormFloor(f,num) {
	var els=f.elements;

	var e=els['so_floor'], e2=els['so_floor2'];

	if (e2.selectedIndex && e.selectedIndex>e2.selectedIndex) {
		if (num!=2) e2.selectedIndex=e.selectedIndex;
		else e.selectedIndex=e2.selectedIndex;
		}
	}
//-------------------------------------/


// Yandex Maps interface object
//-------------------------------------\
function YandexMap(el,bounds,showBoundsPlacemark) { // bounds - "search string" | [latitude,longitude,scale] | YandexMaps bounds object or object having getBounds() method
	if (!YMaps) return false;

	el=getEl(el);
	if (!el) return false;

	var map=new YMaps.Map(el);
	if (!map) return false;

	map.addControl(new YMaps.TypeControl());
	map.addControl(new YMaps.Zoom());
	map.addControl(new YMaps.ToolBar());
	map.addControl(new YMaps.MiniMap());
	map.addControl(new YMaps.ScaleLine());
	map.enableScrollZoom();

	this.element=el;
	this.map=map;
	this.searchBounds=null;
	this.placemarks=[];

	bounds=bounds || [49.123655,55.783796,10]; //"Россия, республика Татарстан, Казань";
	this.setBounds(bounds,true,showBoundsPlacemark);
	}

YandexMap.prototype.setBounds=function (bounds,updateSearchBounds,showBoundsPlacemark) { // bounds - see YandexMap()
	var map=this.map;
	if (bounds) {
		if (typeof(bounds)=='string') this.searchObject(bounds,!showBoundsPlacemark,updateSearchBounds);
		else if (bounds instanceof Array) map.setCenter(new YMaps.GeoPoint(bounds[0],bounds[1]),bounds[2]);
		else map.setBounds((typeof(bounds.getBounds)=='function') ? bounds.getBounds() : bounds);
		}
	if (updateSearchBounds) this.searchBounds=map.getBounds();
	}

YandexMap.prototype.searchObject=function (text,noPlacemark,updateSearchBounds) {
	this.search(text,[function (result) { this._searchObjectResult(result,noPlacemark,updateSearchBounds); },this],1,0,true);
	}

YandexMap.prototype._searchObjectResult=function (result,noPlacemark,updateSearchBounds) {
	if (!(result instanceof Array)) return;
	var pm=result[0];
	this.removePlacemarks();
	if (!noPlacemark) this.addPlacemark(pm);
	this.setBounds(pm,updateSearchBounds);
	}

YandexMap.prototype.search=function (text,callback,results,skip,globalSearch) { // callback - function | [function,thisObject]
	if (!text.length) return false;
	results = results || 100;
	skip = skip || 0;
	var geocoder = new YMaps.Geocoder(text,{
			results : results,
			skip : skip,
			boundedBy : (globalSearch ? null : this.searchBounds),
			strictBounds : (globalSearch ? 0 : 1)
			});
	YMaps.Events.observe(geocoder,geocoder.Events.Load,function (geocoder) {
		this._searchResult(geocoder,callback);
		},this);
	YMaps.Events.observe(geocoder,geocoder.Events.Fault,this._searchError,this);
	}

YandexMap.prototype._searchResult=function (geocoder,callback) {
	var res=false,
		l=geocoder.length();
	if (geocoder.suggest) res=geocoder.suggest.replace(/<(\/?)fix>/g,"<$1b>");
	else if (l) {
		res=[];
		for (var i=0; i<l; i++) {
			var pm=geocoder.get(i),
				sep=', ',
				pieces=(pm.text || '').split(sep),
				ind=(pm.kind=='house') ? -2 : -1;
			pm.name=pieces.slice(ind).join(sep);
			pm.description=pieces.slice(0,ind).join(sep);
			pm.setBalloonContent("<b>"+pm.name+"</b><div>"+pm.description+"</div>");
			res[i]=pm;
			}
		res.found=geocoder.found;
		}
	if (callback) {
		if (callback instanceof Array) callback[0].call(callback[1],res);
		else callback(res);
		}
	}

YandexMap.prototype._searchError=function (geocoder,error) {
	alert("Произошла ошибка: "+error);
	}

YandexMap.prototype.removePlacemarks=function () {
	var map=this.map,
		pms=this.placemarks;
	for (var pm; pm=pms.pop();) map.removeOverlay(pm);
	}

YandexMap.prototype.addPlacemark=function (pm,removeOld) {
	var map=this.map;
	if (removeOld) this.removePlacemarks();
	this.placemarks.push(pm);
	map.addOverlay(pm);
	map.setBounds(pm.getBounds());
	pm.openBalloon();
	}
//-------------------------------------/

