var Status;
var Results;
var ResultPoint;
var Controls;
var RelatedLinks;
var SearchForm;
Event.bind('load.form', function(){
	RelatedLinks = (function(){
		var initRelatedLinks = function(holder){
			var self 		= this;
			self.holder = holder;
			self.holder.show();
			self.initFoundResults();
		}
		initRelatedLinks.prototype = {
			initFoundResults: function(){
				var self = this;
				self.holder.find('.found-results li').each(function(){
					var itemHolder 	= jQuery(this);
					var titleHolder = itemHolder.find('h2');
					titleHolder.html(Pattern('foundResults.a',{
						title: titleHolder.text(),
						id: itemHolder.find('em.id').text()
					}));
				});
			}
		}
		if (Env.get('igoogle')!='yes'){
			jQuery('#other-results').each(function(){
				new initRelatedLinks(jQuery(this));
			});
		}
	})();
	Controls = (function(){
		var controls = {
			zoom: function(control, content){
				var initZoom = function(){
					var self = this;
					self.defineCoords();
					self.buttons = {
						plus: 	content.find('.plus'),
						minus: 	content.find('.minus'),
						all: 		content.find('.all-city')
					}
					each(self.buttons, function(key, button){
						button.click(function(){
							var button = jQuery(this);
							if (!button.hasClass('zoom-disabled')){
								self.buttonHandlers[key](self);
								self.changeAll('disable');
							}
						});
					});
					self.checkButtons();
					Event.bind('map.changed', function(){
						self.checkButtons();
					});
					Event.bind('searchForm.finished', function(){
						self.checkButtons();
					});
					Event.bind('searchForm.started', function(){
						self.defineCoords();
					});
				}
				initZoom.prototype = {
					defineCoords: function(){
						var self = this;
						self.lat = Map.lat;
						self.lng = Map.lng;
						self.zoom = Map.zoom;
					},
					buttonHandlers: {
						plus:function(self){
							Map.setPosition(GPoint.toServer(self.lat), GPoint.toServer(self.lng), self.zoom-1);
							SearchForm.initSearch();
						},
						minus:function(self){
							Map.setPosition(GPoint.toServer(self.lat), GPoint.toServer(self.lng), self.zoom+1);
							SearchForm.initSearch();
						},
						all:function(self){
							var what = trim(SearchForm.input.what.val());
							if (what.length > 0){
								SearchForm.input.value(Pattern('advancedSearch.nearSearchPattern', {
									what: what,
									where: Pattern('main.city.name')
								}));
								SearchForm.submit();
							}
						}
					},
					changeAll: function(type){
						var self = this;
						self.setStatus({
								plus:  type,
								minus: type,
								all: 	 type
						});
					},
					setStatus: function(status){
						var self = this;
						for (var key in status){
							switch(status[key]){
								case 'enable':
									self.buttons[key].removeClass('zoom-disabled');
								break;
								case 'disable':
									self.buttons[key].addClass('zoom-disabled');
								break;
							}
						}
					},
					checkButtons: function(){
						var self = this;
						var status = {} 
						switch(Map.zoom){
							case 17: status = {
								plus:  'enable',
								minus: 'disable',
								all: 	 'enable'
							} 
							break;
							case 12: status = {
								plus:  'disable',
								minus: 'enable',
								all: 	 'disable'
							}
							break;
							default: status = {
								plus:  'enable',
								minus: 'enable',
								all: 	 'enable'
							}
						}
						self.setStatus(status);
					}
				}
				new initZoom();
			}
		}
		var initControls = function(main){
			var self 		= this;
			self.holder = main.find('.controls-holder');
			self.main 	= main;
			self.control = false;
			Event.bind('control.show', function(control){
				self.show(control);
				Event.notify('status.changed');
			})
		}
		initControls.prototype = {
			show: function(control){
				var self = this;
				if (isset(controls[control])){
					if (!self.control){
						self.control = jQuery(Pattern('control.'+control));
						controls[control](self, self.control);
						self.control.appendTo(self.holder);
						self.main.show();
					}
				}else{
					alert('No control '+control);
				}
			}
		}
		jQuery('#controls').each(function(){
			new initControls(jQuery(this));
		});
	})();
	Status = (function(){
		var initStatus = function(main){
			var self 		= this;
			self.main 	= main;
			self.arrow 	= self.main.find('.arrow');
			self.holder = self.main.find('.status-holder');
			self.initArrow();
		}
		initStatus.prototype = {
			suggestZoom: function(){
				var self = this;
				if (Map.zoom < 17){
					var suggestElement = jQuery(Pattern('status.zoomSuggest'));
					suggestElement.find('.action').click(function(){
						Map.setPosition(GPoint.toServer(Map.lat), GPoint.toServer(Map.lng), (Map.zoom < 14 ? 14 : Map.zoom+1));
					});
					self.holder.append(suggestElement);
				}
			},
			statusHandler: {
				notFound: function(self, data){
					self.holder.find('.adress-search').click(function(){
						SearchForm.input.value(jQuery(this).attr('title'));
						SearchForm.initSearch();
					});         
				},
				found: function(self, data){
					self.holder.find('.adress-search').click(function(){
						//SearchForm.input.element.focus();
						SearchForm.input.value(jQuery(this).attr('title'));
						SearchForm.initSearch();
					});         
					self.holder.find('.zoom').click(function(){
						Map.setPosition(GPoint.toServer(Map.lat), GPoint.toServer(Map.lng), (Map.zoom < 14 ? 14 : Map.zoom+1));
					});
					self.holder.find('.zoomout').click(function(){
						Map.setPosition(GPoint.toServer(Map.lat), GPoint.toServer(Map.lng), Map.zoom-1);
						SearchForm.initSearch();
					});
				},
				suggestRepeatSearch: function(self, data){
					self.holder.find('.repeat-search').click(function(){
						jQuery('#search-bar form').submit();
					});
				},
				suggestZoomIn: function(self, data){
					self.suggestZoom();
				}
			},
			set: function(status, data){
				var self = this;
				self.main.attr('class', 'default');
				self.holder.html(Pattern('status.'+status, data));
				(isset(self.statusHandler[status]))&&(self.statusHandler[status](self, data));
				Event.notify('status.changed');
			},
			setStatus: function(status){
				var self = this;
				self.main.attr('class', status);
			},
			initArrow: function(){
				var self = this;
				var selectedTab = jQuery('#tabs li.select');
				if (selectedTab.length > 0){
					self.arrow.show();
					self.arrow.css('left', round(0+selectedTab.position().left+selectedTab.children().eq(0).outerWidth()/2)+'px');
				}
			}
		}
		return new initStatus(jQuery('#status'));
	})();
	Results = (function(){
		//advanced search
			var advancedSearchItemHandlers = {
				discoveryPlace: function(items){
					var tabs = [];
					var main = items.find('#discover-place');
					var searchValues 	= Env.get('custom_search');
					var searchInput 	= Env.get('query.query');
					if (main.length > 0){
						var contentItems = main.find('.site-item');
						//tab class
							var initTab = function(tab){
								var self 			= this;
								self.tab 			= tab;
								self.tabName 	= trim(tab.find('span').attr('class'));
								self.content 	= main.find(' div.'+self.tabName);
								self.form 		= self.content.find('form');
								self.button 	= Buttons(self.form)['search'];
								//custom form fields
									self.customFileldsOpener = false;
									self.form.find('.custom-fields').each(function(){
										var customFilelds = jQuery(this);
										var customFileldsOpener = jQuery(Pattern('advancedSearch.customFileldsOpener'));
										customFileldsOpener.insertAfter(customFilelds);
										customFileldsOpener.click(function(){
											customFileldsOpener.remove();
											customFilelds.show();
										});
										self.customFileldsOpener = customFileldsOpener;
									});
								//set tab hint title
									if (
										(self.content.length > 0)
										&&(self.content.find('h3').length > 0)
									){
										tab.attr('title', self.content.find('h3').text());
									}
								//set last searched values
									(isset(searchValues[self.tabName]))
										?(self.searchValues = searchValues[self.tabName])
										:(self.searchValues = false);
									if (self.searchValues){
										var openCustom = false;
										self.form.find('input').each(function(){
											var input = jQuery(this);
											var value;
											var pattern;
											if (isset(self.searchValues[input.attr('name')])){
												value 	= self.searchValues[input.attr('name')];
												pattern = value.toLowerCase().replace(RegExp('[^а-я\\d]{1,}', 'gi'), '(.*)');
												input.val(value);
												if ((searchInput)&&(searchInput.match(RegExp(pattern, 'gi')))){
													input.removeClass('example');
													(input.attr('name')!='where')&&(openCustom = true);
												}else{
													input.addClass('defined');
												}
											}
											(openCustom)&&(self.customFileldsOpener)&&(self.customFileldsOpener.click());
										});
									}
								//init example fields
									self.form.find('input.example').focus(function(){
										var input = jQuery(this);
										if (input.hasClass('example')){
											input.removeClass('example');
											(!input.hasClass('defined'))&&(input.val(''));
										}
									})
								self.form.submit(function(){
									self.button.wait();
									var data 				= self.serialize('not-empty');
									var dataString 	= '';
									data.site 			= self.tabName;
									ServerAction({
										method: 'maplos/custom_search_values',
										data: data,
										handler: function(){
											SearchForm.input.value(
												(
													(isset(self.queryGetters[self.tabName]))
													?(self.queryGetters[self.tabName])
													:(self.queryGetters['default'])
												)
												(self)
											);
											SearchForm.initSearch();
										}
									});
									return false;
								})
								tab.click(function(){
									contentItems.hide();
									main.find('.site-icons li.select').removeClass('select');
									tab.addClass('select');
									self.content.show();
								});
								isset(SearchForm)
									&&isset(SearchForm.input)
									&&self.checkForSelect();
								Event.bind('searchForm.finished', function(){
									self.checkForSelect();
								});
							}
							initTab.prototype = {
								serialize: function(mode){
									var self = this;
									(!isset(mode))&&(mode = 'default');
									var result = {}
									self.form.find('input, select').each(function(){
										var input = jQuery(this);
										var value = trim(input.val());
										if (input.hasClass('example')||(value.length==0)){
											(mode == 'default')&&(result[input.attr('name')] = false);
										}else{
											result[input.attr('name')] = value;
										}
									});
									return result;
								},
								getWhere: function(where){
									if (where){
										return Pattern('advancedSearch.siteSearches.where', {
											where: where
										});
									}
									return '';
								},
								queryGetters: {
									'tut': function(self){
										var values 	= self.serialize();
										return ((values.what)?
											 (values.site+' '+values.what+self.getWhere(values.where))
											:(values.site+values.category+self.getWhere(values.where)));
									},
									'hotline': function(self){
										var values = self.serialize();
										var what = '';
										(values.what)&&(what = ' '+values.what+' ');
										return values.site+what+self.getWhere(values.where);
									},
									'default': function(self){
										var values = self.serialize();
										return values.site+self.getWhere(values.where);
									}
								},
								checkForSelect: function(){
									var self = this;
									if (SearchForm.input.value().match(RegExp(self.tabName, 'gi'))){
										self.tab.click();
									}
								}
							}
						main.find('.site-icons li').each(function(){
							tabs.push(new initTab(jQuery(this)));
						});
						tabs[0].tab.click();
					}
				},
				searchExamples: function(items){
					var main = items.find('#search-examples');
					if (main.length > 0){
						main.find('.action').click(function(){
							var action = jQuery(this);
							var positionHolder = action.parent().find('.position');
							if (positionHolder.length > 0){
								positionAr = positionHolder.text().split(':');
								Map.setPosition(positionAr[0],positionAr[1],positionAr[2]);
							}
							SearchForm.input.value(action.text());
							SearchForm.button.button.get(0).click();
						})
					}
				}
			}
			var advancedSearchItems = [];
			var initAdvancedSearch = function(main){
				main.find('.item').each(function(){
					advancedSearchItems.push(new initAdvancedSearchItem(jQuery(this), advancedSearchItems.length));
				});
				each(advancedSearchItemHandlers, function(){
					this(main);
				});
				if(advancedSearchItems.length > 0){
					var openItem = Env.get('session.advanced_search_item');
					if ((openItem)&&(isset(advancedSearchItems[openItem]))){
						advancedSearchItems[openItem].open();
					}else{
						advancedSearchItems[0].open();
					}
				}
			}
			var initAdvancedSearchItem = function(itemHolder, key){
				var self 						= this;
				self.title 					= itemHolder.find('h2').eq(0);
				self.openButton 		= self.title.find('.open');
				self.opened 				= false;
				self.key 						= key;
				self.contentHolder 	= itemHolder.find('.item-content');
				self.title.click(function(){
					self.opened ? self.close() : self.open();
				})
			}
			initAdvancedSearchItem.prototype = {
				open: function(){
					var self = this;
					each(advancedSearchItems, function(){
						this.close();
					})
					self.contentHolder.show();
					self.openButton.html(Pattern('advancedSearch.open'));
					self.opened = true;
					if (Env.get('session.advanced_search_item') != self.key){
						ServerAction({
							method: 'maplos/session_ajax_set',
							data: {
								key: 'advanced_search_item',
								value: self.key
							}
						});
					}
				},
				close: function(){
					var self = this;
					self.contentHolder.hide();
					self.openButton.html(Pattern('advancedSearch.close'));
					self.opened = false;
				}
			}
		//result column
			var initResult = function(){
				var self = this;
				self.height = 0;
				self.searchInfo 	= jQuery('#search-info');
				self.results 			= jQuery('#results');
				self.resultHolder = self.results.find('.result-holder');
				self.resultHolderContent = self.results.find('.result-holder-padding');
				self.showResults 	= false;
				self.resultHolderPattern = Pattern('result.holder');
				Event.bind('searchForm.finished', function(){
					self.showSearchInfo();
				});
				Event.bind('favorites.finished', function(){
					self.showSearchInfo();
				});
				Event.bind('status.changed', function(){
					if (self.showResults){
						self.setResultHeight();
					}
				});
			}
			initResult.prototype = {
				handleSearchInfo: function(){
					var self = this;
					new initAdvancedSearch(self.searchInfo.find('#advanced-search'));
				},
				hideResults: function(){
					var self = this;
					self.results.hide();
					self.searchInfo.show();
					self.handleSearchInfo();
				},
				showSearchInfo: function(){
					var self = this;
					if (!self.showResults){
						self.searchInfo.show();
						self.handleSearchInfo();
					}
				},
				setResultHeight: function(){
					var self = this;
					var height = Map.mapHolder.parent().height()
						-jQuery('#status').height()
						-jQuery('#controls').height();
					if (height != self.height){
						self.height = height;
						self.resultHolder.height(self.height);
					}
				},
				scrollToResult: function(resultItem){
					var self = this;
					var prevHeight = 0;
					resultItem.parent().prevAll().each(function(){
						var element = jQuery(this);
						prevHeight+= element.height();
					});
					self.resultHolder.get(0).scrollTop = round(prevHeight-self.resultHolder.height()/2);
				},
				addResult: function(resultItem){
					var self = this;
					if (!self.showResults){
						self.showResults = true;
						self.searchInfo.hide();
						self.results.removeClass('hide');
						jQuery(window).resize(function(){
							self.setResultHeight();
						})
						self.setResultHeight();
					}
					self.resultHolderContent.append(jQuery(self.resultHolderPattern).append(resultItem));
				}
			}
		return new initResult();
	})();
	ResultPoint = (function(){
		var selectedPoint = false;
		var siteSearchMode = (trim(Env.get('query.query')).match(RegExp('^site:[^\\s]{4,}$', 'gi')))?true:false;
		var points = {};
		var initResultPoint = function(result){
			var self 					= this;
			result.consider 	= true;
			self.result 			= result;
			self.results 			= [result];
			self.point 				= result.point;
			self.streetKeyword = self.handleStreet();//drop
			self.colors 			= Pattern('result.colors');
			self.hidden 			= true;
			self.hiddenHeads 	= [];
			self.headCounter 	= false;
			self.alwaysOpen 	= false;
			self.urlCache 		= [result.result.url];
			self.domainUrlCache	= [result.result.visibleUrl];
			self.markInfoCache = '';
			self.id 					= (result.point.lat+'')+(result.point.lng+'');
			points[self.id] 	= self;
			self.favoriteButtonBaloon = false;
			self.favorite = false;
			if (isset(Map.favorites[self.id])){
				self.favorite = Map.favorites[self.id].md5;
			}
			self.addToResultColumn();
			self.adressAccuracy = 1;
			self.checkAdressRelevance(result.point);
			self.relevance = self.countRelevance();
			self.setResultItemColor();
			self.mark = Map.showResultLabel(self);
			self.selected = false;
			self.mark.click = function(){
				if (!self.selected){
					self.select();
				}
			}
			self.mark.close = function(){
				self.unselect();
			}

		}
		initResultPoint.prototype = {
			getMaxRelevance: function(){
				return maxRelevance;
			},
			handleStreet: function(name){
				var self 				= this;
				(!isset(name))&&(name = self.result.point.title);
				var replacement = Pattern('result.streetReplacement');
				if (name.match(RegExp('[\\s]{1,}', 'gi'))){
					var replaced = false;
					var addition = '';
					each(replacement, function(from, to){
						if ((!replaced)&&(name.match(RegExp('[\\s]{1,}'+from,'gi')))){
							replaced 	= true;
							name 			= trim(name.replace(RegExp('[\\s]{1,}'+from,'gi'), ''));
							addition 	= ' '+to;
						}
					});
					name = name.match(RegExp('[^\\s]{1,}$','gi'))[0]+addition;
				}
				return trim(name);
			},
			checkAdressRelevance: function(point){
				var self = this;
				if (isset(point.rel) && point.rel == 'n'){
					self.adressAccuracy = 0.75;
					self.resultItem.find('.nearly').addClass('nearly-adress');
				}
			},
			updateMark: function(){
				var self = this;
				var markInfo = self.relevance+':'+maxRelevance;
				if (markInfo!=self.markInfoCache){
					self.markInfoCache = markInfo;
					self.mark.setRelevance();
				}
			},
			getAccuracy: function(){
				var self = this;
				if (siteSearchMode){
					return floor(100*self.adressAccuracy);
				}
				var accuracy = 0;
				switch(floor(self.relevance)){
					case 0:
						accuracy = self.relevance/2;
						break;
					case 1:
						accuracy = 0.6+(self.relevance-1)*0.15;
						break;
					default:
						accuracy = 0.75+(self.relevance-2)/(maxRelevance-1.99)*0.25;
				}
				return floor(accuracy*100);
			},
			getColor: function(){
				var self = this;
				if (self.relevance < 1){
					return self.colors[0];
				}
				var color = Math.round(self.relevance/(maxRelevance>2?maxRelevance:2)*(self.colors.length-1));
				(color > (self.colors.length-1))&&(color = (self.colors.length-1));
				return self.colors[color];
			},
			resultCacheAdd: function(result){
				var self = this;
				var addAr = {
					//query: Env.get('query.query'),
					result: result.resultId[1],
					key: result.resultId[0]
				}
				var addStringAr = [];
				for (var key in addAr){
					addStringAr.push(key+'='+escapeForUrl(addAr[key]));
				}
				return '?'+addStringAr.join('&');
			},
			getCashedUrl: function(result){
				var self = this;
				return Pattern('result.cacheUrl')+self.resultCacheAdd(result);
			},
			getBaloon: function(){
				var self = this;
				self.baloonContent = jQuery(Pattern('result.search.baloon', {
					title: 		self.result.result.title,
					url: 			self.getCashedUrl(self.result),
					content: 	self.result.result.content,
					source: 	self.result.result.visibleUrl,
					adress: 	self.adressTitle
				}));
				self.favoriteButtonBaloon = self.baloonContent.find('.favorites');
				self.favoriteButtonBaloon.click(function(){
					if (self.favorite){
						self.removeFromFavorites()
					}else{
						self.addToFavorites();
					}
				});
				if (self.favorite){
					self.changeFavoriteButton('remove');
				}else{
					self.changeFavoriteButton('add');
				}
				self.baloonContent.find('span.zoom').click(function(){
					Map.setPosition(self.point.lat,self.point.lng, 17);
				});                            
				return self.baloonContent.get(0);
			},
			updateColor: function(){
				var self = this;
				self.mark.color = self.getColor();
				self.setResultItemColor();
			},
			show: function(){
				var self = this;
				self.updateColor();
				if (self.hidden){
					self.hidden = false;
					self.mark.show();
				}
			},
			hide: function(){
				var self = this;
				if (!self.hidden && !self.alwaysOpen){
					self.hidden = true;
					self.mark.hide();
				}
				self.updateColor();
			},
			select: function(style){
				var self = this;
				self.alwaysOpen = true;
				self.show();
				(!isset(style))&&(style='scroll');
				(selectedPoint)&&(selectedPoint.unselect());
				selectedPoint = self;
				self.resultItem.addClass('select');
				(style=='scroll')&&(Results.scrollToResult(self.resultItem));
			},
			unselect: function(){
				var self = this;
				self.selected = false;
				self.resultItem.removeClass('select');
			},
			countHeads: function(){
				var self = this;
				var maxHeads = 0;
				var heads = self.resultItem.find('.item-head');
				if (heads.length > maxHeads){
					self.hiddenHeads = [];
					var count = maxHeads;
					heads.each(function(){
						var head = jQuery(this);
						count--;
						if (count<0){
							head.hide();
							self.hiddenHeads.push(head);
						}
					})
				}
				if (self.hiddenHeads.length > 0){
					if (self.headCounter==false){
						self.headCounter = jQuery(Pattern('result.search.headCounter'));
						self.headCounter.insertAfter(self.resultItem.find('.other-items'));
						self.headCounter.click(function(){
							each(self.hiddenHeads, function(){
								this.show();
							});
							self.headCounter.hide();
						});
					}
					self.headCounter.find('.count').text(self.hiddenHeads.length);
				}
			},
			handleOtherItems: function(){
				var self = this;
				self.resultItem.find('.other-item').each(function(){
					var item = jQuery(this);
					item.removeClass('other-item').hide();
					var itemHead = jQuery(Pattern('result.search.itemHead', {
						title: item.find('a').text()
					}));
					itemHead.insertBefore(item);
					itemHead.click(function(){
						itemHead.hide();
						item.show();
					})
				});
				self.countHeads();
			},
			countRelevance: function(){
				var self = this;
				relevance = 0;
				var maxRelevance = 0;
				for (var key=0; key < self.results.length; key++){
					var mult = (self.results[key].consider) ? 1 : 0.25;
					(self.results[key].relevance > maxRelevance)&&(maxRelevance=self.results[key].relevance);
					relevance += self.results[key].relevance*self.results[key].relevance*mult;
				} 
				return relevance*maxRelevance*maxRelevance;
			},
			addResult: function(result){
				var self = this;
				if (!inArray(result.result.url, self.urlCache)){
					result.consider = !inArray(result.result.visibleUrl, self.domainUrlCache);
					self.results.push(result);
					self.urlCache.push(result.result.url);
					self.domainUrlCache.push(result.result.visibleUrl);
					self.relevance = self.countRelevance();
					self.mark.setRelevance();
					self.setResultItemColor();
					self.resultItemOtherItems.append(Pattern('result.search.item', {
						url: self.getCashedUrl(result),
						title: result.result.title,
						source: result.result.visibleUrl,
						content: result.result.content
					}));
					self.checkAdressRelevance(result.point);
					self.handleOtherItems();
				}
			},
			getFavoritesData: function(){
				var self = this;
				return {
					query: SearchForm.query(),
					lat: self.point.lat,
					lng: self.point.lng,
					results: serialize(self.results)
				};
			},
			changeFavoriteButton: function(mode){
				var self = this;
				var changeButtons = [self.favoriteButton];
				(self.favoriteButtonBaloon)&&(changeButtons.push(self.favoriteButtonBaloon));
				for (var key=0; key < changeButtons.length; key++){
					changeButtons[key].attr('class', 'favorites favorites-'+mode);
					changeButtons[key].attr('title', Pattern('favorites.button.hint.'+mode));
				}
			},
			addToFavorites: function(){
				var self = this;
				if(NeedLogin('favorites')){
					self.changeFavoriteButton('load');
					ServerAction({
						method: 'maplos/add_to_favorites',
						data: self.getFavoritesData(),
						postMethod: 'post',
						handler: {
							success: function(data){
								self.favorite = data.md5;
								self.changeFavoriteButton('remove');
							},
							error: function(){
								self.changeFavoriteButton('add');
							}
						}
					});
				}
			},
			removeFromFavorites: function(){
				var self = this;
				self.changeFavoriteButton('load');
				ServerAction({
					method: 'maplos/remove_from_favorites',
					data: {
						md5: self.favorite
					},
					handler: {
						success: function(){
							self.favorite = false;
							self.changeFavoriteButton('add');
						},
						error: function(){
							self.changeFavoriteButton('remove');
						}
					}
				});
			},
			setResultItemColor: function(){
				var self = this;
				self.resultItemColorHolder.attr('class', 'rel-'+self.getColor());
			},
			addToResultColumn: function(){
				var self = this;
				self.adressTitle = self.result.point.title.replace(
							RegExp(Pattern('result.placeTitleReplace'),'gi'),''
						)
						+', '
						+self.result.point.house;
				self.resultItem = jQuery(Pattern('result.search.main', {
					adress: self.adressTitle
				}));
				self.resultItemColorHolder = self.resultItem.find('h2');
				self.resultItem.append(Pattern('result.search.firstItem', {
					url: self.getCashedUrl(self.result),
					title: self.result.result.title,
					source: self.result.result.visibleUrl,
					content: self.result.result.content
				}));
				self.resultItemOtherItems = self.resultItem.find('.other-items');
				self.resultItem.find('h2 .adress').click(function(){
					self.select('no-scroll');
					self.mark.select();
				})
				self.favoriteButton = self.resultItem.find('h2 .favorites');
				self.favoriteButton.click(function(){
					if (self.favorite){
						self.removeFromFavorites()
					}else{
						self.addToFavorites();
					}
				});
				if (self.favorite){
					self.changeFavoriteButton('remove');
				}else{
					self.changeFavoriteButton('add');
				}
				Results.addResult(self.resultItem);
			}
		}
		var searchRegion = function(result){
			var self = this;
			if (result.type == 'adress'){
				self.resultItem = jQuery(Pattern('result.searchRegion.main', {
					adress: (result.point.kind=='house')?(result.point.title+' '+result.point.house):result.point.title
				}));
				Results.addResult(self.resultItem);
			}
		}
		//result control
			var maxRelevance 				= 0;
			var maxRelevancePoint		= 0;
			var goodPointsCount			= 0;
			var maxRelevanceInView 	= 0;
			var minMaxRelevaneRatio	= Pattern('result.colors').length;
			var inViewCount 	= 0;
			var shownCount 		= 0;
			var resultControl = (function(){
				var maxResults 			= parseInt(Pattern('result.maxCount'));
				var pointSortMethod = function(a , b){
					if (a.relevance < b.relevance){
						return 1;
					}else if (a.relevance == b.relevance){
						return 0;
					}else if (a.relevance > b.relevance){
						return -1;
					}
				}
				var getViewResults 	= function(){
					var bounds 				= Map.getBounds();
					var pointsInView 	= [];
					//each(points, function(key, resultPoint){
					var resultPoint;
					goodPointsCount = 0;
					for (var key in points){
						resultPoint = points[key];
						//define maxRelevance
							if(resultPoint.relevance > maxRelevance){
								maxRelevance 			= resultPoint.relevance;
								maxRelevancePoint = resultPoint;
							}
							(resultPoint.relevance >=1)&&(goodPointsCount++);
						if (
							(resultPoint.point.lat > bounds.lat.min)
							&&(resultPoint.point.lat < bounds.lat.max)
							&&(resultPoint.point.lng > bounds.lng.min)
							&&(resultPoint.point.lng < bounds.lng.max)
						){
							pointsInView.push(resultPoint);
						}else{
							resultPoint.hide();
						}
					}
					//});
					return pointsInView.sort(pointSortMethod);
				}
				var showItem = function(item){
					if(item.relevance >= maxRelevanceInView/minMaxRelevaneRatio){
						item.updateMark();
						item.show();
						shownCount++;
					}else{
						item.hide()
					}
				}
				return function(){
					shownCount = 0;
					var inView = getViewResults();
					//define max relevance in view
						if (isset(inView[0])){
							maxRelevanceInView = inView[0].relevance;
						}else{
							maxRelevanceInView = 0;
						}
					if (countArray(points) > maxResults){
						if (inView.length > maxResults){
							var count = inView.length;
							while(count--){
								if (count < maxResults){
									showItem(inView[count]);
									//inView[count].show();
								}else{
									inView[count].hide();
								}
							}
							inViewCount = maxResults;
						}else{
							each(inView, function(){
								showItem(this);
								//this.show();
							});
							inViewCount = inView.length;
						}
					}else{
						each(inView, function(){
							showItem(this);
							//this.show();
						});
						inViewCount = inView.length;
					}
				}
			})()
			var resultControlWorking = false;
			Event.bind('searchForm.finished', function(){
				resultControl();
			});
			Event.bind('search.threadFinished', function(){
				resultControl();
			});
			Event.bind('map.changed', function(){
				resultControl();
			});
		
		return {
			handleStreet: function(name){
				return initResultPoint.prototype.handleStreet(name);
			},
			countRelevance: function(relevanceAr){
				var selfObj = {}
				selfObj.results = [];
				for (var key=0;key<relevanceAr.length;key++){
					selfObj.results.push(relevanceAr[key]);
				}
				return initResultPoint.prototype.countRelevance.call(selfObj);
			},
			maxRelevance: function(){
				return maxRelevance;
			},
			poorResult: function(){
				if (
					(maxRelevance<1.6)
				&&(shownCount!=0)
				&&(((goodPointsCount/shownCount) < 0.3)||(goodPointsCount<=2)) 
				){
					return true;
				}
				return false;
			},
			inView: function(){
				return inViewCount;
			},
			getMaxRelevancePoint: function(){
				return maxRelevancePoint;
			},
			count: function(){
				return countArray(points);
			},
			setSearchRegion: function(result){
				new searchRegion(result);
			},
			add: function(result){
				var id = (result.point.lat+'')+(result.point.lng+'');
				if (isset(points[id])){
					points[id].addResult(result);
				}else{
					new initResultPoint(result);
				}
			}
		}
	})();
	Event.notify('load.formCore');
});
Event.bind('load.formCore', function(){
	SearchForm = (function(){
		var initSearchForm = function(main){
			var self 				= this;
			self.main 			= main;
			self.mode 			= 'search';
			self.form 			= self.main.find('form');
			self.foundCount	= 0;
			self.searching				= false;
			self.showSearchResult	= false;
			self.searchZoom	= false;
			self.resetButton = self.main.find('.input-buttons .reset');
			self.input 			= new input(self.main.find('#maplos-inputs'));
			self.button 		= Buttons(self.form).search;
			self.initResetButton();
			self.query 			= Env.get('query.query');
			if (Env.get('mode')=='search'){
				if (self.query){
					self.query = htmlEntities(self.query);
					self.input.value(self.query);
					self.initSearch();
					self.prevZoom = Map.zoom;
					Event.bind('map.changed', function(){
						self.suggest();
						self.prevZoom = Map.zoom;
					})
				}else{
					self.beforeSearchInit();
					Event.notify('searchForm.finished');
				}
			}else if (Env.get('mode') == 'favorites'){
				self.beforeSearchInit('favorites');
				Event.notify('load.favorites');
			}else if (Env.get('mode') == 'other'){
				self.beforeSearchInit('other');
			}
			self.form.submit(function(){
				if (self.input.value().length){
					if (self.input.value()==self.query){
						self.initSearch();
					}else{
						self.button.disable();
						self.notifySearchConditions(function(){
							Status.set('submiting');
							self.submit();
						})
					}
				}
				return false;
			});
		}
		initSearchForm.prototype = {
			notifySearchConditions: function(handler){
				var self = this;
				if(
					(isset(self.input.state))
					&&(self.input.value().match(RegExp(Pattern('main.ukrainianLetters'), 'gi')))
				){
					self.popupNotifySearchConditions('language', function(){
						self.button.reset();
					});
				}else if (
					(isset(self.input.state))
					&&(self.input.state!=2)
					&&(trim(self.input.what.val()).match(RegExp(Pattern('form.suggest.mayBeStreet'), 'gi')))
					&&(!trim(self.input.what.val()).match(RegExp(Pattern('main.adressSearchPattern'), 'gi')))
					&&(!trim(self.input.what.val()).match(RegExp('[a-z]{1,}', 'gi')))
					&&(!trim(self.input.what.val()).match(RegExp(Pattern('form.nearPattern'), 'gi')))
				){
					self.popupNotifySearchConditions('adress', function(){
						handler();
					})
				}else if (
					(isset(self.input.state))
					&&(self.input.state==1)
					&&(trim(self.input.what.val()).match(RegExp(Pattern('form.suggest.mayBeNearSearch'), 'gi')))
					&&(!trim(self.input.what.val()).match(RegExp(Pattern('main.adressSearchPattern'), 'gi')))
					&&(!trim(self.input.what.val()).match(RegExp(Pattern('form.nearPattern'), 'gi')))
				){
					self.popupNotifySearchConditions('near', function(){
						handler();
					})
				}else if (
					(isset(self.input.state))
					&&(self.input.state!=2)
					&&(self.mode != 'other')
					&&(Env.get('session.notify_mapRegion')!='yes')
				){
					self.popupNotifySearchConditions('mapRegion', function(){
						handler();
					})
				}else{
					handler();
				}
			},
			popupNotifySearchConditions: function(type, handler){
				var self = this;
				ServerAction({
					method: 'maplos/session_ajax_set',
					data: {
						key: 'notify_'+type,
						value: 'yes'
					}
				});
				if (isset(self.popupNotifySearchConditionsHandlers[type])){
					self.popupNotifySearchConditionsHandlers[type](self, handler)
				}else{
					var content = jQuery(Pattern('form.popup.'+type));
					var popup 	= Popup.open(content);
					content.find('button').click(function(){
						popup.close();
						handler();
					});
				}
			},
			popupNotifySearchConditionsHandlers: {
				near: function(self, handler){                                                                    
					var queryAr = trim(self.input.what.val()).match(RegExp(Pattern('form.suggest.mayBeNearSearch'), 'i'));
					var suggest = Pattern('advancedSearch.nearSearchPattern', {
						what: queryAr[1],
						where: queryAr[3]
					});
					var content = jQuery(Pattern('form.popup.near', {
						what: queryAr[1],
						where: queryAr[3]
					}));
					var popup 	= Popup.open(content);
					content.find('button.close').click(function(){
						popup.close();
						handler();
					});
					content.find('button.change').click(function(){
						self.input.value(suggest);
						popup.close();
						handler();
					});
				},
				adress: function(self, handler){
					var suggest = Pattern('main.adressSearchPattern')+' '+trim(self.input.what.val());
					var content = jQuery(Pattern('form.popup.adress', {
						adress: suggest
					}));
					var popup 	= Popup.open(content);
					content.find('button.close').click(function(){
						popup.close();
						handler();
					});
					content.find('button.change').click(function(){
						self.input.value(suggest);
						popup.close();
						handler();
					});
				}
			},
			initResetButton: function(){
				var self = this;
				self.resetButton = self.form.find('#submit-reset .reset');
				if (self.resetButton.length > 0){
					self.resetButton.click(function(){
						PageReload(Pattern('main.searchRoot'));
					});
				}
			},
			suggest: function(){
				var self = this;
				if (!self.searching && self.showSearchResult){
					if (Map.zoom == self.prevZoom){
						if (Map.zoom > 12){
							var resultCount = ResultPoint.count();
							if (resultCount > 0){
								var maxInView = (parseInt(Pattern('result.maxCount')) >= ResultPoint.count()) ? ResultPoint.count() : parseInt(Pattern('result.maxCount'));
								var inView 	= ResultPoint.inView();
								if (inView < resultCount){
									if (inView < maxInView){
										Status.set('suggestRepeatSearch');
										Status.setStatus('ahtung');
									}
								}else{
									Status.set('suggestRepeatSearch');
									Status.setStatus('ahtung');
								}
							}else{ 
								Status.set('suggestRepeatSearch');
								Status.setStatus('ahtung');
							}
						}else{
							Status.set('suggestZoomIn');
							Status.setStatus('ahtung');
						}
					}else{
						if (Map.zoom > 12){
							Status.set('suggestRepeatSearch');
						}else{
							Status.set('suggestZoomIn');
						}
						Status.setStatus('ahtung');
					}
				}
			},
			searchAnyPlace: function(place, handler, type){
				(!isset(type))&&(type='any');
				var searchGlobaly = function(){
					if ((type=='any')||(type=='good')){
						Search.placeSearch(place, function(result){
							if (result){
								handler({
									type: 'region',
									point: result
								})
							}else{
								handler(false);
							}
						}, type);
					}else{
						handler(false);
					}
				}
				Status.set('getStreetsSuggest');
				var query = trim(place.replace(RegExp(Pattern('main.adressSearchReplace'), 'gi'), '')).toLowerCase();
				if ((query==Env.get('where.query'))&&(Env.get('where.result')!='notFound')){
					var data = Env.get('where.result');
					if (data.levenshtein < 20){
						handler({
							type: 'adress',
							point: data
						})
					}else{
						searchGlobaly();
					}
				}else{
					ServerAction({
						method: 'maplos/place_search',
						data: {
							query: query,
							type: 'any'
						},   
						handler: {
							success: function(data){
								if (data.levenshtein < 20){
									handler({
										type: 'adress',
										point: data
									})
								}else{
									searchGlobaly();
								}
							},
							notFound: function(){
								searchGlobaly();
							},
							error: function(){
								handler(false);
							}
						}
					});
				}
			},
			getResultSuggestions: function(handler){
				var self = this;
				var suggestZoom = function(){
					handler(Pattern('form.suggest.changeZoom'));
				}
				var suggestSpell = function(type){
					self.spellCheck(function(suggest){
						if (suggest){
							handler(Pattern('form.suggest.notFoundSpellSuggest', {
								query: suggest
							}));
						}else{
							suggestZoom()
						}
					});
				}
				var searchPlace = function(type){
					self.searchAnyPlace(self.query, function(result){
						if (result){
							if (result.type=='adress'){
								if (
									((type == 'adress')&&(result.point.levenshtein<3))
									||(type=='any')
								){
									handler(Pattern('form.suggest.streetSearch', {
										query: result.point.title
									}))
								}else{
									suggestSpell();
								}
							}else if (type=='any'){
								var point = result.point;
								if (result.point.goodPoints.length > 1){
									var lat = GPoint.toServer(Map.lat);
									var lng = GPoint.toServer(Map.lng);
									var maxRelevance = ResultPoint.maxRelevance();
									var minimalRadius = -1;
									var nearestPoint = false;
									var radius;
									var bounds = Map.getBounds();
									for (var key=0;key<result.point.goodPoints.length;key++){
										if (
											(result.point.goodPoints[key].relevance > maxRelevance)
											&&(!((bounds.lat.min < result.point.goodPoints[key].lat)
											&&(bounds.lat.max > result.point.goodPoints[key].lat)
											&&(bounds.lng.min < result.point.goodPoints[key].lng)
											&&(bounds.lng.max > result.point.goodPoints[key].lng)))
										){
											radius = 
												Math.pow(result.point.goodPoints[key].lat-lat,2)+
												Math.pow(result.point.goodPoints[key].lng-lng,2);
											if ((minimalRadius==-1)||(radius<minimalRadius)){
												minimalRadius = radius;
												nearestPoint 	= result.point.goodPoints[key];
											}
										}
									}
									(nearestPoint)&&(point = nearestPoint);
								}
								handler(Pattern('form.suggest.nearSearch', {
									what: trim(self.query),
									where: point.street+' '+point.house
								}));
							}else{
								suggestSpell();
							}
						}else{
							suggestSpell();
						}         
					}, type)
				}
				var siteMatches;
				if (siteMatches = (' '+self.query+' ').match(RegExp('[\\s]{1,}(http://)*[^\\s\\:]{1,}\\.[a-z]{2,4}(/[^\\s]{0,})*[\\s]{1,}$', 'gi'))){
					handler(Pattern('form.suggest.siteSearch', {
						query: trim(siteMatches[0])
					}))
				}else if ((ResultPoint.poorResult())){
					if(!self.query.match(RegExp('site\\:', 'gi'))){
						searchPlace('adress');
					}else{
						suggestSpell();
					}
				}else{
					handler('');
				}
			},
			panToMaxResult: function(){
				var point = ResultPoint.getMaxRelevancePoint();
				if (point){
					Map.setPosition(point.point.lat, point.point.lng, Map.zoom);
				}
			},
			showZoom: function(){
				Event.notify('control.show', 'zoom');
			},
			spellCheck: function(handler){
				var self 		= this;
				var query 	= self.query;
				var suggest = query;
				Status.set('spellCheck');
				jQuery.getJSON('http://speller.yandex.net/services/spellservice.json/checkText?text='+suggest+'&lang=ru&callback=?', function(data){
					if (data.length){
						for (var key in data){
							if ((isset(data[key].s))&&(data[key].s.length > 0)){
								suggest = suggest.replace(new RegExp(data[key].word, 'gi'), data[key].s[0]);
							}
						}
						((suggest.toLowerCase())!=(query.toLowerCase()))?(handler(suggest)):(handler(false));
					}else{
						handler(false);
					}
				});
			},
			search: function(mode){
				var self = this;
				(!isset(mode))&&(mode='search');
				var query = (mode=='discovery') ? (Pattern('main.discoverySearchPattern')): self.query
				Status.set('startSearch');
				self.searching 	= true;
				self.searchZoom = Map.zoom;
				//console.profile();
				Event.notify('searchForm.started');
				Search.init(query, function(){
					self.searching 				= false;
					self.showSearchResult = true;
					if (self.foundCount==0){
						if (ResultPoint.count()>0){
							(Map.zoom==12)&&(self.panToMaxResult());
							self.getResultSuggestions(function(suggest){
								Status.set('found', {
									count: ResultPoint.count(),
									suggest: suggest
								});
								(trim(suggest).length > 0)&&(Status.setStatus('ahtung'));
							});
							self.showZoom();
						}else{
							self.spellCheck(function(suggest){
								if (suggest){
									var suggestMessage = Pattern('form.suggest.notFoundSpellSuggest', {
										query: suggest
									});
								}else{
									var suggestMessage = Pattern('form.suggest.notFoundDefaultSuggest');
								}
								Status.set('notFound', {
									suggest: suggestMessage
								});
								if(suggest){
									Status.setStatus('ahtung');
								}else{
									self.showZoom();
								}
							});
						}
					}else{
						Status.set('newFound', {
							count: ResultPoint.count(),
							newResults: (ResultPoint.count()-self.foundCount)
						});
					}
					self.foundCount = ResultPoint.count();
					Event.notify('searchForm.finished');
					//console.profileEnd();
				});
			},
			initSearch: function(){
				var self 				= this;
				var splitMatch 	= false;
				if (self.query.match(RegExp(Pattern('main.adressSearchPattern'), 'gi'))){
					Status.set('adressSearch');
					Place.search(self.query.replace(RegExp(Pattern('main.adressSearchReplace'), 'gi'), ''), function(){
						Status.set('adressFound');
						Event.bind('map.changed', function(){
							if (Env.get('query.query')==self.input.value()){
								self.input.value('');
							}
						});
						Event.notify('searchForm.finished');
					}, function(){
						Status.set('adressNotFound');
						Event.notify('searchForm.finished');
					})
				}else if (splitMatch = self.query.match(RegExp(Pattern('form.nearPattern'), 'gi'))) {
					self.nearSearch(splitMatch);
				}else if (self.query.match(RegExp(Pattern('main.placeDicoveryPattern'), 'gi'))) {
					self.search('discovery');
				}else{
					self.search();
				}
			},
			nearSearch: function(splitMatch){
				var self = this;
				queryAr = self.query.split(splitMatch[0]);
				Status.set('adressSearch');
				var nearAdressNotFound = function(){
					Status.set('nearAdressNotFound', {
						prefix: trim(splitMatch[0]),
						placeWord: queryAr[1]
					});
					Event.notify('searchForm.finished');
				}
				var placeFound = function(lat, lng, zoom){
					(!isset(zoom))&&(zoom = 15);
					Map.setPosition(lat, lng, zoom);
					self.query = queryAr[0];
					Event.bind('map.changed', function(){
						if (Env.get('query.query')==self.input.value()){
							self.input.value(self.query, 'silent');
						}
					});
					self.search();
				}
				var city = Pattern('main.city');
				if ((' '+trim(queryAr[1])+' ').match(RegExp('^\\s'+city.name+'[^\\s]{0,}\\s$', 'gi'))){
					placeFound(city.lat, city.lng, 12);
				}else{
					self.searchAnyPlace(queryAr[1], function(result){
						if (result){
							var zoom;
							if (result.type=='adress'){
								if (result.point.kind == 'street'){
									zoom = self.getStreetMatchZoom(result.point);
								}else{
									zoom = 15;
								}
							}else if (result.type=='region'){
								zoom = 14;
								if (result.point.relevance > 2){
									zoom = 15;
								}
							}
							ResultPoint.setSearchRegion(result);
							placeFound(result.point.lat, result.point.lng, zoom);
						}else{
							nearAdressNotFound();
						}
					}, 'good')
				}
			},
			getStreetMatchZoom: function(point){
				for(var zoom=16;zoom>12;zoom--){
					if (
						((Map.mapDelta[zoom].dLat/point.dlat)>0.5)
						&&((Map.mapDelta[zoom].dLng/point.dlng)>0.5)
					){
						return zoom;
					}
				}
				return 13;
			},
			beforeSearchInit: function(mode){
				var self = this;
				(!isset(mode))&&(mode='search');
				self.mode = mode;
				self.input.value('');
				self.input.ready();
				(mode=='search')&&(Status.set('beforeSerarch'));
			},
			position: function(){
				var self = this;
				return GPoint.toServer(Map.lat)
					+':'+GPoint.toServer(Map.lng)
					+':'+Map.zoom
					+':'+Map.layer;
			},
			handleInput: function(inputValue){
				if (isset(inputValue)){
					var input = inputValue;
				}else{
					var input = this.input.value();
				}
				return escapeForUrl(input);
			},
			submit: function(){
				var self = this;
				if (self.mode != 'other'){
					PageReload(Pattern('main.searchRoot')+'/'+self.handleInput()+'/'+self.position()+'/');
				}else{
					PageReload(Pattern('main.searchRoot')+'/'+self.handleInput());
				}
			}
		}
		var input = function(holder){
			var self 				= this;
			self.holder 		= holder;
			self.what 			= self.holder.find('.what  input');
			self.where 			= self.holder.find('.where input');
			self.state 			= 0;
			self.prevState 	= 0;
			self.resetButtons = [
				self.holder.find('.what  .reset'), 
				self.holder.find('.where .reset') 
			];
			each([self.what, self.where], function(key, field){
				var resetButton = self.resetButtons[key];
				var checkResetButton = function(){
					if (trim(field.val()).length > 0){
						resetButton.show();
					}else{
						resetButton.hide();
					}
				}
				checkResetButton();
				resetButton.click(function(){
					field.val('');
					resetButton.hide();
					field.get(0).focus();
				})
				field.focus(function(){
					self.reset();
					self.showSearchRequest('anyway');
				});
				field.blur(function(){
					//Status.set('beforeSerarch');
				});
				field.keyup(function(e){
					//console.debug(e.keyCode);
					self.showSearchRequest();
					checkResetButton();
					if (e.keyCode && (e.keyCode==13)){
						SearchForm.initSearch();//ie crutch
						return false;
					}
				});
			});
			self.prevValue = self.value();
			self.lastMapZoom = Map.zoom;
			Event.bind('map.changed', function(){
				if (
					(self.value()!=Env.get('query.query'))
				&&(self.state==1)
				&&(self.lastMapZoom != Map.zoom)
				){
					self.lastMapZoom = Map.zoom;
					self.showSearchRequest('anyway');
				}
			})
		}
		input.prototype = {
			showSearchRequest: function(type){
				(!isset(type))&&(type='ifChanged');
				var self 	= this;
				var value = self.value();
				var mapPosition = '';
				self.lastMapZoom = Map.zoom;
				if (self.state==1){
					if (Map.zoom<=12){
						mapPosition = Pattern('searchInput.mapPosition.city');
					}else{
						mapPosition = Pattern('searchInput.mapPosition.region');
					}
				}
				if ((self.prevValue!=value)||(type=='anyway')){
					if (value.length > 0){
						self.prevValue=value;
						Status.set('searchRequest', {
							query: self.value(),
							mapPosition: mapPosition
						});
					}else{
						Status.set('onInputFocus');
					}
				}
			},
			reset: function(){
				var self 				= this;
				each(['what','where'], function(key, name){
					var field = self[name];
					if (field.attr('class')=='subtext'){
						field.attr('class', '');
						field.val('');
					}
				});
			},
			ready: function(){
				var self 				= this;
				each(['what','where'], function(key, name){
					var field = self[name];
					if (!field.val().length){
						field.attr('class', 'subtext');
						field.val(Pattern('searchInput.ready.'+name));
					}
				});
			},
			value: function(value, changeType){
				var self = this;
				(!isset(changeType))&&(changeType='default');
				if (isset(value)){
					self.reset();
					var divider;
					if(divider = value.match(RegExp(Pattern('form.nearPattern'), 'gi'))){
						var queryAr = value.split(divider);
						self.what.val(trim(queryAr[0]));
						self.where.val(trim(queryAr[1]));
					}else if(divider = value.match(RegExp(Pattern('main.adressSearchPattern'), 'gi'))){
						var queryAr = value.split(divider);
						self.what.val('');
						self.where.val(trim(queryAr[1]));
					}else{
						self.where.val('');
						self.what.val(trim(value));
					}
					if (changeType!='silent'){
						self.where.keyup();
						self.what.keyup();
					}
				}else{
					var state = 0;
					(trim(self.what.val()).length > 0)
						&&(self.what.attr('class')!='subtext')
						&&(state+=1);
					(trim(self.where.val()).length > 0)
						&&(self.where.attr('class')!='subtext')
						&&(state+=2);
					self.prevState = self.state;
					self.state = state;
					return Pattern('searchInput.querys.q'+state, {
						what: trim(self.what.val()),
						where: trim((' '+self.where.val()+' ').replace(RegExp(Pattern('form.nearPattern'), 'gi'), ' '))
					})
				}
			}
		}
		var searchFormInstance = false;
		jQuery('#search-bar').each(function(){
			searchFormInstance = new initSearchForm(jQuery(this));
		});
		return {
			handleInput: function(input){
				return initSearchForm.prototype.handleInput(input);
			},
			query: function(){
				return searchFormInstance.query;
			},
			button: searchFormInstance.button,
			input: searchFormInstance.input,
			submit: function(){
				searchFormInstance.submit();
			},
			initSearch: function(){
				searchFormInstance.form.submit();
			}
		}
	})();
});
