/*!
 * Скрипты Est-a-tet
 * Иван Петропольский, <jscss.ru@gmail.com>
 **/
$(function(){
	var
		W = window,
		D = document,
		$W = $(W),
		g_map = null;

	// Короткое 'undefined' (для сжатия)
	W.UNDEF = 'undefined';

	// Преобразование цены в тыс. и млн.
	W.pf = function(val, dec) {
		var
			v = parseFloat((val + '').replace(',', '.'), 10) || 0,
			a = (v >= 1000000)
				? [1000000, ' млн.']
				: (v >= 1000)
					? [1000, ' тыс.']
					: [1, ''];
		v = (v / a[0])
			.toFixed(dec || 1)
			.toString()
			.replace('.0', '')
			.replace('.', ',');
		return v + a[1];
	}

	// Склонение
	W.sklon = function(val, s1, s2, s3) {
		var
			v = parseFloat((val + '').replace(',', '.'), 10) || 0;
		if (v != Math.floor(v)) {
			return s2;
		}
		if (Math.floor((v % 100) / 10) == 1) {
			return s3 || s2;
		}
		var
			l = v % 10;
		if (l==2 || l==3 || l==4) {
			return s2;
		}
		if (l==1) {
			return s1;
		}
		return s3 || s2;
	}

	// true, если объект пуст (добавлено в jQuery 1.4)
	$.isEmptyObject = function (obj) {
		for (var name in obj) {
			return false;
		}
		return true;
	}

	// Новости
	var
		items = $('#news > ul > li').each(function(i) {
			if (i) $(this).css({'opacity': 0, 'display': 'block', 'z-index': 0});
		});
	if (items.length) {
		var slider = $('<div class="slider"><b /><i /><span><a class="ui-slider-handle" /></span></div>'),
			fn = function(e, ui) {
				if (ui.value == n) return;
				items.eq(n).stop().css('z-index', 0).animate({'opacity': 0}, 300);
				items.eq(ui.value).stop().css('z-index', 1).animate({'opacity': 1}, 300);
				n = ui.value;
			},
			n = 0;
		$('#news ul').after(slider);
		$('#news .slider + div').css('margin-top', 3);
		slider.slider({
			value: 0,
			min: 0,
			max: items.length - 1,
			stepping: 1,
			slide: fn,
			change: fn
		});
		$('#news').mousewheel(function(e, offset) {
			if (W.opera) offset *= -1;
			slider.slider('value', slider.slider('value') + (offset > 0 ? -1 : 1));
			if (e.preventDefault) e.preventDefault();
			e.returnValue = false;
			return false;
		});
	}

	// Спецпредложения
	var special = D.getElementById('special');
	if (special) {
		var specials = $('#special li');
		specials.parent = $('#special');
		$.extend(specials, {
			'cursor': ((specials.index(specials.parent.find('li.active')) + 1) || 1) - 1,
			'plink': specials.parent.find('a.prev'),
			'nlink': specials.parent.find('a.next'),
			'link': specials.parent.find('h2 a'),
			'bw_time': 2000,
			'ch_time': 500,
			'toNext': function(e) {
				if (this.cursor + 1 < this.length) {
					var source = this[this.cursor], target = this[this.cursor+++1];
					$(target).add(target.img).add(target.a).add(target.h3).stop().animate({'opacity': 1}, this.ch_time);
					$(source.a).add(source.h3).stop().animate({'opacity': 0}, this.ch_time, function(target) {
						return function() {
							$(target.bw).stop().animate({'opacity': 1}, 250);
							$(target.img).stop().animate({'opacity': 0}, specials.bw_time);
						}
					}(target));
				}
				return this.process(e);
			},
			'toPrev': function(e) {
				if (this.cursor > 0) {
					var source = this[this.cursor], target = this[this.cursor---1];
					$(source).add(source.bw).add(source.img).add(source.a).add(source.h3).stop().animate({'opacity': 0}, this.ch_time);
					$(target.a).add(target.img).add(target.h3).stop().animate({'opacity': 1}, this.ch_time, function(target) {
						return function() {
							$(target.bw).stop().animate({'opacity': 1}, 250);
							$(target.img).stop().animate({'opacity': 0}, specials.bw_time);
						}
					}(target));
				}
				return this.process(e);
			},
			'process': function(e) {
				this.link.attr({
					'href': this[this.cursor].a.attr('href'),
					'title': this.link.title = this[this.cursor].a.title
				});
				if (this.b) this.b.stop().animate({'height': $(specials[specials.cursor].h3).height()}, this.ch_time);
				this.plink[this.cursor == 0 ? 'addClass' : 'removeClass']('first');
				this.nlink[this.cursor == this.length - 1 ? 'addClass' : 'removeClass']('last');
				if (e.preventDefault) e.preventDefault();
				e.returnValue = false;
				return false;
			}
		});
		specials.plink.click(function(e) { return specials.toPrev(e); });
		specials.nlink.click(function(e) { return specials.toNext(e); });
		specials.parent.mousewheel(function(e, offset) {
			if (W.opera) offset *= -1;
			if (offset > 0) specials.toPrev(e);
			else specials.toNext(e);
		});
		specials.each(function(index, item) {
			item.zIndex = 3*index + 1;
			specials.parent.append(item.h3 = $(item).find('h3'));
			specials.parent.append(item.a = $(item).find('a'));
			if (index != specials.cursor) {
				$(item.h3).add($(item.a)).css('opacity', 0);
				$(item).css({
					'z-index': item.zIndex,
					'opacity': 0
				}).show();
			}
			item.img = $(item).find('img').css('z-index', 3*index + 3);
			item.bw = $('<img class="bw" src="' + item.a.attr('rel') + '" />').insertBefore(item.img).css({'opacity': 0, 'z-index': 3*index + 2});
		});
		specials.parent.append(specials.b = $('<b></b>').css({
			'opacity': 0.5,
			'height': $(specials[specials.cursor].h3).height()
		}).show());
		specials.parent.addClass('nobg');
		$(specials[specials.cursor].bw).css('opacity', 1);
		$(specials[specials.cursor].img).animate({'opacity': 0}, specials.bw_time);
		specials.link.attr({
			'href': specials[specials.cursor].a.attr('href'),
			'title': specials.link.title = specials[specials.cursor].a.title
		});
	}

	// Календарь
	if ($('.monthes').length) {
		var w = 0,
			m = ($('.monthes .cbox li').index($('.monthes .cbox li.active')) || 0) + 1,
			$dec = $('.monthes .cbox li:last'),
			mslider = $('<div class="slider"><b /><i /><span><a class="ui-slider-handle" /></span></div>')
				.css('width', $dec[0].offsetLeft + $dec[0].offsetWidth - 60),
			fn = function(e, ui) {
				if (ui.value == m) return;
				$('.monthes .cbox li:nth-child(' + m + ')').removeClass('active');
				$('.monthes .cbox li:nth-child(' + ui.value + ')').addClass('active');
				m = ui.value;
			};
		$('.monthes .cbox ul').before(mslider).css({marginTop: 7, paddingTop: 0});
		mslider.slider({
			value: m,
			min: 1,
			max: 12,
			stepping: 1,
			slide: fn,
			stop: function(e, ui) {
				W.location = $('.monthes .cbox li:nth-child(' + ui.value + ') a').attr('href');
			}
		});
	}

	// Схема проезда
	$(".office_map").each(function(){
		var om_block = $('<div class="om_block"><h3>' + $(this).attr('title') + '</h3></div>').css('visibility', 'hidden');
		om_block.css('background-image', 'url('+$(this).attr('rel')+')');
		$(document.body).append(om_block.click(function() {$(this).css('visibility', 'hidden'); }));
		$(this).click(function(e) {
			$('.om_block').css('visibility', 'hidden');
			om_block.css('visibility', 'visible');
			if (e.preventDefault) e.preventDefault();
			e.returnValue = false;
			return false;
		});
	});

	if ($('#office_map').length) {
		var om_block = $('<div id="om_block"><h3>' + $('#office_map').attr('title') + '</h3></div>').css('visibility', 'hidden');
		$(document.body).append(om_block.click(function() {$('#om_block').css('visibility', 'hidden'); }));
		$('#office_map').click(function(e) {
			$('#om_block2').css('visibility', 'hidden');
			$('#om_block').css('visibility', 'visible');
			if (e.preventDefault) e.preventDefault();
			e.returnValue = false;
			return false;
		});
	}

	if ($('#office_map2').length) {
		var om_block = $('<div id="om_block2"><h3>' + $('#office_map2').attr('title') + '</h3></div>').css('visibility', 'hidden');
		$(document.body).append(om_block.click(function() {$('#om_block2').css('visibility', 'hidden'); }));
		$('#office_map2').click(function(e) {
			$('#om_block').css('visibility', 'hidden');
			$('#om_block2').css('visibility', 'visible');
			if (e.preventDefault) e.preventDefault();
			e.returnValue = false;
			return false;
		});
	}

	// Добавить в закладки
	$('.bookmark').click(function(e) {
		var url = D.location,
			title = D.title,
			e = e || W.event;
		if ($.browser.msie) W.external.AddFavorite(url,title);
		else if ($.browser.opera) {
			this.href = url;
			this.rel = "sidebar";
			this.title = url+','+title;
			return true;
		}
		else if ($.browser.mozilla) W.sidebar.addPanel(title,url,"");
		else alert("Чтобы добавить страницу в избранное, нажмите Ctrl+D.");
		return false;
	});

	// Интерактивный блок на главной
	/*
	var promo = D.getElementById('promo');
	if (promo) {
		(promo.images = $(promo).find('img')).not('.active').css({'opacity': 0, 'display': 'inline'});
		promo.active = ((promo.images.index($(promo).find('img.active')) + 1) || 1) - 1;
		promo.update = function(skip) {
			if (!skip) {
				var a = promo.images[promo.active],
					n = (promo.active + 1 < promo.images.length) ? promo.active + 1 : 0,
					b = promo.images[n];
				$(b).css({'z-index': 1}).animate({'opacity': 1}, 100);
				$(a).css('z-index', 2).animate({'opacity': 0}, 2000, function(el) {
					return function() {
						$(el).css('z-index', 0);
					}
				}(a));
				promo.active = n;
			}
			W.setTimeout(promo.update, 7500)
		}
		promo.update(true);
	}
	/**/

	// О компании на главной
	var about = D.getElementById('about');
	if (about) {
		about.ul = $(about).find('ul');
		about.items = about.ul.find('li').each(function(i) {
			if (i) $(this).css({'opacity': 0, 'display': 'block', 'z-index': 0});
		});
		if (about.items.length) {
			var fn = function(e, ui) {
				if (ui.value != about.n) {
					$(about.items[about.n]).stop().css('z-index', 0).animate({'opacity': 0}, 300);
					$(about.items[ui.value]).stop().css('z-index', 1).animate({'opacity': 1}, 300);
					about.n = ui.value;
				}
			};
			about.slider = $('<div class="slider"><b /><i /><span><a class="ui-slider-handle" /></span></div>');
			about.n = 0;
			about.ul.after(about.slider);
			about.slider.slider({
				value: 0,
				min: 0,
				max: about.items.length - 1,
				stepping: 1,
				slide: fn,
				change: fn
			});
			$(about).mousewheel(function(e, offset) {
				if (W.opera) offset *= -1;
				about.slider.slider('value', about.slider.slider('value') + (offset > 0 ? -1 : 1));
				if (e.preventDefault) e.preventDefault();
				e.returnValue = false;
				return false;
			});
		}
	}

	// Спецпредложения на главной
	var fly = document.getElementById('specials');
	if (fly) {
		fly.items = $(fly).find('li').not('.i5').each(function(index, item) { // для всех кроме кнопки "обновить"
			item.index = index;
			item.h3 = $(item).find('h3');
			item.a = $(item).find('a');
			item.obj = {
				'title': $(item.h3).text(),
				'href': $(item.a).attr('href')
			}
			item.img = $(item).find('img');
			if (!index) {
				fly.big = item;
				$(fly).append(fly.a = $('<a></a>').attr({'href': item.obj.href, 'title': item.obj.title}).addClass('clone'));
				item.obj.img = $(item.img).attr('src');
				item.obj.preview = $(item.a).attr('rel');
				item.strong = $(item).find('strong').addClass('clone').appendTo(fly.a);
				item.container = $(item.strong).find('span span');
				item.obj.descr = $(item.container).text();
				$(item).css('z-index', 1);
				item.img2 = $('<img>').attr('src', item.obj.preview).css({'position': 'absolute', 'top': -2000, 'visibility': 'hidden'}).insertAfter(item.img);
			}
			else {
				item.obj.img = $(item.a).attr('rel');
				item.obj.preview = $(item.img).attr('src');
				item.obj.descr = $(item.a).find('span').text();
				item.img2 = $('<img>').attr('src', item.obj.img).css({'position': 'absolute', 'top': -2000, 'visibility': 'hidden'}).insertBefore(item.img);
			}
		});
		fly.active = 0;
		fly.time_fly = 200;
		fly.time_fade = 500;
		fly.select = function(index) {
			if (fly.busy) return false;
			fly.busy = true;
			var item = this.items[index];
			var
				stealth = $(item.img).clone().appendTo(item).css('z-index', 3),
				p1 = $(item.img).offset(),
				p2 = $(fly.big.img).offset();
			item.img.attr({'src': fly.big.obj.preview, 'alt': fly.big.obj.descr});
			item.h3.html(fly.big.obj.title);
			$(item.a).attr({'href': fly.big.obj.href, 'title': fly.big.obj.descr});
			$(stealth).animate({
				'width': 281,
				'height': 281,
				'left': p2.left-p1.left+$(item.img).position().left,
				'top': p2.top-p1.top+$(item.img).position().top
			}, fly.time_fly, 'swing', function(item) {
				return function() {
					$(fly.big.h3).html(item.obj.title);
					$(fly.big.container).html(item.obj.descr);
					$(fly.big.img).attr({'src': item.obj.img, 'alt': item.obj.descr});
					$(fly.big.a).attr({'href': item.obj.href, 'title': item.obj.descr});
					$(fly.a).attr({'href': item.obj.href, 'title': item.obj.descr});
					$(this).animate({'opacity': 0}, fly.time_fade, function(item) {
						return function() {
							var tmp = item.obj;
							item.obj = fly.big.obj;
							fly.big.obj = tmp;
							$(this).remove();
							fly.busy = false;
						}
					}(item));
				}
			}(item));
		}
		$(fly.items).not('.i1').click(function(e) {
			fly.select(this.index);
			if (e.preventDefault) e.preventDefault();
			e.returnValue = false;
			return false;
		});
		$('#specials li.i5 a').click(function(){
			$.getJSON('/specs-js.php?'+Math.random(), {cache: false}, function(json) {  // загрузку JSON данных 
				houses_list = json.houses; // список загруженный из JSON
				var houses_obj = document.getElementById('specials');
				if (houses_obj) {
					houses_obj.items = $(houses_obj).find('li').not('.i5').each(function(index, item) { // для всех кроме кнопки "обновить"
						item.index = index;
						item.obj.title = houses_list[index].n;
						item.obj.descr = houses_list[index].d;
						item.obj.href = houses_list[index].d1;
						$(item).find('h3').html(item.obj.title);
						if (typeof houses_list[index] !== UNDEF) {
							if (index == 0) {
								item.aclone = $(houses_obj).find('a.clone');
								$(item.aclone).attr ({'href': item.obj.href, 'title': item.obj.descr});
								$(item.aclone).find('strong.clone span span').text(item.obj.descr);
								item.obj.preview = '/showobject.php?id=' + houses_list[index].f2;
								item.obj.img = '/showobject.php?id=' + houses_list[index].f1;
								$(item.img).attr({'src': item.obj.img, 'alt': item.obj.descr});
								$(item.a).attr({'href': item.obj.href, 'rel': item.obj.preview, 'title': item.obj.descr});
								$(item.img2).attr({'src': item.obj.preview});
							} else {
								item.strong = $(item).find('strong');
								$(item.strong).find('span').html(item.obj.descr);
								item.obj.preview = '/showobject.php?id=' + houses_list[index].f2;
								item.obj.img = '/showobject.php?id=' + houses_list[index].f1;
								$(item.img).attr({'src': item.obj.preview, 'alt': item.obj.descr});
								$(item.a).attr({'href': item.obj.href, 'rel': item.obj.img, 'title': item.obj.descr})
								$(item.img2).attr({'src': item.obj.img});
							}
						}
					});
				}
			});
			return false;
		});
	}

	// Раскрывающийся список
	var $slide = $('.slide');
	if ($slide.length) {
		$slide.each(function(index, item) {
			var
				$this = $(this);
			if ($this.hasClass('slide-button')) {
				var
					$open = $('<span class="open">Показать подробную информацию</span>'),
					$close = $('<span class="close">Скрыть подробную информацию</span>').hide(),
					$a = $('<a class="button" href=""/>')
						.append($open)
						.append($close),
					$button = $('<div class="button_box slide-button"/>')
						.append($a)
						.css('float', 'right')
						.data('closed', true)
						.data('$slide', $this)
						.insertBefore($this);
				$open.add($close).width(Math.max($open.width(), $close.width()));
				$button.click(function() {
					var
						$this = $(this),
						closed = $this.data('closed');
					$this.data('$slide').find('li').each(function(index, item) {
						var
							$this = $(this);
						if ($this.hasClass('active') != closed) {
							$('h3 a, h4 a', $this).click();
						}
					});
					$this.data('closed', !closed);
					$open.css('display', !closed ? 'block' : 'none');
					$close.css('display', closed ? 'block' : 'none');
					return false;
				});
			}
		});
		$('h3 a, h4 a', $slide).click(function(event) {
			var
				$li = $(this).parents('li');
			$('div:first', $li)
				.css({overflow: 'hidden', position: 'relative'})
				.slideToggle($li.hasClass('active'), function() {
					$(this).css({position: 'static'});
				});
				$li.toggleClass('active');
			return false;
		});
	}

	// Просмотр фотографий
	$('a[rel*=lightbox]').colorbox();
	$('a[rel*=single]').colorbox({
		replaceInTitle: [
			[(/^.+: /), ''],
			['; ', '<br />']
		]
	});

	// Кнопка запуска галереи
	/*
		TODO Облегчить и сделать универсальнее
	*/
	$('a[rel*=gallery]').click(function() {
		var
			$img = $('a[rel*=lightbox]:first');
		if ($img.length) {
			$img.click();
		}
		return false;
	});

	// Всплывающая карта
	/*
		TODO Добавить окно к маркеру
		TODO Объединить скрипты создания маркеров и привязать к коду
		TODO Сделать выборку координат и маштаба из ссылки
	*/
	var
		$relmap = $('a[rel*=map]');
	if ($relmap.length) {
		$relmap.each(function(index, item) {
			var
				$this = $(item),
				$gmap = $('<div></div>')
					.appendTo($('<div/>')
						.hide()
						.appendTo($('body')))
					.height('100%');
			$this
				.data('gmap', $gmap)
				.colorbox({
					href: $gmap,
					inline: true,
					fixedHeight: 480,
					fixedWidth: 640,
					className: 'form gmap'
				},
				function($this) {
					return function() {
						if (typeof GBrowserIsCompatible == UNDEF) {
							return false;
						}
						if (GBrowserIsCompatible()) {
							var
								$gmap = $this.data('gmap');
							if (!$gmap.length) {
								return false;
							}
							var
								g_map,
								lat = parseFloat($('.geo .latitude', $this).text()),
								lng = parseFloat($('.geo .longitude', $this).text()),
								pos = new GLatLng(lat, lng);
							g_map = new GMap2($gmap[0]);
							g_map.setUIToDefault();
							g_map.setCenter(pos, 11);
							g_map.addOverlay(new GMarker(pos, {icon: icon(cat_id) }));
						}
					}
				}($this));
		});
	}
	var req_sent = false;
	var $a = $('a.order'),
		$form = $('form#order');
	if ($a.length && $form.length) {
		$a.colorbox({
			inline: true,
			href: '#order',
			disableArrows: true,
			className: 'form order'
		}).click(function(event) {
			var $this = $(this);

			// попробуем определить id объекта из ссылки
			var id_regex = new RegExp('\\bid_(\\d+)\\b', 'i');
			var re_arr = id_regex.exec($this.attr('rel'));
			var rel_re_id = (re_arr && (typeof(re_arr[1]) != 'undefined')) ? re_arr[1] : 0;

			var reality_id = 0;
			var part_size_id = 0;
			var info = $('div#obj_info');
			if ($(info).length > 0) {
				part_size_id = $(info).attr('rel1');
				if (part_size_id == '') {
					part_size_id = 0;
				}
				if (rel_re_id > 0) {
					reality_id = rel_re_id;
				} else {
					reality_id = $(info).attr('rel2');
				}
				if (reality_id == '') {
					reality_id = 0;
				}
			}
			$form.find('[name="name"]').val('');
			$form.find('[name="email"]').val('');
			$form.find('[name="tel"]').val('');
			$form.find('[name="text"]').val('');
			$form.find('[name="keystring"]').val('');
			req_sent = false;
			$('form#order #reality_id').val(reality_id);
			$('form#order #part_size_id').val(part_size_id);
		});
	}

	// Позиция элемента относительно родителя либо окна
	$.fn.rel_offset = function(parent) {
		var p = this[0],
			ret = {
				left: 0,
				top: 0
			};
		while (p && (!parent || !$(p).is(parent))) {
			ret.left += p.offsetLeft;
			ret.top += p.offsetTop;
			p = p.offsetParent;
		};
		ret.parent = p;
		return ret;
	}

	// определим cat_id текущего раздела каталога
	var
		$page = $('#page'),
		cat_id = 1;
	if ($page.length) {
		var
			re = new RegExp('\\bcat_(\\d+)\\b', 'i'),
			arr = re.exec($page[0].className),
			cat_id = (arr && (typeof(arr[1]) != UNDEF)) ? arr[1] : 1;
	}


	// Google Maps
	var
		// Иконка маркера
		icon = function() {
			var
				icon = new GIcon();
			icon.image = "/img/map_arrow_" + (cat_id || 1) + ".png";
			icon.iconSize = new GSize(28, 51); // размеры значка
			icon.iconAnchor = new GPoint(14, 51);
			icon.infoWindowAnchor = new GPoint(8, 17);
			return icon;
		},

		/*
			Создание ИнфоОкна.
			У Гугля непонятный гемор с размерами окон,
			поэтому подгонять приходится через жопу
		*/
		create_window = function(map, marker, $item) {

			/*
				Добавляем на карту скрытом виде, чтобы
				применились специфичные стили
			*/
			$item.css({
				visibility: 'hidden'
			})
			.appendTo($(map.getContainer()));

			// Принудительно задаем размеры
			$item.css({
				width: 300,
				height: $item.height()
			});

			// Открываем окно
			map.openInfoWindowHtml(marker.getLatLng(), $item[0], {
				onOpenFn: function(){
					var
						w = map.getInfoWindow();

					// Подравниваем
					w.reset(w.getPoint(), null, new GSize($item.width(), $item.height()), null, null);

					//Выводим содержимое
					$item.css({
						display: 'none',
						visibility: 'visible'
					});
					$item.fadeIn();
				}
			});
		},

		// Создание маркера
		m_icon = null,
		create_marker = function(map, id, obj) {
			var
				marker = new GMarker(new GLatLng(obj[0], obj[1]), {
					title: obj[2] || 'ID ' + id,
					icon: m_icon || (m_icon = icon())
				});
			marker.object_id = id;

			// Обработка нажатия
			GEvent.addListener(marker, 'click', function() {
				var
					id = this.object_id,
					items = $W.data('compiled'),
					$item,
					marker = this;

				/*
					Если есть возможность, клонируем уже созданный
					элемент из списка результатов
				*/
				if (items && ($item = items[id]) && $item.length) {
					create_window(map, marker, $item.clone());
				}
				/*
					Иначе загружаем JSON с сервера и компилируем
				*/
				else {
					$.get('/hsi.php', {id: id}, function(data) {
						if (!data || !data[0] || !data[0].object_id) {
							return false;
						}
						var
							items = $W.data('compiled') || {},
							$item = build_item(tmpl_results, data[0]);
						items[data[0].object_id] = $item;
						$W.data('compiled', items);
						create_window(map, marker, $item.clone());
					}, 'json');
				}
			});

			map.addOverlay(marker);
			return marker;
		},

		// Добавление маркеров
		add_markers = function(map, coords) {

			// Очистка
			map.clearOverlays();

			// Создание
			for (var id in coords) {
				create_marker(map, id, coords[id]);
			}
		};

	var
		$gmap_box = $('#gmap_box');

	// Проверяем наличие блока для карты и загруженных скриптов
	if ($gmap_box.length && GBrowserIsCompatible) {

		// Блок карты
		var
			$gmap = $('#gmap');
		if ($gmap.length) {
			// Подхватываем координаты
			var
				$geo = $('.geo', $gmap_box),
				lat = $('.latitude', $geo).text(),
				lng = $('.longitude', $geo).text(),
				zoom = (/\bzoom-(\d+)\b/i).exec($geo[0].className);
			if (lat && lng) {
				$gmap
					.data('lat', parseFloat(lat, 10))
					.data('lng', parseFloat(lng, 10))
					.data('zoom', zoom ? +zoom[1] : 11);
			}
		}
		else {
			$gmap_box.append($('<div id="gmap"/>'));
		}

		// Уголки или тени
		/*
			TODO Проверить на сервере в IE
		*/
		$gmap_box.append($('<div id="gmi1"/><div id="gmi2"/><div id="gmi3"/><div id="gmi4"/>'));

		// Инициализация карт
		$W.load(function() {
			if (GBrowserIsCompatible()) {
				g_map = new GMap2($gmap[0]);
				g_map.setUIToDefault();

				// Объекты в коде
				if (typeof houses != UNDEF) {
					var
						i = houses.length - 1,
						items = {},
						coords = {};
					for (; i >= 0; i--) {
						items[houses[i].object_id] = build_item('tmpl_results_item', houses[i]);
						coords[houses[i].object_id] = [houses[i].lat, houses[i].lng];
						houses[i].rub_format = pf(houses[i].price);
						houses[i].rub_m2_format = pf(houses[i].price_m2);
					}
					$W
						.data('items', items)
						.data('coords', coords)
						.data('compiled', items);
					g_map.setCenter (new GLatLng(houses[0].lat, houses[0].lng), $gmap.data('zoom') || 11);
					add_markers(g_map, coords);
				}

				// Координаты, найденные в коде, или Москва по умолчанию
				if (!g_map.getCenter()) {
					var
						lat = $gmap.data('lat') || 55.758032,
						lng = $gmap.data('lng') || 37.617188,
						zoom = $gmap.data('zoom') || 9;
					g_map.setCenter(new GLatLng(lat, lng), zoom);
				}

				// Карта загружена
				$W.data('gmap', g_map);
				$W.trigger('gmap_load');
			}
		});
		$W.unload(GUnload);

		// Закрывающая кнопка
		if ($gmap_box.hasClass('closable')) {
			var
				$toggle = $('<div class="toggle_map"><span class="close">Свернуть карту</span><span class="open">Развернуть карту</span></div>')
					.insertAfter($gmap_box);
				props = [
					{
						height: 0,
						marginBottom: -parseInt($toggle.css('marginTop'), 10)
					},
					{
						height: $gmap_box.height(),
						marginBottom: parseInt($gmap_box.css('marginBottom'))
					}
				];
			$toggle
				.click(function(event) {
					var
						$this = $(this).toggleClass('closed'),
						closed = $this.hasClass('closed'),
						fn = closed ? function() {
							$(this).css('visibility', 'hidden');
						} : function() {};
					$gmap_box
						.stop()
						.css('visibility', 'visible')
						.animate(props[+!closed], fn);
				});
		}
	}

	var
		// ID элемента с шаблоном
		tmpl_results = 'tmpl_results_item',
		
		usd = 0,
		eur = 0,
		
		/*
			Компиляция объекта
				data — объект;
				tmpl — строка шаблона или id элемента-шаблона.
		*/
		build_item = function(tmpl, data) {
			if (typeof tmpl != 'string') {
				return false;
			}
			var
				$el,
				$note;

			// Перевод в другие валюты
			data.usd = usd ? (data.price / usd) : 0;
			data.eur = eur ? (data.price / eur) : 0;
			if (data.price_m2) {
				data.usd_m2 = usd ? (data.price_m2 / usd) : 0;
				data.eur_m2 = eur ? (data.price_m2 / eur) : 0;
			}

			// Результат в виде объекта jQuery
			if (!($el = $.tmpl(tmpl, data))) {
				return false;
			}
			$el = $($el).data('sdata', data);

			// Кнопка блокнота
			$note = $('a.note', $el);
			if ($note.length) {
				$note.click(function() {
					var
						$this = $(this),
						added = $this.hasClass('added'),
						param = {
							a: 1,
							id: data.real_id,
							'do': added ? 'del' : 'add'
						};
					$.get('/note.php', param, function() {
						$this.toggleClass('added', !added);
					});
					return false;
				});
			}

			return $el;
		}


	// Поиск недвижимости
	var $filter = $('#filter');
	if ($filter.length) {

		var arr = (/\b(cat_\d+)\b/).exec($('#page').attr('class')),
			sess_part = (arr && arr[1]) || 'default',
			sess_loaded = !!sessvars[sess_part];
		if (!sess_loaded) sessvars[sess_part] = { counts: {} };

		// Расширенный поиск
		/*
			TODO Сделать плавное сворачивание/разворачивание (подглючивает в IE)
		*/
		if ($filter.hasClass('extended') && $filter.parents('#content').length) {
			var
				$extension = $('.extension', $filter);
			if ($extension.length) {
				(function() {
					var
						$open = $('<a href="#" class="open">Расширенный поиск</a>'),
						$close = $('<a href="#" class="close">Обычный поиск</a>').hide(),
						$input = $('<input type="checkbox" name="extended" value="1" />').hide(),
						$extend = $('<div class="extend"/>')
							.append($open)
							.append($close)
							.append($input)
							.data('opened', $extension.hasClass('opened'))
							.appendTo($filter);
					$open.click(function() {
						$open.hide();
						$close.show();
						$extend.data('opened', true);
						$extension
							.css({
								height: 'auto',
								visibility: 'visible'
							});
						$input[0].checked = true;
						return false;
					});
					$close.click(function() {
						$open.show();
						$close.hide();
						$extend.data('opened', false);
						$extension
							.css({
								height: 0,
								visibility: 'hidden'
							});
						$input[0].checked = false;
						return false;
					});
					if ($extend.data('opened')) {
						$open.triggerHandler('click');
					}
				}());
			}
		}

		// Спойлеры
		var sp_click = function($item, f) {
			$item.toggleClass('opened', f);
			$item.data('input')[0].checked = f;
			sessvars[sess_part][$item.data('input')[0].id] = f;
			$item.data('spoiler')['slide' + (f ? 'Down' : 'Up')]();
			if (load_list) load_list();
		};
		$('h5', $filter).each(function(index, item) {
			var $item = $(item), $input = $('input', $item);
			if (sess_loaded) $item.toggleClass('opened', sessvars[sess_part][$input[0].id]);
			else $input[0].checked = sessvars[sess_part][$input[0].id] = $item.hasClass('opened');
			$item
				.data('input', $input)
				.data('spoiler', $item.next('.spoiler'))
				.click(function(event) {
					sp_click($item, !$item.hasClass('opened'));
					return false;
				});
			sp_click($item, $item.hasClass('opened'));
		});

		// Схема метро
		var metro = {
			line_1: {
				'200014471': ['Улица Подбельского',81,13,471,76,468,83],
				'200014478': ['Черкизовская',57,12,471,99,468,106],
				'200014440': ['Преображенская площадь',100,13,457,116,453,121],
				'200014454': ['Сокольники',49,12,441,132,438,136],
				'200014401': ['Красносельская',65,12,427,146,423,151],
				//'200014398': ['Комсомольская',64,12,402,174,406,168],
				'200014402': ['Красные ворота',64,12,383,190,379,195],
				'200014481': ['Чистые пруды',58,13,370,203,365,209],
				'200014410': ['Лубянка',36,12,321,229,327,247],
				'200014427': ['Охотный ряд',53,15,265,253,300,274],
				'200014369': ['Библиотека имени Ленина',56,19,273,303,276,298],
				'200014074': ['Кропоткинская',61,12,235,338,231,343],
				//'200014113': ['Парк культуры',58,12,209,368,213,361],
				'200013945': ['Фрунзенская',53,12,125,384,183,391],
				'200014130': ['Спортивная',50,12,108,404,163,411],
				'200013939': ['Воробьевы горы',66,12,69,426,140,434],
				'200014122': ['Университет',53,12,64,444,122,452],
				'200014442': ['Проспект Вернадского',88,13,13,461,105,469],
				'200013908': ['Юго-Западная',57,13,28,478,89,485]
			},
			line_2: {
				'200014445': ['Речной вокзал',59,14,104,42,167,51],
				'200014380': ['Водный стадион',37,22,126,63,167,73],
				'200014381': ['Войковская',49,14,114,87,167,96],
				'200014453': ['Сокол',29,12,134,112,167,118],
				'200014144': ['Аэропорт',42,12,121,134,167,141],
				'200014386': ['Динамо',35,13,141,148,180,154],
				//'200014366': ['Белорусская',53,12,146,175,194,168],
				'200014126': ['Маяковская',50,12,182,207,234,208],
				'200014458': ['Тверская',40,12,276,234,273,247],
				'200014459': ['Театральная',52,12,309,268,312,286],
				'200014142': ['Новокузнецкая',61,13,310,381,316,375],
				//'200014428': ['Павелецкая',48,13,357,400,360,419],
				'200014357': ['Автозоводская',61,13,335,454,399,458],
				//'': ['Технопарк',45,12,351,470,400,477],
				'200014397': ['Коломенская',54,12,404,492,400,499],
				'200014394': ['Каширская',45,12,406,511,400,517],
				'200014392': ['Кантемировская',65,12,405,531,400,539],
				'200014477': ['Царицино',44,13,372,554,420,559],
				'200014425': ['Орехово',38,12,399,574,441,580],
				'200014389': ['Домодедовская',64,13,393,595,461,600],
				'200014400': ['Красногвардейская',77,15,402,617,486,625]//,
				//'': ['Братеево',40,12,496,629,530,625]
			},
			line_3: {
				'200013930': ['Щелковская',49,13,507,161,503,167],
				'200014430': ['Первомайская',58,14,507,180,503,188],
				'200014391': ['Измайловская',58,14,507,200,503,208],
				'200014429': ['Партизанская',56,12,507,222,503,229],
				'200014451': ['Семеновская',54,12,507,243,503,249],
				'200014485': ['Электрозаводская',73,13,491,259,488,264],
				'200014364': ['Бауманская',49,12,477,274,473,279],
				//'200014407': ['Курская',35,12,426,280,454,298],
				'200014437': ['Площадь революции',80,13,322,280,324,298],
				'200014127': ['Арбатская',44,12,212,303,252,298],
				'200014065': ['Смоленская',51,12,164,292,220,298],
				//'200014129': ['Киевская',39,12,185,333,167,351],
				'200014124': ['Парк Победы',52,13,31,340,88,346],
				//'': ['Славянский Бульвар',47,21,0,302,52,310],
				'200014134': ['Кунцевская',48,13,29,252,25,283],
				'200014417': ['Молодежная',52,13,29,239,25,246],
				'200014404': ['Крылатское',49,12,29,217,25,224]//,
				//'': ['Строгино',41,12,29,193,25,200],
				//'': ['Мякининская',54,12,29,171,25,178],
				//'': ['Волоколамская',62,12,29,119,25,126],
				//'': ['Митино',34,12,29,92,25,99]
			},
			line_4: {
				'200014359': ['Александровский сад',85,14,188,260,264,286],
				'200014127': ['Арбатская',44,12,208,270,241,286],
				'200014065': ['Смоленская',51,12,153,275,208,286],
				//'200014129': ['Киевская',39,12,185,333,167,327],
				'200014385': ['Деловой центр',61,15,134,281,130,290],
				'200014415': ['Международная',65,13,60,264,130,270],
				'200014455': ['Студенческая',57,13,77,367,130,364],
				'200014408': ['Кутузовская',51,12,109,332,105,339],
				'200014476': ['Фили',25,12,96,320,93,327],
				'200014363': ['Багратионовская',69,12,85,308,81,315],
				'200014475': ['Филевский парк',64,14,72,293,69,303],
				'200014434': ['Пионерская',49,12,60,283,56,290]
				//'200014134': ['Кунцевская',48,13,29,252,37,271]
			},
			line_5: {
				'200013956': ['Проспект Мира',41,19,329,131,365,159],
				'200014398': ['Комсомольская',64,12,402,174,394,180],
				'200014407': ['Курская',35,12,426,280,436,298],
				'200014457': ['Таганская',44,12,377,339,415,357],
				'200014428': ['Павелецкая',48,13,357,400,348,407],
				'200014388': ['Добрынинская',60,13,281,395,323,414],
				'200014423': ['Октябрьская',52,12,216,391,263,410],
				'200014113': ['Парк Культуры',58,12,209,368,201,373],
				'200014129': ['Киевская',39,12,185,333,179,339],
				'200014091': ['Краснопресненская',79,12,83,241,168,247],
				'200014366': ['Белорусская',53,12,146,175,206,180],
				'200014119': ['Новослободская',68,13,192,143,265,147]
			},
			line_6: {
				'200014414': ['Медведково',50,13,407,6,403,13],
				'200014362': ['Бабушкинская',57,12,407,30,403,36],
				'200014449': ['Свиблово',42,12,394,43,390,49],
				'200014372': ['Ботанический сад',72,15,381,54,377,62],
				'200014378': ['ВДНХ',24,13,381,78,377,84],
				'200014360': ['Алексеевская',56,12,380,99,377,105],
				'200014446': ['Рижская',37,12,381,120,377,126],
				//'200013956': ['Проспект Мира',41,19,329,131,377,147],
				'200014456': ['Сухаревская',52,12,309,167,365,177],
				'200014466': ['Тургеневская',56,12,370,221,365,227],
				'200014395': ['Китай-город',50,15,359,312,365,308],
				'200014108': ['Третьяковская',61,12,320,345,316,357],
				//'200014423': ['Октябрьская',52,12,216,391,275,398],
				'200014299': ['Шаболовская',55,12,204,432,263,440],
				'200014409': ['Ленинский проспект',81,14,166,442,250,453],
				'200014358': ['Академическая',62,13,172,457,238,465],
				'200014443': ['Профсоюзная',57,12,165,470,225,478],
				'200014422': ['Новые черемушки',71,12,138,482,213,490],
				'200013928': ['Калужская',45,12,152,495,200,503],
				'200014367': ['Беляево',37,12,147,508,188,515],
				'200014399': ['Коньково',41,12,143,526,188,533],
				'200014462': ['Теплый стан',52,14,132,543,188,551],
				'200014486': ['Ясенево',38,12,159,559,201,564],
				'200014370': ['Битцевский парк',67,15,140,570,214,577]
			},
			line_7: {
				'200014435': ['Планерная',45,12,60,84,109,91],
				'200014189': ['Сходненская',54,13,51,107,109,113],
				'200013893': ['Тушинская',46,12,59,130,109,136],
				'200014484': ['Щукинская',46,13,59,151,109,157],
				'200014424': ['Октябрьское поле',71,12,113,182,109,188],
				'200014093': ['Полежаевская',58,12,130,199,127,206],
				'200014365': ['Беговая',36,12,100,215,141,220],
				'200014046': ['Улица 1905 года',62,13,87,228,155,234],
				'200014049': ['Баррикадная',52,13,136,253,184,247],
				'200014444': ['Пушкинская',50,12,201,234,255,247],
				'200014405': ['Кузнецкий мост',63,15,345,251,339,259],
				//'200014395': ['Китай-город',50,15,359,312,388,308],
				'200014457': ['Таганская',44,12,377,339,428,348],
				'200014441': ['Пролетарская',56,12,470,378,464,384],
				'200014382': ['Волгоградский проспект',95,15,491,399,488,408],
				'200014460': ['Текстильщики',58,13,505,416,503,423],
				'200014406': ['Кузьминки',44,12,469,433,518,438],
				'200014447': ['Рязанский проспект',45,21,502,440,536,438],
				'270002001': ['Выхино',35,12,545,442,555,438]//,
				//'': ['Жулебино',41,12,555,422,581,438]
			},
			line_8: {
				'200014108': ['Третьяковская',61,12,318,346,329,366],
				'200014412': ['Марксистская',58,12,374,371,428,366],
				'200014436': ['Площадь Ильича',65,13,468,365,464,366],
				'200014356': ['Авиамоторная',60,12,501,346,498,351],
				'200014483': ['Шоссе Энтузиастов',78,12,518,330,514,335],
				'200014431': ['Перово',33,12,532,316,528,321],
				'200014421': ['Новогиреево',54,12,486,298,543,306]//,
				//'': ['Новокосино',52,12,526,289,569,306]
			},
			line_9: {
				'200014361': ['Алтуфьево',45,12,203,0,253,6],
				'200014368': ['Бибирево',41,12,194,13,240,19],
				'200014426': ['Отрадное',41,13,194,30,240,37],
				'200014379': ['Владыкино',46,13,189,48,240,54],
				'200014432': ['Петровско-Разумовская',53,19,195,59,253,67],
				'200014463': ['Тимирязевская',62,12,187,78,253,84],
				'200014387': ['Дмитровская',55,13,194,94,253,101],
				'200014448': ['Савеловская',53,12,196,110,253,117],
				'200014416': ['Менделеевская',62,13,185,129,253,135],
				'200014283': ['Цветной бульвар',67,15,232,179,306,188],
				'200014480': ['Чеховская',45,12,269,225,264,234],
				'200014371': ['Боровицкая',49,12,224,317,264,310],
				'200014438': ['Полянка',37,12,231,357,271,362],
				'200014452': ['Серпуховская',60,13,279,395,323,414],
				'200014465': ['Тульская',40,12,279,444,323,450],
				'200014418': ['Нагатинская',52,12,267,462,323,469],
				'200014419': ['Нагорная',41,12,260,482,304,488],
				'200014420': ['Нахимовский проспект',90,14,211,494,304,502],
				'200014450': ['Севастопольская',71,12,227,511,304,517],
				'200014479': ['Чертановская',57,12,244,526,304,532],
				'200013922': ['Южная',32,12,286,545,323,551],
				'200014439': ['Пражская',42,12,277,559,323,566],
				'200014469': ['Улица Академика Янгеля',67,19,252,571,323,581],
				'200013900': ['Аннино',34,12,285,588,323,596],
				'200014375': ['Бульвар Дмитрия Донского',103,13,301,619,294,625]
			},
			line_10: {
				//'': ['Марьина роща',58,13,260,101,322,108],
				//'': ['Достоевская',54,13,264,120,322,127],
				'200014464': ['Трубная',36,12,327,181,322,188],
				//'': ['Сретенский бульвар',79,14,265,210,352,218],
				'200014482': ['Чкаловская',49,12,449,307,445,311],
				//'': ['Римская',37,12,465,331,464,350],
				'200014403': ['Крестьянская застава',56,20,401,390,464,400],
				'200014390': ['Дубровка',40,13,420,423,464,430],
				'200014396': ['Кожуховская',55,12,405,445,464,452],
				'200014433': ['Печатники',44,12,428,459,475,463],
				'200014383': ['Волжская',42,12,490,469,486,474],
				'200014411': ['Люблино',40,12,489,485,486,491],
				'200014373': ['Братиславская',60,12,490,502,486,508],
				'200014413': ['Марьино',38,12,490,518,486,525]//,
				//'': ['Борисово',42,12,490,557,486,564],
				//'': ['Шипиловская',55,12,490,576,486,583],
				//'': ['Зябликово',46,12,492,602,486,609]
			},
			line_11: {
				'200014393': ['Каховская',44,12,317,522,320,517],
				'200014377': ['Варшавская',50,12,326,501,353,517]//,
				//'200014394': ['Каширская',45,12,406,511,384,517]
			},
			line_12: {
				//'200014370': ['Битцевский парк',67,15,140,570,230,577]
				'200014474': ['Улица Старокачаловская',96,13,175,619,278,625],
				'200014473': ['Улица Скобелевская',80,13,193,636,278,643],
				'200014374': ['Бульвар Адмирала Ушакова',103,13,170,652,278,659],
				'200014470': ['Улица Горчакова',67,13,206,668,278,675],
				'200014376': ['Бунинская Аллея',66,12,302,668,297,675]
			},
			/*line_13: {
				'': ['Юго-Западная',57,13,27,475,89,501],
				'': ['Никулинская',53,12,31,513,89,520],
				'': ['Олимпийская_деревня',85,15,0,533,89,539],
				'': ['Востряково',50,12,34,551,89,558],
				'': ['Терешково',46,12,38,569,89,577],
				'': ['Солнцево',42,13,42,589,89,596],
				'': ['Боровское_шоссе',71,12,13,608,89,615],
				'': ['Новопеределкино',71,13,13,627,89,634]
			},*/
			line_14: {
				'200014463': ['Тимирязевская',9,59,262,19,267,84],
				'200014468': ['Ул. Милашенкова',9,65,282,12,287,84],
				'200014461': ['Телецентр',9,43,301,35,306,84],
				'200014467': ['Ул. академика Королева',16,55,317,23,325,84],
				'200014384': ['Выставочный центр',11,77,337,0,344,84],
				'200014472': ['Улица Сергея Эйзенштейна',17,56,354,22,363,84]
			}
		},
		moscow = {
			'200014064': ['Арбат',219,292,32,24,0,0],
			'200014524': ['Басманный',266,255,74,45,0,24],
			'200014107': ['Замоскворечье',255,302,32,43,0,69],
			'200014685': ['Красносельский',266,241,50,45,0,112],
			'200013955': ['Мещанский',255,237,23,49,0,157],
			'200014045': ['Пресненский',172,266,81,45,0,206],
			'200014529': ['Таганский',269,293,57,45,0,251],
			'200014125': ['Тверской',220,242,40,49,0,296],
			'200013944': ['Хамовники',190,303,61,56,0,345],
			'200014298': ['Якиманка',222,303,40,54,0,401],
			'200014143': ['Аэропорт',164,208,53,43,0,455],
			'200014654': ['Беговой',188,237,46,31,0,498],
			'200014655': ['Бескудниковский',181,116,36,42,0,529],
			'200014664': ['Войковский',128,171,44,38,0,571],
			'200014665': ['Восточное Дегунино',191,90,27,59,0,609],
			'200014669': ['Головинский',125,133,74,44,0,668],
			'200014672': ['Дмитровский',151,73,50,51,0,712],
			'200014674': ['Западное Дегунино',132,93,78,66,0,763],
			'200014682': ['Коптево',161,158,43,59,0,829],
			'200014690': ['Левобережный',98,111,53,54,0,888],
			'200014699': ['Молжаниновский',12,5,73,66,0,942],
			'200013915': ['Савёловский',198,215,29,28,0,1008],
			'200014725': ['Сокол',142,206,29,37,0,1036],
			'200014731': ['Тимирязевский',180,157,44,66,0,1073],
			'200014733': ['Ховрино',122,107,43,45,0,1139],
			'200014092': ['Хорошёвский',156,225,45,70,0,1184],
			'200014651': ['Алексеевский',272,182,29,61,0,1254],
			'200014652': ['Алтуфьевский',212,102,33,26,0,1315],
			'200014653': ['Бабушкинский',278,108,34,46,0,1341],
			'200014656': ['Бибирево',229,71,46,43,0,1387],
			'200014661': ['Бутырский',219,182,32,59,0,1430],
			'200014692': ['Лианозово',184,67,46,36,0,1489],
			'200014693': ['Лосиноостровский',306,92,39,44,0,1525],
			'200014695': ['Марфино',219,160,24,42,0,1569],
			'200014118': ['Марьина Роща',231,213,40,42,0,1611],
			'200014711': ['Останкинский',228,145,55,88,0,1653],
			'200014712': ['Отрадное',216,114,54,47,0,1741],
			'200014718': ['Ростокино',268,160,34,33,0,1788],
			'200014720': ['Свиблово',262,136,41,27,0,1821],
			'200014723': ['Северное Медведково',259,88,56,31,0,1848],
			'200014724': ['Северный',169,4,52,69,0,1879],
			'200014739': ['Южное Медведково',254,105,37,36,0,1948],
			'200014741': ['Ярославский',297,103,61,71,0,1984],
			'200014659': ['Богородское',301,175,68,54,0,2055],
			'200014662': ['Вешняки',389,301,68,59,0,2109],
			'200014666': ['Восточное Измайлово',413,223,39,24,0,2168],
			'200014667': ['Восточный',457,191,46,32,0,2192],
			'200014670': ['Гольяново',369,146,79,79,0,2224],
			'200014677': ['Ивановское',414,244,41,61,0,2303],
			'200014678': ['Измайлово',366,225,52,66,0,2364],
			'200014683': ['Косино-Ухтомский',449,326,90,54,0,2430],
			'200014698': ['Метрогородок',305,115,94,97,0,2484],
			'200014706': ['Новогиреево',392,287,49,35,0,2581],
			'200014707': ['Новокосино',453,302,43,27,0,2616],
			'200014714': ['Перово',345,276,79,48,0,2643],
			'200014716': ['Преображенское',326,217,44,34,0,2691],
			'200014722': ['Северное Измайлово',371,208,78,19,0,2725],
			'200014726': ['Соколиная Гора',327,238,41,60,0,2744],
			'200014727': ['Сокольники',284,201,48,53,0,2804],
			'200014668': ['Выхино-Жулебино',410,346,63,65,0,2857],
			'200014679': ['Капотня',402,436,50,49,0,2922],
			'200014688': ['Кузьминки',370,351,55,56,0,2971],
			'200014691': ['Лефортово',304,269,55,56,0,3027],
			'200014694': ['Люблино',348,388,104,49,0,3083],
			'200014696': ['Марьино',325,421,82,41,0,3132],
			'200014705': ['Нижегородский',310,309,77,36,0,3173],
			'200014715': ['Печатники',305,346,55,111,0,3209],
			'200014719': ['Рязанский',362,326,55,37,0,3320],
			'200014729': ['Текстильщики',329,337,49,56,0,3357],
			'200014740': ['Южнопортовый',295,327,31,49,0,3413],
			'200014657': ['Бирюлёво Восточное',278,490,71,73,0,3462],
			'200014658': ['Бирюлёво Западное',253,507,44,56,0,3535],
			'200014660': ['Братеево',352,449,59,45,0,3591],
			'200014671': ['Даниловский',246,334,54,66,0,3636],
			'200014673': ['Донской',226,342,41,48,0,3702],
			'200014676': ['Зябликово',352,475,41,28,0,3750],
			'200014700': ['Москворечье-Сабурово',261,439,93,41,0,3778],
			'200014701': ['Нагатино-Садовники',261,387,37,60,0,3819],
			'200014702': ['Нагатинский Затон',285,373,55,75,0,3879],
			'200014703': ['Нагорный',246,389,18,72,0,3954],
			'200014709': ['Орехово-Борисово Северное',305,469,51,44,0,4026],
			'200014710': ['Орехово-Борисово Южное',326,493,77,44,0,4070],
			'200014734': ['Царицыно',263,461,54,44,0,4114],
			'200014736': ['Чертаново Северное',222,457,43,37,0,4158],
			'200013921': ['Чертаново Центральное',217,476,60,39,0,4195],
			'200014737': ['Чертаново Южное',219,506,52,52,0,4234],
			'200013938': ['Гагаринский',180,355,48,47,0,4286],
			'200014650': ['Академический',199,368,41,46,0,4333],
			'200014684': ['Котловка',222,388,33,41,0,4379],
			'200014180': ['Ломоносовский',165,390,36,31,0,4420],
			'200014735': ['Черёмушки',188,402,40,47,0,4451],
			'200014675': ['Зюзино',211,427,39,32,0,4498],
			'200014742': ['Ясенево',146,450,83,95,0,4530],
			'200014681': ['Коньково',153,437,56,51,0,4625],
			'200013927': ['Обручевский',141,411,60,47,0,4676],
			'200014730': ['Тёплый Стан',117,448,51,59,0,4723],
			'200014721': ['Северное Бутово',190,542,52,50,0,4782],
			'200014738': ['Южное Бутово',134,578,119,92,0,4832],
			'200014128': ['Дорогомилово',144,297,75,44,0,4924],
			'200014686': ['Крылатское',41,263,80,46,0,4968],
			'200014689': ['Кунцево',36,274,71,62,0,5014],
			'200014133': ['Можайский',47,334,67,43,0,5076],
			'200014708': ['Ново-Переделкино',4,418,46,62,0,5119],
			'200014123': ['Очаково-Матвеевское',69,343,78,90,0,5181],
			'200014717': ['Проспект Вернадского',132,391,41,37,0,5271],
			'200014141': ['Раменки',124,321,78,83,0,5308],
			'200014728': ['Солнцево',41,403,50,77,0,5391],
			'270001903': ['Тропарёво-Никулино',96,399,63,67,0,5468],
			'200014732': ['Филёвский Парк',87,276,85,50,0,5535],
			'200014121': ['Фили-Давыдково',102,314,49,45,0,5585],
			'200014743': ['Куркино',35,68,51,60,0,5630],
			'200014746': ['Митино',12,130,53,72,0,5690],
			'200014094': ['Покровское-Стрешнево',61,172,80,48,0,5762],
			'200014747': ['Северное Тушино',63,115,55,45,0,5810],
			'200014744': ['Строгино',36,189,71,85,0,5855],
			'200014748': ['Хорошёво-Мнёвники',67,240,105,76,0,5940],
			'200014745': ['Щукино',104,206,51,42,0,6016],
			'200014749': ['Южное Тушино',59,154,68,29,0,6058]
		},
		moscow_center = {
			'200014064': ['Арбат',185,283,96,72,0,572],
			'200014524': ['Басманный',326,171,224,136,0,1244],
			'200014107': ['Замоскворечье',292,316,98,128,0,980],
			'200014685': ['Красносельский',324,128,154,136,0,0],
			'200013955': ['Мещанский',289,114,74,150,0,136],
			'200014045': ['Пресненский',41,203,246,138,0,434],
			'200014529': ['Таганский',335,286,172,136,0,1108],
			'200014125': ['Тверской',189,134,118,148,0,286],
			'200013944': ['Хамовники',96,316,186,170,0,644],
			'200014298': ['Якиманка',193,315,120,166,0,814],
			'0': ['Другие районы']
		},
		road = {
			reg_1: {
				'200015360': ['Волоколамское',19,127,148,74,0,2089],
				'200015351': ['Ильинское',129,194,40,17,0,2163],
				'200015350': ['Новорижское',0,180,163,66,0,2180],
				'200015359': ['Пятницкое',32,81,136,107,0,2246]
			},
			reg_2: {
				'200015361': ['Алтуфьевское',221,107,24,50,0,0],
				'200015354': ['Дмитровское',187,0,91,157,0,50],
				'200015362': ['Ленинградское',73,33,128,141,0,207],
				'200015363': ['Осташковское',234,57,68,103,0,348],
				'9': ['Ярославское',263,22,146,167,0,451]
			},
			reg_3: {
				'10': ['Щелковское',294,85,182,126,0,618],
				'11': ['Горьковское',302,164,182,107,0,744]
			},
			reg_4: {
				'12': ['Егорьевское',301,250,181,76,0,851],
				'13': ['Рязанское',299,255,178,139,0,927],
				'14': ['Новорязанское',292,263,161,175,0,1066]
			},
			reg_5: {
				'15': ['Варшавское',170,324,96,139,0,1241],
				'16': ['Каширское',260,300,124,163,0,1380]
			},
			reg_6: {
				'200015358': ['Боровское',92,274,96,57,0,1543],
				'200015352': ['Калужское',79,309,135,135,0,1600],
				'200015353': ['Киевское',36,295,158,110,0,1735]
			},
			reg_7: {
				'200015349': ['Рублево-Успенское',1,221,161,61,0,1845],
				'200015356': ['Минское',36,255,132,91,0,1906],
				'200015355': ['Можайское',26,241,139,65,0,1997],
				'200015357': ['Сколковское',146,261,30,27,0,2062]
			}
		},
		moscow2 = {
			'1': ['Проспект Мира',366,5,88,188,0,1361],
			'2': ['Ленинградский',115,54,163,181,0,969],
			'3': ['Неглинка, Цветной, Самотека',329,118,44,99,0,1262],
			'4': ['Крылатское, Кунцево, Рублевка',0,124,144,179,0,379],
			'5': ['Красная Пресня',149,178,133,92,0,814],
			'6': ['Тверская, Патриаршие',264,128,69,112,0,1150],
			'7': ['Чистые Пруды, Китай-Город',352,155,195,144,0,235],
			'8': ['Кутузовский',1,247,244,127,0,558],
			'9': ['Остоженка, Арбат',266,238,48,63,0,906],
			'10': ['Замоскворечье',298,259,92,86,0,59],
			'11': ['Таганская',361,239,118,90,0,145],
			'12': ['Фрунзенская, Смоленская',190,247,96,129,0,685],
			'13': ['Ленинский',259,312,68,59,0,0],
			'0': ['Другие районы']
		};

		// Чекбоксы
		$('#filter .checkboxes label input').each(function(index, item) {
			var $item = $(item),
				$parent = $item.parent();
			$item.data('$parent', $parent);
			if (sess_loaded) $parent.toggleClass('active', item.checked = !!sessvars[sess_part][item.id]);
			else item.checked = sessvars[sess_part][item.id] = $parent.hasClass('active');
		}).click(function(e) {
			var $this = $(this);
			$this.blur()
				.data('$parent')
					.toggleClass('active', this.checked)
					.blur();
			sessvars[sess_part][this.id] = this.checked;
			setTimeout(function() { load_list(); }, 1);
		}).css('opacity', 0);

		// Поиск по ID
		var
			$input = $('.input_search input', $filter);
		if ($input.length) {
			var
				send_id = function() {
					if (!$.trim($input.val()).length) {
						alert('Введите ID или его часть.');
						return false;
					}
					sessvars[sess_part]['search_by_id'] = true;
					sessvars[sess_part][$input[0].id] = $input.val();
				};
			$('.search_by_id *[type=submit]', $filter).click(send_id);
			$input.keypress(function(event) {
				if (event.keyCode == 13) {
					return send_id();
				}
			});
/*			$input
				.change(function() {
					sessvars[sess_part][this.id] = this.value;
					if (this.to) {
						clearTimeout(this.to);
						load_list();
					}
				})
				.keyup(function() {
					if (this.to) {
						clearTimeout(this.to);
					}
					this.to = setTimeout(function() { load_list(); }, 1000);
				});
*/
			if ($input[0].id && sessvars[sess_part][$input[0].id]){
				$input[0].value = sessvars[sess_part][$input[0].id];
				sessvars[sess_part][$input[0].id] = null;
			}

		}

		// Отправка формы
		if ($filter.hasClass('realtime')) {
			$filter.parents('form').submit(function() {
				load_list();
				return false;
			});
		}

		// Список результатов и разбивка на страницы
		var
			$results = $('#search_results'),
			tmpl_pages = 'tmpl_results_pages',
			$pages_1 = $($.tmpl(tmpl_pages, { id: 'pages_1' })),
			$pages_2 = $($.tmpl(tmpl_pages, { id: 'pages_2' }));
		var
			$pages = $pages_1.add($pages_2),
			$pages_cont = $('.pages_cont', $pages),
			$currentPage = $('input[name=currentPage]', $pages),
			$paging = $('input[name=paging]', $pages),
			$pages_prev = $('a.prev', $pages),
			$pages_next = $('a.next', $pages),
			pages_mousemove = function() {
				var
					left = parseInt($pages_cont.css('left')),
					width = $pages_cont[0].scrollWidth,
					parent = $pages_cont[0].parentNode.offsetWidth,
					step = $pages_cont.data('scrollStep'),
					fullleft = (left >= 0),
					fullright = (width + left <= parent);
				if (((step < 0) && !fullright) || ((step > 0) && !fullleft)) {
					$pages_cont.css({left: left + step});
					$pages_cont.data('to', setTimeout(pages_mousemove, 10));
				}
				$pages_prev.toggleClass('disabled', fullleft);
				$pages_next.toggleClass('disabled', fullright);
				return false;
			},
			$monitor = $('#monitor'),
			$new_search = $('<div class="button"><input type="button" value="Новый поиск" name="new_search"></div>')
				.click(function() {
					clear_filter();
				})
				.hide();

		// Создаем нужные блоки, если их нет
		($results.length || ($results = $('<div id="search_results" class="ill search"/>').appendTo($('#page'))));
		($monitor.length || ($monitor = $('<div id="monitor"/>').appendTo($('#sort'))));
		$pages_1
			.hide()
			.insertBefore($results);
		$pages_2
			.hide()
			.insertAfter($results)
			.after($new_search);
		if (sessvars[sess_part]['page_num']) {
			$currentPage.val(sessvars[sess_part]['page_num']);
		}
		else {
			sessvars[sess_part]['page_num'] = $currentPage.val();
		}

		$pages_prev.data('scrollStep', 5);
		$pages_next.data('scrollStep', -5);
		$pages_prev.add($pages_next)
			.mouseover(function() {
				if ($pages_cont.data('scrollDisabled')) return false;
				var
					width = $pages_cont.width(),
					parent = $pages_cont.parent().width(),
					step = $(this).data('scrollStep'),
					left = parseInt($pages_cont.css('left')),
					targetLeft = (step > 0) ? 0 : (parent - width);
				$pages_cont.data('scrollStep', step);
				if (step > 0) $pages_next.removeClass('disabled');
				if (step < 0) $pages_prev.removeClass('disabled');
				$pages_cont.animate({left: targetLeft}, Math.abs(left - targetLeft) * 5, 'linear', function() {
					var
						step = $pages_cont.data('scrollStep');
					if (step < 0) $pages_next.addClass('disabled');
					if (step > 0) $pages_prev.addClass('disabled');
					$pages_cont.data('step', 0);
				});
				return false;
			})
			.mouseout(function() {
				if ($pages_cont.data('scrollDisabled')) return false;
				$pages_cont.stop();
				$pages_cont.data('scrollStep', 0);
			})
			.click(function() {
				$pages_cont.stop();
				var
					$this = $(this),
					width = parseInt($pages_cont.width()),
					parent = parseInt($pages_cont.parent().width()),
					step = $pages_cont.data('scrollStep'),
					left = parseInt($pages_cont.css('left')),
					targetLeft = (step > 0) ? 0 : (parent - width);
				$pages_cont.css({left: targetLeft});
				if (step < 0) $pages_next.addClass('disabled');
				if (step > 0) $pages_prev.addClass('disabled');
				$pages_cont.data('step', 0);
				return false;
			});

		// Постраничная навигация
		$('.pages_block a.page').live('click', function(event) {
			var
				$this = $('.pages_block a.page:nth-child(' + $(this).data('page') + ')');
			if ($this.hasClass('active')) return false;
			var $old = $('.pages_block a.page.active'),
				$new = $this.addClass('active');
			if ($old) {
				$old.removeClass('active')
			}
			$pages.data('active', $new);
			$(window).scrollTop($('#sort').offset().top - 10);
			$currentPage.val(sessvars[sess_part]['page_num'] = $this.data('page'));

			/*
				Перед отправкой формы устанавливаем флаг постраничной
				навигации, чтобы не перезагружать маркеры и карту.
				После отправки сбрасываем.
			*/
			$paging.val(1);
			load_list(true);
			$paging.val(0);

			return false;
		});


		var
			// Курсы валют
			$price_units = $('select#price_units'),
			$rub = $('option.rub', $price_units),
			$usd = $('option.usd', $price_units),
			$eur = $('option.eur', $price_units),
			onpage_def = 6,
			rub = $rub.length ? $rub.val() : 0,
			usd = ($usd.length && rub) ? $usd.val() / rub : 0,
			eur = ($eur.length && rub) ? $eur.val() / rub : 0,

			// Подготовка списка объектов
			build_list = function(data, textStatus) {
				var items = {},
					i = 0,
					len = data[1].length;
				for (; i < len; i++) {
					items[data[1][i].object_id] = build_item(tmpl_results, data[1][i]);
				}
				$results
					.data('total', data[0])
					.data('items', items)
					.data('loaded', true);
				$W.data('compiled', items)
				show_list();
				$results.data('no_changes', false);

				// Расстановка маркеров
				var
					f = function() {
						add_markers($W.data('gmap'), data[2]);
					};
				($W.data('gmap')
					? f()
					: $W.bind('gmap_load', f));

				return items;
			},

			// Вывод списка
			show_list = function() {
				if (!$results.data('loaded')) {
					return false;
				}
				var
					i,
					len = 0,
					page = 0,
					items = $results.data('items'),
					total = parseInt($results.data('total'), 10),
					num = $results.data('no_changes')
						? sessvars[sess_part]['page_num'] || 0
						: 0,
					$cache = $('</>'),
					onpage = parseInt($results.data('onpage') || onpage_def, 10);
				for (i in items) {
					$cache = $cache.add(items[i]);
					len++;
				}
				$results.html('');
				if (len) {
					$results.append($cache);
					$('#sort fieldset').css('visibility', 'visible');
					$new_search.hide();
				}
				else {
					$('#sort fieldset').css('visibility', 'hidden');
					$new_search.show();
				}
				monitor_text(Math.min(len, onpage), total);
				build_pages(num);
				return true;
			},

			// Подготовка страниц
			build_pages = function(num) {
				var
					total = parseInt($results.data('total'), 10),
					onpage = parseInt($results.data('onpage') || onpage_def, 10),
					i = 0,
					page = 0,
					$a;
				if (!num || !$pages.data('inited')) {
					$pages.hide();
					$('a.page', $pages_cont).remove();
					if (!total) return false;
					for (; i < total; i += onpage) {
						page++;
						$('<a class="page" href="?page_' + page + '">' + page + '</a>')
							.appendTo($pages_cont)
							.data('page', page);
						if (i + onpage < total) $pages_cont.append(' ');
					}
					$pages.data('inited', true);
				}
				$pages.show();

				var
					width = parseInt($pages_cont.width()),
					parent = parseInt($pages_cont.parent().width()),
					n = parseInt(sessvars[sess_part]['page_num'], 10) || 1,
					$page = $('a.page:nth-child(' + n + ')', $pages_cont);
				$page.addClass('active');
				$pages_cont.css({left: Math.min(0, Math.max(-$page[0].offsetLeft + Math.floor(parent / 2), parent - width))});
				$pages.data('active', $page);
				$pages_prev.add($pages_next).css('display', (width > parent) ? 'inline' : 'none');
				var
					left = parseInt($pages_cont.css('left'), 10);
				$pages_prev.toggleClass('disabled', (left == 0));
				$pages_next.toggleClass('disabled', (left <= parent - width));
			},

			// Вывод инфы о найденных объектах
			monitor_text = function(count, total) {
				total = total || $results.data('total') || 0;
				if (!total) {
					$monitor.text('По вашему запросу ничего не найдено.');
				}
				else {
					$monitor.text('Показано ' + count + ' ' + sklon(count, 'предложение', 'предложения' , 'предложений') + ' из ' + total + ' ' + sklon(total, 'найденного', 'найденых') + '.');
				}
			},

			// Источник данных
			load_url = (cat_id == 4)
				? '/hs2.php'
				: (cat_id == 5)
					? '/hs3.php'
					: '/hs.php',

			/*
				Загрузка результатов
					no_changes — без изменения параметров поиска (то есть
					переключение страниц результатов либо возврат на страницу)
			*/
			load_list = function(no_changes) {
				$results.data('no_changes', no_changes);
				/*
					TODO Оптимизировать проверку наличия выделенных чекбоксов
				*/
				$('.ext').each(function(index, item) {
					var $item = $(item);
					$item.toggleClass('filled', !!$('input:checked', $item).length);
				});
				if ($filter.hasClass('realtime')) {
					if (!no_changes) {
						$currentPage.val(sessvars[sess_part]['page_num'] = 0);
						$W.data('compiled', {});
					}
					$results.data('loaded', false);
					$.post(load_url, (sessvars[sess_part]['search_by_id'] ? $('.search_by_id input').add('#sort select') : $filter.parents('form')).serialize(), function(data, textStatus) {
						$('.search_by_id input.text').val('');
						setTimeout(function() {
							build_list(data, textStatus);
						}, 1);
					}, 'json');
				}
				sessvars[sess_part]['search_by_id'] = null;
			},

			/*
				Сброс фильтра
			*/
			clear_filter = function() {
				sessvars[sess_part] = {};
				document.location += '';
			};

			// Сортировка
			var
				$sort = $('#sort_by')
					.one('change', function(event) {
						$(this).change(function(event) {
							var $this = $(this),
								val = $this.val();
							if ((this.options[0].value == 'priority') && (val != 'priority')) {
								$('option:first', this).remove();
								$('li:first', $this.data('jss')).remove();
							}
							$results.data('order', sessvars[sess_part].order = val);
							load_list();
						});
					});
			if (sess_loaded) $sort.val(sessvars[sess_part].order || $sort.val());
			else sessvars[sess_part].order = $sort.val();

			// На странице
			var
				$onpage = $('#onpage')
					.one('change', function(event) {
						$(this).change(function(event) {
							var $this = $(this),
								val = parseInt($this.val(), 10);
							sessvars[sess_part].onpage = val;
							$results.data('onpage', (val <= 0) ? 1000000 : val);
							load_list();
						});
					});
			if (sess_loaded) $onpage.val(sessvars[sess_part].onpage || $onpage.val());
			else sessvars[sess_part].onpage = $onpage.val();
			$results.data('onpage', sessvars[sess_part].onpage);

		// Всплывающие окна
		var $exts_all = $('.ext', $filter);
		if ($exts_all.length) {
			var
				$exts = $exts_all.each(function(index, item) {
					$('<div class="clear" />').insertAfter(this);
				}).not('.metro, .moscow, .moscow_center, .moscow2, .road'),
				$metro_block = $('.ext.metro', $filter),
				$moscow_block = $('.ext.moscow', $filter),
				$moscow_center_block = $('.ext.moscow_center', $filter),
				$moscow2_block = $('.ext.moscow2', $filter),
				$road_block = $('.ext.road', $filter),
				$select_button = $('<div class="select_button"><span>Выбрать</span></div>');
			if ($metro_block.length) {
				var $metromap_bg = $('<div id="metromap_bg" />')
						.css({opacity: 0.5}),
					$metromap_button = $select_button
						.clone()
						.click(function(e) {
							$('#modalClose').trigger('click');
						}),
					$metromap = $('<div id="metromap" />')
						.append($metromap_bg)
						.append($metromap_button),
					opacity = 0.5,
					metro_index = {};
				for (var line in metro) {
					for (var id in metro[line]) {
						if ((id+'').length) {
							metro[line][id].line = line;
							metro_index[id] = metro[line][id];
						}
					}
				}
				var $labels = $('label', $metro_block).each(function(index, item) {
					var $item = $(item),
						$cb = $('input', $item),
						id = $cb.val(),
						arr = metro_index[id];
					if (arr && $cb.length) {
						var
							$circle = $('<span class="circle ' + arr.line + '"><i></i></span>')
								.css({
									left: arr[5] - 5,
									top: arr[6] - 3
								}),
							$name = $('<span class="name"></span>')
								.css({
									width: arr[1],
									height: arr[2] - 5,
									left: arr[3],
									top: arr[4] + 6,
									backgroundPosition: '-' + arr[3] + 'px -' + (arr[4]+6) + 'px',
									opacity: opacity
								});
							$circle.add($name)
								.attr('title', arr[0])
								.click(function(event) {
									$cb[0].checked = !$cb[0].checked;
									$item.add($item.parent()).add($circle).toggleClass('active', $cb[0].checked);
									sessvars[sess_part][$cb[0].id] = $cb[0].checked;
									$name.css({opacity: $cb[0].checked ? 1 : opacity});
								})
								.appendTo($metromap);
						$item.data('name', $name).data('circle', $circle);
					}
				});
				$metromap.appendTo($metro_block)
			}
			// Районы
			if ($moscow_block.length) {
				var $moscow_bg = $('<div id="moscow_bg" />'),
					$moscow_cover = $('<img id="moscow_cover" src="/img/spacer.gif" width="100%" heiht="100%" alt="" usemap="#moscow_map" />'),
					$moscow_button = $select_button
						.clone()
						.click(function(e) {
							$('#modalClose').trigger('click');
						}),
					$moscow = $('<div id="moscow" />')
						.append($moscow_bg)
						.append($moscow_cover)
						.append($moscow_button),
					moscow_index = {};
				for (var id in moscow) {
					if ((id+'').length) {
						moscow_index[id] = moscow[id];
					}
				}
				var $labels = $('label', $moscow_block).each(function(index, item) {
					var $item = $(item),
						$cb = $('input', $item),
						id = $cb.val(),
						arr = moscow_index[id];
					moscow[id].$cb = $cb;
					moscow[id].$label = $item;
					if (arr && $cb.length) {
						var
							$layer = $('<span class="layer"></span>')
								.css({
									left: arr[1],
									top: arr[2],
									width: arr[3],
									height: arr[4],
									backgroundPosition: '-' + arr[5] + 'px -' + arr[6] + 'px'
								})
								.attr('title', arr[0])
								.click(function(event) {
									$cb[0].checked = !$cb[0].checked;
									$item.add($item.parent()).add($layer).toggleClass('active', $cb[0].checked);
									sessvars[sess_part][$cb[0].id] = $cb[0].checked;
									return false;
								})
								.appendTo($moscow);
						$item.data('layer', $layer);
						moscow[id].$layer = $layer;
					}
				});
				$moscow.appendTo($moscow_block);
				var re = /id_(\w+)/;
				$('map[name=moscow_map] area')
					.each(function() {
						var $this = $(this),
							arr = re.exec(this.className),
							id = arr[1];
						if (moscow[id] && moscow[id].$cb) $this
							.data('id', id)
							.data('$cb', moscow[id].$cb)
							.data('$label', moscow[id].$label)
							.data('$layer', moscow[id].$layer)
							.attr('title', moscow[id][0]);
					})
					.click(function() {
						var $this = $(this),
							$cb = $this.data('$cb'),
							$label = $this.data('$label'),
							$layer = $this.data('$layer');
						if ($cb) {
							$cb[0].checked = !$cb[0].checked;
							$layer.add($label).add($label.parent()).toggleClass('active', $cb[0].checked);
							sessvars[sess_part][$cb[0].id] = $cb[0].checked;
						}
						return false;
					});
			}
			// Районы
			if ($moscow_center_block.length) {
				var $moscow_center_bg = $('<div id="moscow_center_bg" />'),
					$moscow_center_cover = $('<img id="moscow_center_cover" src="/img/spacer.gif" width="100%" heiht="100%" alt="" usemap="#moscow_center_map" />'),
					$moscow_center_other = $('<div id="moscow_center_other" />'),
					$moscow_center_button = $select_button
						.clone()
						.click(function(e) {
							$('#modalClose').trigger('click');
						}),
					$moscow_center = $('<div id="moscow_center" />')
						.append($moscow_center_bg)
						.append($moscow_center_cover)
						.append($moscow_center_other)
						.append($moscow_center_button),
					moscow_center_index = {};
				for (var id in moscow_center) {
					if ((id+'').length) {
						moscow_center_index[id] = moscow_center[id];
					}
				}
				var $labels = $('label', $moscow_center_block).each(function(index, item) {
					var $item = $(item),
						$cb = $('input', $item),
						id = $cb.val(),
						arr = moscow_center_index[id];
					if (typeof(moscow_center[id]) == UNDEF) return;
					moscow_center[id].$cb = $cb;
					moscow_center[id].$label = $item;
					if (arr && $cb.length) {
						var $layer;
						if (id == 0) $layer = $moscow_center_other;
						else $layer = $('<span class="layer"></span>')
								.css({
									left: arr[1],
									top: arr[2],
									width: arr[3],
									height: arr[4],
									backgroundPosition: '-' + arr[5] + 'px -' + arr[6] + 'px'
								});
						$layer.attr('title', arr[0])
							.click(function(event) {
								$cb[0].checked = !$cb[0].checked;
								$item.add($item.parent()).add($layer).toggleClass('active', $cb[0].checked);
								sessvars[sess_part][$cb[0].id] = $cb[0].checked;
								return false;
							})
							.appendTo($moscow_center);
						$item.data('layer', $layer);
						moscow_center[id].$layer = $layer;
					}
				});
				$moscow_center.appendTo($moscow_center_block);
				var re = /id_(\w+)/;
				$('map[name=moscow_center_map] area')
					.each(function() {
						var $this = $(this),
							arr = re.exec(this.className),
							id = arr[1];
						if (moscow_center[id] && moscow_center[id].$cb) $this
							.data('id', id)
							.data('$cb', moscow_center[id].$cb)
							.data('$label', moscow_center[id].$label)
							.data('$layer', moscow_center[id].$layer)
							.attr('title', moscow_center[id][0]);
					})
					.click(function() {
						var $this = $(this),
							$cb = $this.data('$cb'),
							$label = $this.data('$label'),
							$layer = $this.data('$layer');
						if ($cb) {
							$cb[0].checked = !$cb[0].checked;
							$layer.add($label).add($label.parent()).toggleClass('active', $cb[0].checked);
							sessvars[sess_part][$cb[0].id] = $cb[0].checked;
						}
						return false;
					});
			}
			// Районы
			if ($moscow2_block.length) {
				var $moscow2_bg = $('<div id="moscow2_bg" />'),
					$moscow2_cover = $('<img id="moscow2_cover" src="/img/spacer.gif" width="100%" heiht="100%" alt="" usemap="#moscow2_map" />'),
					$moscow2_other = $('<div id="moscow2_other" />'),
					$moscow2_button = $select_button
						.clone()
						.click(function(e) {
							$('#modalClose').trigger('click');
						}),
					$moscow2 = $('<div id="moscow2" />')
						.append($moscow2_bg)
						.append($moscow2_cover)
						.append($moscow2_other)
						.append($moscow2_button),
					moscow2_index = {};
				for (var id in moscow2) {
					if ((id+'').length) {
						moscow2_index[id] = moscow2[id];
					}
				}
				var $labels = $('label', $moscow2_block).each(function(index, item) {
					var $item = $(item),
						$cb = $('input', $item),
						id = $cb.val(),
						arr = moscow2_index[id];
					if (typeof(moscow2[id]) == UNDEF) return;
					moscow2[id].$cb = $cb;
					moscow2[id].$label = $item;
					if (arr && $cb.length) {
						var $layer;
						if (id == 0) $layer = $moscow2_other;
						else $layer = $('<span class="layer"></span>')
								.css({
									left: arr[1],
									top: arr[2],
									width: arr[3],
									height: arr[4],
									backgroundPosition: '-' + arr[5] + 'px -' + arr[6] + 'px'
								});
						$layer.attr('title', arr[0])
							.click(function(event) {
								$cb[0].checked = !$cb[0].checked;
								$item.add($item.parent()).add($layer).toggleClass('active', $cb[0].checked);
								sessvars[sess_part][$cb[0].id] = $cb[0].checked;
								return false;
							})
							.appendTo($moscow2);
						$item.data('layer', $layer);
						moscow2[id].$layer = $layer;
					}
				});
				$moscow2.appendTo($moscow2_block);
				var re = /id_(\w+)/;
				$('map[name=moscow2_map] area')
					.each(function() {
						var $this = $(this),
							arr = re.exec(this.className),
							id = arr[1];
						if (moscow2[id] && moscow2[id].$cb) $this
							.data('id', id)
							.data('$cb', moscow2[id].$cb)
							.data('$label', moscow2[id].$label)
							.data('$layer', moscow2[id].$layer)
							.attr('title', moscow2[id][0]);
					})
					.click(function() {
						var $this = $(this),
							$cb = $this.data('$cb'),
							$label = $this.data('$label'),
							$layer = $this.data('$layer');
						if ($cb) {
							$cb[0].checked = !$cb[0].checked;
							$layer.add($label).add($label.parent()).toggleClass('active', $cb[0].checked);
							sessvars[sess_part][$cb[0].id] = $cb[0].checked;
						}
						return false;
					});
			}
			if ($road_block.length) {
				var $roadmap_lines = $('<div id="roadmap_lines" />'),
					$roadmap_button = $select_button
						.clone()
						.click(function(e) {
							$('#modalClose').trigger('click');
						}),
					$clear_button = $('<span class="clear_ext">Очистить</span>')
						.appendTo($road_block),
					$roadmap = $('<div id="roadmap" />')
						.append($roadmap_lines)
						.append($roadmap_button),
					road_index = {};
				for (var reg in road) {
					for (var id in road[reg]) {
						if ((id+'').length) {
							road[reg][id].reg = reg;
							road_index[id] = road[reg][id];
						}
					}
				}
				var $labels = $('li li label', $road_block).each(function(index, item) {
					var $item = $(item),
						$cb = $('input', $item),
						id = $cb.val(),
						arr = road_index[id];
					if (typeof(road_index[id]) == UNDEF) return;
					road_index[id].$cb = $cb;
					road_index[id].$label = $item;
					if (arr && $cb.length) {
						var
							$layer = $('<span class="layer"></span>')
								.css({
									left: arr[1],
									top: arr[2],
									width: arr[3],
									height: arr[4],
									backgroundPosition: '-' + arr[5] + 'px -' + arr[6] + 'px'
								})
								.attr('title', arr[0])
								.appendTo($roadmap);
						$item.data('layer', $layer);
						road_index[id].$layer = $layer;
					}
				});
				$roadmap.prependTo($road_block);
			}
			var page_class = $('#page').attr('class');
			$('h6', $exts).each(function(index, item) {
				var $item = $(item);
				$item.colorbox({
					href: $item.parent(),
					inline: true,
					className: 'form',
					fixedHeight: '75%',
					minInnerWidth: 200,
					className: page_class + ' form filter'
				}, function() {
					var
						$mlc = $('#modalLoadedContent'),
						$mc = $('#modalContent');
					$mlc.css({
						height: parseInt($mlc.css('height')) - 60
					});
					if (!$mc.data('button_added')) {
						$mc
							.append(
								$select_button
									.clone()
									.click(function(e) {
										$('#modalClose').trigger('click');
									})
							)
							.data('button_added', true);
					}
					$('#colorbox').one('close', function() { load_list(); });
				});
			});
			var
				ie6 = (!+"\v1") && (typeof XMLHttpRequest == UNDEF);
			$('h6', $metro_block).colorbox({
				href: $metro_block,
				inline: true,
				fixedHeight: ie6 ? 777 : 757,
				fixedWidth: 650,
				className: page_class + ' form ext'
			}, function() {
				$('#colorbox').one('close', function() { load_list(); });
			});
			$('h6', $moscow_block).colorbox({
				href: $moscow_block,
				inline: true,
				fixedHeight: ie6 ? 753 : 723,
				fixedWidth: 590,
				className: page_class + ' form ext'
			}, function() {
				$('#colorbox').one('close', function() { load_list(); });
			});
			$('h6', $moscow_center_block).colorbox({
				href: $moscow_center_block,
				inline: true,
				fixedHeight: ie6 ? 753 : 723,
				fixedWidth: 640,
				className: page_class + ' form ext'
			}, function() {
				$('#colorbox').one('close', function() { load_list(); });
			});
			$('h6', $moscow2_block).colorbox({
				href: $moscow2_block,
				inline: true,
				fixedHeight: ie6 ? 466 : 436,
				fixedWidth: 640,
				className: page_class + ' form ext'
			}, function() {
				$('#colorbox').one('close', function() { load_list(); });
			});
			$('h6', $road_block).colorbox({
				href: $road_block,
				inline: true,
				fixedHeight: 600,
				fixedWidth: 654,
				className: page_class + ' form ext road'
			}, function() {
				$('#colorbox').one('close', function() { load_list(); });
			});
			var f1 = function(index, item) {
				var $item = $(item),
					$li = $(item.parentNode.parentNode),
					$label = $(item.parentNode),
					$name = $label.data('name'),
					$circle = $label.data('circle'),
					$layer = $label.data('layer');
				if (sess_loaded) $li.toggleClass('active', item.checked = !!sessvars[sess_part][item.id]);
				else item.checked = (sessvars[sess_part][item.id] = $li.hasClass('active'));
				if ($name && $name.length) $name.toggleClass('active', item.checked).css({opacity: item.checked ? 1 : opacity});
				if ($circle && $circle.length) $circle.toggleClass('active', item.checked);
				if ($layer && $layer.length) $layer.toggleClass('active', item.checked);
			}
			var f2 = function(event) {
				var $this = $(this),
					$li = $(this.parentNode.parentNode),
					$label = $(this.parentNode),
					$name = $label.data('name'),
					$circle = $label.data('circle'),
					$layer = $label.data('layer');
				$li.add($label).toggleClass('active', sessvars[sess_part][this.id] = this.checked);
				if ($name && $name.length) $name.toggleClass('active', this.checked).css({opacity: this.checked ? 1 : opacity});;
				if ($circle && $circle.length) $circle.toggleClass('active', this.checked);
				if ($layer && $layer.length) $layer.toggleClass('active', this.checked);
			};
			$('.ext input', $filter).each(f1).click(f2).click(function() {
				if ($(this).parents('#filter').length && !this.checked) load_list();
			});
			$('li[class^=reg]>label input', $road_block).click(function() {
				var
					$this = $(this),
					checked = this.checked;
				if ($this.parents('#colorbox').length) {
					$('li input', $this.parents('li')).each(function() {
						this.checked = checked;
						$(this).triggerHandler('click');
					});
				}
			});
			$('.clear_ext').click(function(e) {
				$parent = $(this).parents('.ext');
				$('input:checked', $parent).each(function(index, item) {
					var $item = $(item),
						$li = $(item.parentNode.parentNode),
						$label = $(item.parentNode),
						$name = $label.data('name'),
						$circle = $label.data('circle'),
						$layer = $label.data('layer');
					item.checked = false;
					$li.add($label).toggleClass('active', sessvars[sess_part][item.id] = item.checked);
					if ($name && $name.length) $name.toggleClass('active', item.checked).css({opacity: item.checked ? 1 : opacity});;
					if ($circle && $circle.length) $circle.toggleClass('active', item.checked);
					if ($layer && $layer.length) $layer.toggleClass('active', item.checked);
				});
				$parent.removeClass('filled');
				load_list();
			});
		}

		// Слайдеры
		/*
			TODO Исправить поведение при вводе в поле «От» числа большего, чем «До»
			TODO Исправить в IE6: ползунок выезжает вправо, деления ставятся не точно
		*/
		var $intervals = $('#filter fieldset.interval');
		if ($intervals.length) {
			var re_grid = new RegExp('\\bgrid((?:_[\\d\.]+)+)\\b', 'i'),
				re_w = new RegExp('\\bw_(\\d+)_(\\d+)\\b', 'i'),
				re_mod = new RegExp('\\bmod_(\\d+)\\b', 'i'),
				re_valute = new RegExp('\\b(rub|usd|eur)\\b', 'i'),
				Control = function($slider, $units) {
					this.$slider = $slider;
					this.grid = [];
					this.mod = 1;
					this.convert = 1;
					this.from = 0;
					this.to = 0;
					if ($units) {
						this.$units = $units;
						this.id = $units.parent().attr('id');
						this.convert = parseFloat($units.attr('value'), 10) || this.convert;
						this.label = $.trim($units.attr('title') || $units.text()) || '';
						var arr = re_grid.exec(this.$units.attr('class')),
							i = 0, len, k;
						if (arr && (arr.length > 1)) {
							arr = arr[1].replace(/^_/, '').split('_');
							if (arr && (len = arr.length)) {
								for (; i < len; i++) if (!isNaN(k = parseFloat(arr[i], 10))) this.grid.push(k);
							}
						}
						arr = re_mod.exec(this.$units.attr('class'));
						if (arr && (arr.length > 1)) this.mod = parseFloat(arr[1], 10) || this.mod;
						arr = re_valute.exec(this.$units.attr('class'));
						if (arr && (arr.length > 1)) this.valute = arr[1] || 'rub';
						if (this.label.length) {
							this.$label = $('<span class="label" />')
								.text(this.label)
								.prependTo(this.$slider.parent());
						}
					}
				};
			Control.prototype.make_grid = function() {
				if (!this.grid.length) return this;
				if (!this.$grid) {
					var i = 0,
						len = this.grid.length,
						min = this.$slider.slider('option', 'min'),
						max = this.$slider.slider('option', 'max'),
						w = max - min,
						left;
					if (w > 0) {
						this.$grid = $('<ul class="grid" />')
							.prependTo(this.$slider);
						for (; i < len; i++) {
							left = (this.grid[i] * this.mod * this.convert - min) * 100 / w;
							// Ограничение справа убрано для возможной установки валюты, округленной в большую сторону
							if (left >=0 /*&& left <= 100*/) $('<li />')
								.append($('<span />').html(((i == len - 1)/* && (this.grid[i] * this.mod * this.convert == max)*/ ? '<small>&gt;</small>' : '') + this.grid[i]))
								.css('left', left + '%')
								.appendTo(this.$grid);
						}
					}
				}
				return this;
			};
			Control.prototype.show = function() {
				this.make_grid();
				if (this.$grid) this.$grid.show();
				if (this.$label) this.$label.show();
				if (this.id && this.valute) {
					$('#search_results, #gmap')
						.removeClass(this.id + '_rub')
						.removeClass(this.id + '_usd')
						.removeClass(this.id + '_eur')
						.addClass(this.id + '_' + this.valute);
				}
				return this;
			};
			Control.prototype.hide = function() {
				if (this.$grid) this.$grid.hide();
				if (this.$label) this.$label.hide();
				return this;
			}
			Control.prototype.grid_min = function() {
				return this.grid.length ? this.grid[0] : 0;
			};
			Control.prototype.grid_max = function() {
				return this.grid.length ? this.grid[this.grid.length - 1] : 100;
			};
			$intervals.each(function(index, item) {
				var $item = $(item),
					$slider = $('<div />').appendTo($('<div class="slider2" />').prependTo($item)).append('<div class="end" />'),
					$from = $('.from input', $item).data('index', 0),
					$from_p = $('<input />')
						.attr('name', $from.attr('name').replace('from', 'from_p'))
						.hide()
						.insertAfter($from),
					$to = $('.to input', $item).data('index', 1),
					$to_p = $('<input />')
						.attr('name', $to.attr('name').replace('to', 'to_p'))
						.hide()
						.insertAfter($to),
					$select = $('.units select:first', $item),
					$units = $('.units select:first option', $item),
					control = null,
					arr = re_w.exec($item.attr('class')),
					sliders = [];
				if (!$units.length) $units = $('.units', $item);
				if (sess_loaded) {
					$from.val(sessvars[sess_part][$from[0].id] || $from.val());
					$to.val(sessvars[sess_part][$to[0].id] || $to.val());
					if ($select.length) $select[0].selectedIndex = parseInt(sessvars[sess_part][$select[0].id], 10) || 0;
				}
				else {
					sessvars[sess_part][$from[0].id] = $from.val();
					sessvars[sess_part][$to[0].id] = $to.val();
					if ($select.length) sessvars[sess_part][$select[0].id] = $select[0].selectedIndex;
				}
				$slider.slider({
					range: true,
					min: parseInt(arr ? arr[1] : $from.val(), 10),
					max: parseInt(arr ? arr[2] : $to.val(), 10),
					values: [$from.val(), $to.val()],
					slide: function(event, ui) {
						var s = control.grid_max() * control.mod > 100 ? 0 : 1,
							v1 = (ui.values[0] / control.convert).toFixed(s),
							v2 = (ui.values[1] / control.convert).toFixed(s);
						$from.val(sessvars[sess_part][$from[0].id] = v1);
						$to.val(sessvars[sess_part][$to[0].id] = v2);
					}
				});
				$slider
					.data('$from_p', $from_p)
					.data('$to_p', $to_p)
					.data('$range', $('.ui-slider-range', $slider));
				sliders.push($slider);
				$units.each(function(u_index, u_item) {
					var $unit = $(u_item),
						obj = new Control($slider, $unit);
					$unit.data('control', obj);
					if (($units.length == 1) || $unit.is(':selected') || $unit.hasClass('active')) control = obj;
				});
				$select.change(function(event, norec) {
					$units.each(function(u_index, u_item) {
						$(u_item).data('control').hide();
					});
					var obj = $($select[0].options[$select[0].selectedIndex]).data('control').show(),
						s = obj.grid_max() * obj.mod > 100 ? 0 : 1,
						v1 = ($from.val() * control.convert / obj.convert).toFixed(s),
						v2 = ($to.val() * control.convert / obj.convert).toFixed(s);
					$from.val(sessvars[sess_part][$from[0].id] = v1);
					$to.val(sessvars[sess_part][$to[0].id] = v2);
					sessvars[sess_part][$select[0].id] = $select[0].selectedIndex;
					control = obj;
					if (!norec) {
						var
							$other = $('.units select[id^=price]').not($select).eq(0);
						if ($other.length) {
							$other[0].selectedIndex = $select[0].selectedIndex;
							$other.trigger('change', [true]);
							$($other[0].options[$other[0].selectedIndex]).trigger('jss_select');
						}
					}
				}).change();
				if (control == null) control = new Control($slider, $units.eq(0));
				control.show();
				$to.add($from).change(function(event) {
					var 
						$this = $(this),
						val = parseFloat($this.val(), 10) || 0,
						ind = $this.data('index'),
						min = $slider.slider('option', 'min'),
						max = $slider.slider('option', 'max'),
						real = val * control.convert;
					sessvars[sess_part][this.id] = val;
					$slider.slider('values', ind, Math.min(max, Math.max(min, real)));
				}).change()
				for (var i in sliders) {
					sliders[i]
						.bind('update_percents', function() {
							var
								$this = $(this),
								$range = $this.data('$range'),
								$from_p = $this.data('$from_p'),
								$to_p = $this.data('$to_p');
							if ($range.length) {
								var
									l = parseFloat($range.css('left')),
									w = parseFloat($range.css('width'));
								$from_p.val(l);
								$to_p.val(l + w);
							}
						})
						.trigger('update_percents')
						.bind('slidechange', function(event, ui) {
							$(this).trigger('update_percents');
							load_list();
						});
				}
			});
		}
		load_list(true);
	}

	// Стилизованные списки
	/*
		TODO При первом открытии списка не показывается рамка в IE6 (??)
	*/
	$.fn.js_select = function(parent) {
		return this.each(function(index, item) {
			if (item.nodeName.toLowerCase() != 'select') return;
			var $select = $(item),
				$opts = $('option', $select),
				$jss = $('<div class="js_select" />'),
				$ul = $('<ul />').appendTo($jss.click(function(event) {
					$ul.toggle();
					return false;
				})),
				$active = $('<span />').appendTo($('<div />').prependTo($jss));
			if ($select.hasClass('big')) $jss.addClass('js_select_big');
			$select
				.data('jss', $jss)
				.width($select.width() + ($.browser.msie || $.browser.opera ? 10 : 0));
			$opts.each(function(index, item) {
				var
					$item = $(item),
					$li = $('<li ' + ($item.is(':selected') ? 'class="active"' : '') + '/>').append(
						$('<a href="#" />')
							.html($item.html())
							.data('value', $item.val())
							.click(function(event) {
								var $this = $(this);
								$item.trigger('jss_select');
								$select.val($this.data('value')).change();
								return false;
							})
					).appendTo($ul);
				$item
					.data('jss_li', $li)
					.bind('jss_select', function() {
						var
							$this = $(this),
							$li = $this.data('jss_li');
						$('.active', $ul).removeClass('active');
						$li.addClass('active');
						$ul.hide();
					});
			});
			$select.change(function(event) {
				$active.html($(':selected', $select).html());
			}).change();
			if (parent) {
				var pos = $select.rel_offset(parent);
				if (pos && pos.parent) $(pos.parent).append($jss.css({
					left: pos.left,
					top: pos.top
				}));
				else $jss.insertAfter($select);
			}
			else $jss.insertAfter($select);
			$W.resize(function(event) {
				$jss.css('width', $select.width());
				$ul.css('width', $jss.width()-10);
			}).resize();
			$select.css('visibility', 'hidden');
		});
	};
	$('#content select').js_select('\v'=='v' ? 'form' : null);
	$('#panel select').js_select('\v'=='v' ? 'fieldset' : null);

	// подписка на новости
	var $sub_link = $('a.subscribe_news'),
		$sub_form = $('form#subscribe_news');
	if ($sub_link.length && $sub_form.length) {
		$sub_link.colorbox({
			inline: true,
			href: '#subscribe_news',
			disableArrows: true
		});
	}

	// Сортировка таблицы
	$.tablesorter.addParser({
		id: 'estatet', 
		is: function(s) { return true; },
		format: function(s) { return parseFloat(s);	},
		type: 'numeric' 
	});
	$('.ctable.empty table').tablesorter({
		cssAsc: 'headerSortDown',
		cssDesc: 'headerSortUp',
		widgets: ['zebra']
	});

	function Paste() {
		var objDoc=document.createElement("TextArea");
		document.body.appendChild(objDoc);
		objDoc.focus();
		document.execCommand('paste');
		ret = objDoc.value;
		document.remove(objDoc);
		return ret;
	}
	$('#dishiderbtn').click(function(){
		$('#dishider').show().css('display', 'inline');
		$(this).hide();
		return false;
	});

	// Отправка заявки
	$('#reality_request').bind('click', function () {
		if (req_sent == false) {
			var form = $(this).parents('form');
			var url = $(form).attr('action');
			$.post(url, $(form).serialize(), function (data) {
				var res = '<b>Заявка успешно отправлена</b>';
				if (data == 'ERR_CAPTCHA') {
					res = '<span style="color: #DC1921;"><b>Код с картинки введен неверно</b></span>';
				} else if (data == 'ERR_FLD') {
					res = '<span style="color: #DC1921;"><b>Не все поля заполнены</b></span>';
				} else {
					req_sent = true;
					alert($(res).text());
					$('#modalClose').trigger('click');
					return true;
				}
				$('#reality_req_result').html(res);

			});
		}
		return false;
	});

	// Плейсхолдеры
	var $placeholder = $('input.placeholder');
	if ($placeholder.length) {
		$placeholder
			.focus(function (event) {
				var $this = $(this);
				if ($this.val() == $this.attr('title')) $this.val('');
			})
			.blur(function (event) {
				var $this = $(this);
				if ($.trim($this.val()) == '') $this.val($this.attr('title'));
			});
	}
});