;(function($) {
	
	$.fn.extend({
		
		flash: function(message, is_error) {
			var self = this;
			self.html(message);
			if (is_error == true) {
				self.addClass("flash-error");
			} else {
				self.removeClass("flash-error");
			}
			
			self.find(".login-link").click(function(e) {
				var email = self.find(".login-link").attr('email').replace('#', '');
				$("#loginForm input[name=email]").focus();
				$("#loginForm input[name=email]").val(email);
			});
			self.find(".password-link").click(function(e) {
				var email = self.find(".password-link").attr('email').replace('#', '');
				$("#forget").showPopup({afterShow: function(e) {
					$('#formRestorePassword_email').focus();
					$('#formRestorePassword_email').val(email);
				}});
			});
			
			self.fadeIn("fast").fadeOut("fast").fadeIn("fast").fadeOut("fast").fadeIn("fast");
			
			$().click(function(e){
				self.fadeOut("fast");
			});
		},
		
		ajaxLoader: function(bShow, options) {
			return this.each(function() {
				options = options || {};
				
				if (bShow && options.opacity == true) {
					$(this).addClass('opacity');
				} else {
					$(this).removeClass('opacity');
				}
				if (this._loader) {
					this._loader.remove();
				}
				if (bShow) {
					this._loader = $('<img class="ajax-loader" src="/images/ajax-loader.gif" width="16" height="16" alt="Загрузка..." title="Загрузка..." />');
					var pos = $(this).offset();					
					if (options.pos == "left") {
						var left = Math.round(pos.left - 30);
						var top = Math.round(pos.top + $(this).innerHeight() / 2 - 8);						
					} else {
						var left = Math.round(pos.left + $(this).innerWidth() / 2 - 8);
						var height = $(this).innerHeight();
						if (height > 200) height = 200;
						var top = Math.round(pos.top + height / 2 - 8);
					}
					this._loader.css({ left: left, top: top });
					$("body").append(this._loader);
				}
			});
		},
		
		placeholder: function(text, stayOnFocus) {
			var self = this;
			if (!$(self).val() || $(self).val() == text) {
				$(self).val(text);
				$(self).addClass ("placeholder");
			}
			$(self).focus(function () {
				if (!$(self).val() || $(self).val() == text) {
					if (!stayOnFocus) {
						$(self).val("");
					}
					$(self).removeClass ("placeholder");
				}
			}).blur(function () {
				if (!$(self).val() || $(self).val() == text) {
					$(self).val(text);
					$(self).addClass ("placeholder");
				}
			});
			$(self).parents('form').submit(function(e){
				if (!stayOnFocus) {
					if (!$(self).val() || $(self).val() == text) {
						$(self).val("");
					}
				}
			});
		},
		
		favorite: function() {
			return this.each(function() {
				$(this).click (function (event) {
					if (!$(this).hasClass('favorite-active')) {
						$("#favorites .favorite").addClass("favorite-active");
						$("#favorites .favorite").attr("title", "Убрать из командировки");
					}
					params = { id: $(this).attr("id") };
					$.post("/engine/favorites.php", params,
						function(data){
							var city_id = $("#favorites").attr("city_id");
							var type_id = $("#favorites").attr("type_id");
							$.ajax({
								type: "GET",
								url: "/engine/favorites.php",
								data: {
									action: "get_count",
									city_id: city_id || 0,
									type_id: type_id || 0
								},
								success: function(msg)
								{
									if (msg == "1") {
										$("#favorites .favorite").addClass("favorite-active");
										$("#favorites .favorite").attr("title", "Убрать из командировки");
									} else {
										$("#favorites .favorite").removeClass("favorite-active");
										$("#favorites .favorite").attr("title", "Добавить в командировку");
									}
								}
							});
						}
					);
					var is_active = $(this).hasClass("favorite-active");
					if (is_active) {
						$(this).removeClass("favorite-active");
						$("#" + $(this).attr("id").replace("fav", "favpopup")).removeClass ("favorite-active");
						$("#" + $(this).attr("id").replace("fav", "favpopup")).attr("title", "Добавить в командировку");
						$("#" + $(this).attr("id").replace("favpopup", "fav")).removeClass ("favorite-active");
						$("#" + $(this).attr("id").replace("favpopup", "fav")).attr("title", "Добавить в командировку");
					} else {
						$(this).addClass("favorite-active");
						$("#" + $(this).attr("id").replace("fav", "favpopup")).addClass ("favorite-active");
						$("#" + $(this).attr("id").replace("fav", "favpopup")).attr("title", "Убрать из командировки");
						$("#" + $(this).attr("id").replace("favpopup", "fav")).addClass ("favorite-active");
						$("#" + $(this).attr("id").replace("favpopup", "fav")).attr("title", "Убрать из командировки");
					}
				});
			});
		},
		
		recommend: function() {
			return this.each(function() {
				$(this).click (function (event) {
					params = { id: $(this).attr("id") };
					$.post("/engine/recommend.php", params,
						function(data){
						}
					);
					var is_active = $(this).hasClass("recommend-active");
					if (is_active) {
						$(this).removeClass("recommend-active");
						$("#" + $(this).attr("id").replace("recommend", "recommendpopup")).removeClass ("recommend-active");
						$("#" + $(this).attr("id").replace("recommend", "recommendpopup")).attr("title", "Отметить как рекомендованное");
						$("#" + $(this).attr("id").replace("recommendpopup", "recommend")).removeClass ("recommend-active");
						$("#" + $(this).attr("id").replace("recommendpopup", "recommend")).attr("title", "Отметить как рекомендованное");
					} else {
						$(this).addClass("recommend-active");
						$("#" + $(this).attr("id").replace("recommend", "recommendpopup")).addClass ("recommend-active");
						$("#" + $(this).attr("id").replace("recommend", "recommendpopup")).attr("title", "Убрать отметку о рекомендации");
						$("#" + $(this).attr("id").replace("recommendpopup", "recommend")).addClass ("recommend-active");
						$("#" + $(this).attr("id").replace("recommendpopup", "recommend")).attr("title", "Убрать отметку о рекомендации");
					}
				});
			});
		},
		
		ajaxPopup: function(id, url, params, options) {
			var popup = new AjaxPopuper(id, url, params, options);
			
			return this.each(function() {
				
				var _pos = $(this).offset();
				_pos.left -= 20;
				_pos.top += 25;
				
				options = options || [];
				var pos = options.pos || _pos;
				
				this.popup = popup;
				this.pos = pos;
				popup.setPos(pos);
				
				$(this).click(function(event) {
					event.stopPropagation();
					event.preventDefault();
					popup.show(pos, false, this);
				});
				
				if (options.show) {
					popup.show(pos, false, this);
				}
			});
		},
		
		showPopup: function(options) {
			return this.each(function() {
				$(this.popup.options).extend(this.popup.options, options || {});
				this.popup.show(null, false, this);
			});
		},
		
		removePopup: function() {
			return this.each(function() {
				this.popup.remove();
			});
		},
		
		companyPopup: function() {
			
			var org_id = $(this).attr("orgid");
			var type_id = $(this).attr("typeid");
			var pos = $(this).offset();
			pos.left -= 20;
			pos.top += 25;
			var self = this;
			$(this).ajaxPopup("infoblock-" + org_id, "/lib/templates/popup-company.php", { id: org_id, type_id: type_id }, {
				beforeLoad: function(popup) {
					$(self).ajaxLoader(true, { opacity: true, pos: "left" });
				},
				afterLoad: function(popup) {
					$(self).ajaxLoader(false);
					$(popup).find(".favorite").favorite();
					$(popup).find(".recommend").recommend();

					// Всплывающая форма отзыва
					$(popup).find(".vote button").votePopup(org_id, this);
					// Всплывающая форма "я - владелец"
					$(popup).find(".owner-request").ownerRequestPopup(org_id, this);
				},
				beforeShow: function(popup) {
					$(".popup").parent().hide();
				},
				afterShow: function(popup) {
				},
				beforeHide: function(popup) {
					$('.vote-popup').parent().hide();
					$('.owner-request-popup').parent().hide();
				},
				pos: pos
			});
		},
		
		votePopup: function(org_id, initiator, options) {
			options = options || {};
			return $(this).ajaxPopup("vote-popup" + org_id, "/lib/templates/popup-vote.php", { comment_id: options.comment_id || 0}, {
				beforeLoad: function(popup, initiator) {
					$(initiator).ajaxLoader(true, { opacity: true, pos: "left" });
				},
				afterLoad: function (popup, initiator) {
					$(initiator).ajaxLoader(false);
					
					if (options.comment_id > 0) {
						$(popup).find("input[name=comment_id]").val(options.comment_id);
					}
					if (options.trip_id > 0) {
						$(popup).find("input[name=trip_id]").val(options.trip_id);
					}
					if (options.type_id > 0) {
						$(popup).find("input[name=type_id]").val(options.type_id);
					}
					
					var self = this; // ссылка на объект AjaxPopuper для votePopup
					
					$(popup).find("form input[name=email]").blur(function(e){
						var name = $(popup).find("form input[name=name]");
						if (!name.val()) {
							var parts = $(this).val().split('@');
							name.val(parts[0]);
						}
					});
					
					$(popup).find("form").submit(function(e) {
						
						if(!$(this).find("textarea[name=message]").val()) {
							$(popup).find(".error").html("Нет уж, сначала напишите что-нибудь!").show();
							$(this).find("textarea[name=message]").focus();
							return false;
						}
						if($(this).find("input[name=email]").size() > 0)
						{
							if(!$(this).find("input[name=email]").val()) {
								$(popup).find(".error").html("Пожалуйста, укажите ваш e-mail!").show();
								$(this).find("input[name=email]").focus();
								return false;
							}
						}
						
						var data = "action=add&" + $(this).serialize();
						$.ajax({
							type: "POST",
							url: "/engine/comments.php",
							data: data,
							success: function(msg)
							{
								if(!msg) msg = "{}";
								eval("var msg = " + msg + ";");
								if (msg.status == "ok") {
									options.comment_id = msg.comment_id;
									$(popup).find("input[name=comment_id]").val(msg.comment_id);
									if (options && options.success) {
										popup.comment_id = msg.comment_id;
										options.success.call(self, popup);
									}
									
									(options.dontReload) ? self.hide() : self.remove();
									if (initiator) {
										$('#guide div.title a[orgid=' + org_id + ']').removePopup();
										$("#flash").flash("Комментарий добавлен");
										$('#guide div.title a[orgid=' + org_id + ']').showPopup();
										
										$("#org_rating_" + org_id).load("/lib/templates/org-rating.php?org_id=" + org_id);
									}
									$('#top-area .userblock').load("/lib/templates/userblock.php");
								} else if (msg.error) {
									$(popup).find(".error").html(msg.error).show();
									
									$(popup).find(".error .login-link").click(function(e) {
										$(".popup").parent().hide();
										var email = $(popup).find(".error .login-link").attr('email').replace('#', '');
										$("#loginForm input[name=email]").focus();
										$("#loginForm input[name=email]").val(email);
									});
									$(popup).find(".error .password-link").click(function(e) {
										$(".popup").parent().hide();
										var email = $(popup).find(".error .password-link").attr('email').replace('#', '');
										$("#forget").showPopup({afterShow: function(e) {
											$('#formRestorePassword_email').focus();
											$('#formRestorePassword_email').val(email);
										}});
									});
								}
							}
						});
						
						return false;
					});
				},
				beforeShow: function (popup, initiator) {
					
					/* $('.vote-popup').parent().hide(); */
					
					var rating = ($(initiator).html() == "-") ? "-1" : "1";
					
					$(initiator).parent().find("button[class*=i-plus]").removeClass("i-plus-active").addClass("i-plus");
					$(initiator).parent().find("button[class*=i-minus]").removeClass("i-minus-active").addClass("i-minus");
					$(initiator).addClass((rating == "-1") ? "i-minus-active" : "i-plus-active");
					
					var pos = $(initiator).offset();
					pos.left -= 290;
					pos.top += 28;
					$(popup).css(pos);
					
					$(popup).find(".error").hide();
					
					$(popup).find("input[name=org_id]").val(org_id);
					$(popup).find("input[name=rating]").val(rating);
					
				},
				afterShow: function (popup, initiator) {
					$(popup).find("textarea").focus();
				},
				beforeHide: function (popup, initiator) {
					if (!options.comment_id) {
						$(this.initiator).parent().find("button[class*=i-plus]").removeClass("i-plus-active").addClass("i-plus");
						$(this.initiator).parent().find("button[class*=i-minus]").removeClass("i-minus-active").addClass("i-minus");
					}
				}
			});
		},

		ownerRequestPopup: function(org_id, initiator) {
			return $(this).ajaxPopup("request_" + org_id, "/lib/templates/popup-owner-request.php", { org_id: org_id }, {
				beforeLoad: function(popup, initiator) {
					$(initiator).ajaxLoader(true, { opacity: true, pos: "left" });
				},
				afterLoad: function (popup, initiator) {
					$(initiator).ajaxLoader(false);
					
					var self = this; // ссылка на объект AjaxPopuper для ownerRequestPopup
					
					$(popup).find("form input[name=email]").blur(function(e){
						var name = $(popup).find("form input[name=name]");
						if (!name.val()) {
							var parts = $(this).val().split('@');
							name.val(parts[0]);
						}
					});
					
					$(popup).find("form").submit(function(e) {
						
						if(!$(this).find("input[name=email]").val()) {
							$(popup).find(".error").html("Пожалуйста, укажите e-mail!").show();
							$(this).find("input[name=email]").focus();
							return false;
						}
						if(!$(this).find("input[name=name]").val()) {
							$(popup).find(".error").html("Пожалуйста, укажите ваше имя!").show();
							$(this).find("input[name=name]").focus();
							return false;
						}
						
						var data = "action=request&" + $(this).serialize();
						$.ajax({
							type: "POST",
							url: "/engine/owner-request.php",
							data: data,
							success: function(msg)
							{
								if(!msg) msg = "{}";
								eval("var msg = " + msg + ";");
								if (msg.status == "ok") {
									self.remove();
									flash("Запрос успешно отправлен! Наш менеджер свяжется с вами для проверки и уточнения информации.");
									$('#top-area .userblock').load("/lib/templates/userblock.php");
								} else if (msg.error) {
									$(popup).find(".error").html(msg.error).show();
									
									$(popup).find(".error .login-link").click(function(e) {
										$(".popup").parent().hide();
										var email = $(popup).find(".error .login-link").attr('email').replace('#', '');
										$("#loginForm input[name=email]").focus();
										$("#loginForm input[name=email]").val(email);
									});
									$(popup).find(".error .password-link").click(function(e) {
										$(".popup").parent().hide();
										var email = $(popup).find(".error .password-link").attr('email').replace('#', '');
										$("#forget").showPopup({afterShow: function(e) {
											$('#formRestorePassword_email').focus();
											$('#formRestorePassword_email').val(email);
										}});
									});
								}
							}
						});
						
						return false;
					});
				},
				beforeShow: function (popup, initiator) {
					var pos = $(initiator).offset();
					pos.left -= 25;
					pos.top += 25;
					$(popup).css(pos);
					
					$(popup).find(".error").hide();
				}
			});
		},
		
		addressPopup: function() {
			var self = $(this);

			var org_id = self.attr("org_id");

			var geo = self.attr("geo");
			if (!geo) {
				$(self).removeAttr("href");
				return;
			}
			
			var pos = self.offset();
			pos.left -= 15;
			pos.top += 25;
			
			var items = [{
				type: self.attr("type"),
				title: self.parents("tr").find(".title a").html(),
				address: self.html(),
				geo: geo.split(","),
				expanded: false
			}];
			
			self.ajaxPopup("address-popup_" + org_id, "/lib/templates/popup-map.php?id=", { org_id: org_id}, {
				beforeLoad: function(popup) {
					self.ajaxLoader(true, { opacity: true, pos: "left" });
				},
				afterLoad: function(popup) {
					self.ajaxLoader(false);
				},
				beforeShow: function(popup) {
					$(".popup").parent().hide();
				},
				afterShow: function (popup) {
					$(popup).find("span.title").html(items[0].title);
					$(popup).find("span.address").html(items[0].address);
					if (!self._map) {
						self._map = new GMapManager("map_small_" + org_id, { "items": items });
					}
				},
				pos: pos
			});
			self.hover(
				  function () { self.addClass('js-link-red'); }
				, function () { self.removeClass('js-link-red'); }
			);
		},
		
		saveTripPopup: function() {
			var _pos = $(this).offset();
			_pos.top -= 120;
			return $(this).ajaxPopup("save_trip", "/lib/templates/popup-save-trip.php", null, {
				pos: _pos,
				beforeShow: function (popup) {
					$(popup).find(".error").hide();
					
					$(popup).find("form input[name=email]").blur(function(e){
						var name = $(popup).find("form input[name=name]");
						if (!name.val()) {
							var parts = $(this).val().split('@');
							name.val(parts[0]);
						}
					});
					
					var self = this; // ссылка на объект AjaxPopuper для ownerRequestPopup
					
					$(popup).find("input[name=city_from]").val($("#from h2 span").html());
					$(popup).find("input[name=city_to]").val($("#to h2 span").html());
					$(popup).find("input[name=transport]").val($("#transport input").attr("value"));
					$(popup).find("input[name=period]").val($("#when h2 input").val());
					
					$(popup).find("form").submit(function(e) {
						
						if(!$(this).find("input[name=email]").val() && !$(this).find("input[name=phone]").val()) {
							$(this).find("input[name=email]").focus();
							return false;
						}
						
						var data = "action=save&" + $(this).serialize();
						$.ajax({
							type: "POST",
							url: "/engine/trips.php",
							data: data,
							success: function(msg)
							{
								if(!msg) msg = "{}";
								eval("var msg = " + msg + ";");
								if (msg.status == "ok") {
									self.remove();
									document.location.href = '/my/trips/?notice=added';
								} else if (msg.error) {
									$(popup).find(".error").html(msg.error).show();
									$(popup).find(".error .login-link").click(function(e) {
										$(".popup").parent().hide();
										var email = $(popup).find(".error .login-link").attr('email').replace('#', '');
										$("#loginForm input[name=email]").focus();
										$("#loginForm input[name=email]").val(email);
									});
									$(popup).find(".error .password-link").click(function(e) {
										$(".popup").parent().hide();
										var email = $(popup).find(".error .password-link").attr('email').replace('#', '');
										$("#forget").showPopup({afterShow: function(e) {
											$('#formRestorePassword_email').focus();
											$('#formRestorePassword_email').val(email);
										}});
									});
								} else {
									alert("Не удалось получить ответ от сервера");
								}
							}
						});
						
						return false;
					});
				}
			});
		},
		
		passwordPopup: function() {
			return $(this).ajaxPopup("password_popup", "/lib/templates/popup-password.php", null, {
				beforeLoad: function(popup, initiator) {
					$(initiator).ajaxLoader(true, { opacity: true, pos: "left" });
				},
				afterLoad: function(popup, initiator) {
					$(initiator).ajaxLoader(false);
					var self = this;
					$(popup).find("form").submit(function(e) {
						if(!$(this).find("input[name=email]").val()) {
							$(this).find("input[name=email]").focus();
							return false;
						}
					});
				},
				beforeShow: function (popup) {
					$(".popup").parent().hide();
				},
				afterShow: function (popup) {
					if (!$(popup).find("input[name=email]").val() && $("#loginForm input[name=email]").val() != "E-mail") {
						var val = $("#loginForm input[name=email]").val();
						$(popup).find("input[name=email]").val(val);
					}
					$(popup).find("input[name=email]").focus();
				}
			});
		},
		
		citySelector: function(options) {
			options = options || {};
			var selector = $(this);
			var span     = selector.find('span');
			var input    = selector.find('input[type=text]');
			var hidden   = selector.find('input[type=hidden]');

			var saveCustomValue = function () {
				if (!options.allowCustom) {
					return;
				}
				if (input.val() == span.html()) {
					return;
				}
				span.html(input.val());
				hidden.val('0');
				hidden.attr('city', '');
				input.hide();
				span.show();
			};

			input.hide();
			span.show();

			span.click(function() {
				if (input.val() == "Выберите город") {
					input.val('');
				}
				span.hide();
				if ('' != span.html() && hidden.val()) {
					hidden.attr('city', span.html());
				}
				input.show().select().focus();
				input.attr('haveResult', false);
			});

			var _cities = (options.all_cities) ? cities_from : cities_to;
			input.autocomplete(_cities, {
				autoFill: true,
				minChars: 0,
				formatItem: function(item) {
					return item.title;
				}
			});

			input.blur(function(event) {
				if (options.onBlur) {
					if (false === options.onBlur.call(selector, span, input, hidden)) {
						input.hide();
						span.show();
						return;
					}
				}
				if ('' == input.val()) {
					span.html('Выберите город');
					input.hide();
					span.show();
					return;
				}
				if ('true' == input.attr('haveResult')) {
					input.val(span.html());
					input.hide();
					span.show();
				} else {
					if (input.val() == hidden.attr('city')) {
						input.hide();
						span.show();
						return;
					}
					saveCustomValue();
				}
			});

			input.keypress(function(event) {
				if (event.which == 13) {
					saveCustomValue();
					event.preventDefault();
				}
			});

			input.result(function(event, data, value) {
				span.html(data.title);
				hidden.val(data.id);
				hidden.attr('city', data.title);
				if (options.redirect && data.slug) {
					document.location.href = "/" + data.slug + "/";
				}
				input.attr('haveResult', true);
				input.hide();
				span.show();

				if (options.onChange) {
					options.onChange.call(this, data);
				}
			});
			return this;
		},

		orgSelector: function(options) {
			options = options || {};
			var selector = $(this);
			var span     = selector.find('span');
			var input    = selector.find('input[type=text]');
			var hidden   = selector.find('input[type=hidden]');
			var defaults = function () {
				input.val('');
				hidden.val('0');
				span.html('Выберите гостиницу');
			};
			var saveCustomValue = function () {
				if (!options.allowCustom) {
					return;
				}
				if ('' == input.val()) {
					defaults();
					if (options.onChange) {
						options.onChange.call(this, input.val());
					}
					return;
				}
				if (input.val() == span.find('a').text()) {
					return;
				}

				span.html(input.val());
				hidden.val('0');
				if (options.onChange) {
					options.onChange.call(this, input.val());
				}
				input.hide();
				span.show();
			};

			input.hide();
			span.show().find('span').css({'display': 'block'});
			selector.find('a').click(function(event) {
				event.preventDefault();
			});

			span.click(function(event) {
				if (!options.notClear) {
					defaults();
				}
				input.attr('haveResult', false);
				span.hide();
				input.show();
				input.select().focus();
			});

			input.autocomplete('/engine/autocomplete.orgs.php', {
				delay: 2,
				autoFill: false,
				minChars: 2,
				extraParams: {
					city_id: options.city_id || 0,
					type_id: options.type_id || 0
				},
				formatItem: function(item) {
					return item[0];
				}
			});

			input.blur(function(event) {
				input.hide();
				if ('true' == input.attr('haveResult')) {
					if ('' == input.val()) {
						defaults();
						if (options.onChange) {
							options.onChange.call(this, null);
						}
					} else {
						input.val(span.find('a').text());
					}
				} else {
					saveCustomValue();
				}
				span.show();
			});

			input.keypress(function(event) {
				if (event.which == 13) {
					event.preventDefault();
					input.blur();
				}
			});

			input.result(function(event, data, value) {
				input.attr('haveResult', true);
				span.html(data[0]);
				hidden.val(data[1]);
				selector.find('a').click(function(event) {
					event.preventDefault();
				});
				input.blur();
				if (options.onChange) {
					options.onChange.call(this, data);
				}
			});
		},

		periodSelector: function(options) {
			var span = $(this).find("span");
			if (!span.size()) {
				return;
			}
			var input = span.parent().find("input");
			options = options || {};
			var dateRange = input.val().split('—');
			var date = null;
			var current = null;
			if (2 == dateRange.length) {
				date = [dateRange[0], dateRange[1]];
				current = dateRange[0];
			} else {
				date = '';
				current = '';
			}
			var datePickerOptions = {
				format: 'd/m/Y',
				flat: false,
				date: date,
				current: current,
				mode: 'range',
				starts: 1,
				onChange: function(formated, date) {
					var value = formated;
					input.attr("value", formated.join('—'));
					if (!options.show_years) {
						_parts = formated[0].split('/');
						formated[0] = _parts[0] + '/' + _parts[1];
						_parts = formated[1].split('/');
						formated[1] = _parts[0] + '/' + _parts[1];
					}
					span.html(formated.join('—'));
					if (options.onChange) {
						options.onChange.call(this, value, date);
					}
				}
			};
			for (property in options) {
				if ('onChange' == property) {
					continue;
				}
				datePickerOptions[property] = options[property];
			}
			span.DatePicker(datePickerOptions);
		},
		
		transportSelector: function(options) {
			options = options || {};
			var selector = $(this);
			selector.click(function (event) {
				event.stopPropagation();
				selector.active = $(selector.find('.active').get(0));
				$(window).click(function (){
					selector.find('li')
						.removeClass('show')
						.removeClass('active')
						.unbind("click")
					;
					selector.active.addClass('active');
				});
				selector.find('li').addClass('show').click(function (event) {
					event.stopPropagation();
					selector.active = $(this);
					$(window).click();
					$(this).unbind('click');
					selector.find('input').attr('value', $(this).attr('id'));
					if (options.onChange) {
						options.onChange.call(selector);
					}
				});
			});
			if (IE6) {
				selector.find("li").hover(
					  function() { $(this).addClass('hover'); }
					, function() { $(this).removeClass('hover'); }
				);
			}
		}
	});
	
	
	/*
	 * Класс AjaxPopup
	 */
	var AjaxPopuper = jQuery.Class.create({
		init: function(id, url, params, options){
			this.id = id;
			this.url = url;
			this.params = params || {};
			this.options = options || {};
			this.element = $("#" + this.id);
			this.isLoaded = false;
			this.pos = this.element.offset();
		},
		
		setPos: function(pos) {
			this.pos = pos;
			this.element.css(this.pos);
		},
		
		load: function(pos, initiator) {
			this.pos = pos || this.pos;
			var self = this;
			
			if (self.options.beforeLoad) {
				self.options.beforeLoad.call(self, self.element, initiator);
			}
			
			var response = function(data){
				self.element = $('<div id="' + self.id + '" style="position: absolute; display: none;">' + data + '</div>');
				$("body").append(self.element);
				
				self.initCloser(initiator);
				
				$(self.element).shadow();

				if (self.options.afterLoad) {
					self.options.afterLoad.call(self, self.element, initiator);
				}
				
				self.isLoaded = true;
				
				self.show(self.pos, true, initiator);
			};

			if (this.options.post) {
				$.post(this.url, this.params, response);
			} else {
				$.get(this.url, this.params, response);
			}
		},
		
		show: function (pos, dontLoad, initiator) {
			
			this.initiator = initiator;
			this.pos = pos || this.pos;
			
			if (!dontLoad && !this.element.size()) {
				this.load(this.pos, initiator);
			} else {
				
				if (!this.isLoaded) {
					this.initCloser();
					this.isLoaded = true;
				}
				
				this.setPos(this.pos);
				
				if (this.options.beforeShow) {
					this.options.beforeShow.call(this, this.element, initiator);
				}
				
				var is_vote_popup = this.element.find('.popup').hasClass('vote-popup');
				var is_owner_request_popup = this.element.find('.popup').hasClass('owner-request-popup');
				
				if (is_vote_popup || is_owner_request_popup) {
					$('.popup:not(.company-popup)').parent().hide();
				} else {
					$('.popup').parent().hide();					
				}
				
				this.element.fadeIn("fast");
				
				if (this.options.afterShow) {
					this.options.afterShow.call(this, this.element, initiator);
				}
			}
		},
		
		hide: function () {
			
			if (this.options.beforeHide) {
				this.options.beforeHide.call(this, this.element);
			}
			
			this.element.fadeOut("fast");
		},
		
		remove: function () {
			this.element.remove();
			this.element = $("#" + this.id);
			this.isLoaded = false;
		},
		
		initCloser: function () {
			var self = this;
			
			self.element.find(".close").click(function(e) {
				e.preventDefault();				
				self.hide();
			});
				
			$().click (function (event) {
				var target = $(event.target);
				if (!target.parents("#" + self.id).size() && !target.parents(".popup").size()) {
					self.hide();
				}
			});
		}
	});

})(jQuery);