﻿if(CITYID__==1){yandex_partner_id = 42221;}
if(CITYID__==2){yandex_partner_id = 42222;}
function cSearchInterface()
{
	var map;
	var geocoder;
	var objectManager; // менеджер объектов и объявлений
	var pointA=null;
	var pointB=null;
	var pointAaddr='';
	var pointBaddr='';
	var n=400;
	var PAGE_SIZE=4;	// количество маршрутов на странице
	var o='mapclick';
	var p;
	var polylines;		// линии на карте
	var t,t1;
	var routes;			// маршруты
	var objecta,objectb;	// объекты (вузы, театры итд)
	var allowPolylines = true; // позволяет ли браузер рисовать линии, соединяющие остановки маршрутов
	var allowBlink = true; // позволяет ли браузер подмигивать без тормозов
	var blinker = null;	// мигалочный флаг
	var hideMap = 0;
	var allowToggleMap = 1;
	var haveToLoadSecondPage = true; // равно true, если при переключении на вторую страницу надо подгрузить лучшие по статистике
	var waysHistory;
	// константы для удобства чтения кода
	var _wayshistoryid=0;
	var _wayshistoryalat=1;
	var _wayshistoryalng=2;
	var _wayshistoryblat=3;
	var _wayshistoryblng=4;
	var _wayshistoryaaddr=5;
	var _wayshistorybaddr=6;
	var _wayshistoryname=7;
	var _wayshistoryvisited=8;

	this.init=function(loadMap)
	{
		loadMap = loadMap==null?true:loadMap;
		if(loadMap && gid('map')){
		map=gmCreateMap('map',12,CITY_LAT[CITYID__],CITY_LNG[CITYID__]);
		if(map!=null){
			map.enableScrollWheelZoom();
			GEvent.addDomListener(map.getContainer(), "DOMMouseScroll", 
				function(oEvent) { if (oEvent.preventDefault) oEvent.preventDefault(); });
			GEvent.addListener(map,'click',mapClick);
			geocoder=new GClientGeocoder();
			objectManager=new ObjectManager(map);
			p=new Array();
			polylines=new Array();
			
			if(allowToggleMap!=0){
				this.createToggleMapStuff();
				if(hideMap!=0){
					this.toggleMap();
				}
			}
			
			if(navigator){
				if(navigator.appName=='Opera'){
					allowPolylines = false;
				}
				if(navigator.appName=='Microsoft Internet Explorer'){
					allowBlink = false;
				}				
			}
			
			if(gid('act').value=='putb_'){
				gid('pointbstreet').value = gid('bad').value;
			}
			else if(gid('act').value=='putb'){
				gid('pointbstreet').value = gid('bad').value;
				pt = new GLatLng(gid('blt').value,gid('bln').value);
				pointBaddr=gid('bad').value;
				pointB=gmAddPoint(map,pt,gid('bad').value,'','dest',true);
				gid('bFromText').value = '2';
				map.setCenter(pointB.getLatLng());
			}
			else if(gid('act').value=='widget'){
				pointAaddr=gid('aad').value;
				gid('pointastreet').value = pointAaddr;
				gid('bFromText').value = '1';
				
				pointBaddr=gid('bad').value;
				gid('pointbstreet').value = pointBaddr;
				gid('bFromText').value = '1';
				
				this.getRoutesPrepare();
			}
			
			if(gid('alt').value!=-1){
					// если была введена ссылка на маршрут
				var pt = new GLatLng(gid('alt').value,gid('aln').value);
				if(gid('aad').value!=''){
					pointAaddr=gid('aad').value;
					gid('pointastreet').value = gid('aad').value;
				}
				else{
					pointAaddr=START_POINT;
				}
				pointA=gmAddPoint(map,pt,pointAaddr,'','orig',true);
				gid('aFromText').value = '2';
			}
			if(gid('blt').value!=-1){
				pt = new GLatLng(gid('blt').value,gid('bln').value);
				if(gid('bad').value!=''){
					pointBaddr=gid('bad').value;
					gid('pointbstreet').value = gid('bad').value;
				}
				else{
					pointBaddr=DESTINATION_POINT;
				}
				pointB=gmAddPoint(map,pt,pointBaddr,'','dest',true);
				gid('bFromText').value = '2';
			}
			if(gid('alt').value!=-1 && gid('blt').value!=-1){
				getRoutes('');
			}
		}
		}
	};
	
	this.yadirectinit=function(){
		if(LOCALE__=='ru' && (CITYID__==1 || CITYID__==2)){
			var dontloadya = false;
			if(navigator && navigator.appVersion){
				var versionstring = navigator.appVersion;
				if (navigator.appName=='Opera' && versionstring.charAt(0)=='9' && versionstring.charAt(2)=='2'){
					dontloadya = true;
				}
			}

			if(!dontloadya && window.location=='http://msk.rusavtobus.ru/reklama1'){
				yandex_site_bg_color = 'FAFAF5';
				yandex_site_charset = 'utf-8';
				yandex_ad_format = 'direct';
				yandex_font_size = 1;
				yandex_direct_type = 'vertical';
				yandex_direct_border_type = 'ad';
				yandex_direct_limit = 4;
				yandex_direct_title_color = '0F74A8';
				yandex_direct_url_color = '006600';
				yandex_direct_all_color = '0F74A8';
				yandex_direct_text_color = '000000';
				yandex_direct_hover_color = '0066FF';
				var target_node = gid('adscol');
				//target_node.innerHTML = '<sc'+'ript type="text/javascript" src="http://an.yandex.ru/resource/context.js?rnd='+Math.round(Math.random()*100000) + '"></sc'+'ript>';
				if(CITYID__==1){yandex_partner_id = 42221;}
if(CITYID__==2){yandex_partner_id = 42222;}
				var js_node = document.createElement("script");
				js_node.charset = 'utf-8';
				js_node.type = 'text/javascript';
				js_node.src = 'http://an.yandex.ru/resource/context.js?rnd='+Math.round(Math.random()*100000);
				target_node.appendChild(js_node);
			}
		}
	};
	
	this.toggleOtherLinks=function(){
		var ul = gid('otherlinksul');
		if(ul){
			if(ul.style.display=='block'){
				ul.style.display = 'none';
			}
			else{
				ul.style.display = 'block';
			}
		}
	};
	
	this.createToggleMapStuff=function(){
		if(LOCALE__=='ru'){
			var objToggler = document.createElement('span');
			objToggler.id = 'objtoggler';
			objToggler.className = 'ajaxlink';
			objToggler.onclick = toggleObj_;
			objToggler.innerHTML = TOGGLE_OBJ_OFF;
			gid('container').appendChild(objToggler);
		
			var adsCreator = document.createElement('span');
			adsCreator.id = 'adscreator';
			adsCreator.innerHTML = '<span><a href="http://nash.rusavtobus.ru/objects/create/">'+OBJS_ADD+'</a></span>&nbsp;&nbsp;&nbsp;&nbsp;<span><a href="http://nash.rusavtobus.ru/ads/create/">'+ADS_ADD+'</a></span>';
			gid('container').appendChild(adsCreator);
			
			if(gid('banner').value == '0'){
				gid('objtoggler').style.top = '103px';
				gid('adscreator').style.top = '103px';
			}
		}
	};
	
	this.toggleObj=function(){
		var objToggler = gid('objtoggler');
		if(objToggler.innerHTML==TOGGLE_OBJ_ON){
			objToggler.innerHTML = TOGGLE_OBJ_OFF;
		}
		else{
			objToggler.innerHTML = TOGGLE_OBJ_ON;
		}
		objectManager.toggleMarkers();
	};
	this.toggleMap=function(){
		var mapToggler = gid('maptoggler');
		var mapcontainer = gid('map');
		var tvscreen = gid('tvscreen');
		
		if(mapToggler.innerHTML==TOGGLE_MAP_ON){
			mapToggler.innerHTML = TOGGLE_MAP_OFF;
			tvscreen.style.display = 'none';
			mapcontainer.style.display = 'block';
		}
		else{
			mapToggler.innerHTML = TOGGLE_MAP_ON;
			tvscreen.style.display = 'block';
			mapcontainer.style.display = 'none';
		}
		map.checkResize();
	};
	
	mapClick=function(a,b)
	{
		var c=map.getZoom();
		if(o=='mapclick'&&b)
		{
			if(!pointA)
			{
				pointAaddr=START_POINT;
				gid('aFromText').value = '0';
				pointA=gmAddPoint(map,b,START_POINT,'','orig',true);
			}
			else if(!pointB)
			{
				pointBaddr=DESTINATION_POINT;
				gid('bFromText').value = '0';
				pointB=gmAddPoint(map,b,DESTINATION_POINT,'','dest',true);
			}
		}
	};
	checkTrans=function(){
			// функция составляет строку айдишников ненужного транспорта на основе чекбоксов
		var out = '';
		var checkbox;
		for(var i=1;i<=6;i++){
			checkbox = gid('cb'+i);
			if(!checkbox.checked){
				out += checkbox.value+',';
			}
		}
		if(out!=''){
			out = out.substring(0, out.length - 1);
		}
	
		return out;
	};
	this.switchTrafTime=function(){
			// переключаемся с учета трафика на неучет
		if(gid('traffic-time').value==0){
				// надо включить пробки
			gid('traffic-time').value = 1;
			gid('switch-traftime').innerHTML = '<strong>'+TRAFFIC_PRELUDE+'</strong> <span class="ajaxlink" onclick="switchTrafTime();">'+COUNT_WITHOUT_TRAFFIC+'</span><br/><em>'+COUNT_WITH_TRAFFIC+'</em>';
			getRoutes('',1,1);
		}
		else{
				// надо выключить пробки
			gid('traffic-time').value = 0;
			gid('switch-traftime').innerHTML = '<strong>'+TRAFFIC_PRELUDE+'</strong> <em>'+COUNT_WITHOUT_TRAFFIC+'</em><br/><span class="ajaxlink" onclick="switchTrafTime();">'+COUNT_WITH_TRAFFIC+'</span>';
			getRoutes('',1,0);
		}
	};
	echoSerp = function(start,containerId,doHiddenSort){
			// функция выводит страницу поиска
		doHiddenSort = doHiddenSort==null?false:doHiddenSort;	
		closeNumPointsWin(0);
		var container=gid(containerId);
		var from = 1+Math.floor(start/PAGE_SIZE);
		var to = Math.ceil(routes.length/PAGE_SIZE);
		if(start==0){
			var str = '<h1 id="resultshead">'+THE_BEST_ROUTES+'</h1>';
		}
		else{
			var str = '<h1 id="resultshead">'+RESULT_ROUTES+/*' ('+PAGE_WORD+' '+from+' '+FROM_WORD+' '+to+')*/'</h1>';
		}
		var counter = 0;
		
		var link = 'http://'+CITY_SUBDOMAIN[CITYID__]+'.rusavtobus.ru/'+LOCALE__+'/?alat='+encodeURIComponent(pointA.getPoint().lat())+
					'&alng='+encodeURIComponent(pointA.getPoint().lng())+
					'&blat='+encodeURIComponent(pointB.getPoint().lat())+
					'&blng='+encodeURIComponent(pointB.getPoint().lng())+
					'&types='+checkTrans();
		
		var reverselink = 'http://'+CITY_SUBDOMAIN[CITYID__]+'.rusavtobus.ru/'+LOCALE__+'/?alat='+encodeURIComponent(pointB.getPoint().lat())+
					'&alng='+encodeURIComponent(pointB.getPoint().lng())+
					'&blat='+encodeURIComponent(pointA.getPoint().lat())+
					'&blng='+encodeURIComponent(pointA.getPoint().lng())+
					'&types='+checkTrans();
		
		if(pointAaddr!=START_POINT){
			link += '&aad='+encodeURIComponent(pointAaddr);
			reverselink += '&bad='+encodeURIComponent(pointAaddr);
		}
		if(pointBaddr!=DESTINATION_POINT){
			link += '&bad='+encodeURIComponent(pointBaddr);
			reverselink += '&aad='+encodeURIComponent(pointBaddr);
		}
		
		str += '<a id="reverselink" href="'+reverselink+'">'+REVERSE_ROUTES+'</a>';
		
		var i=0;
		var linkspec = '';
		while(i<link.length){
			linkspec += link.substring(i,i+30)+'<wbr/>';
			i = i+30;
		}
		
		while(routes[start+counter]!=null && counter<PAGE_SIZE){
			str+=echoTextRoute(routes[start+counter],start+counter,counter);
			counter++;
		}
		
		if(HASTRAF__==1){
			var smilinkBanner = '<div id="smilink"><a id="yawidget" target="_blank" href="http://clck.yandex.ru/redir/dtype=stred/pid=30/cid=533/*http://maps.yandex.ru/moscow_traffic" style="background-image:url(http://clck.yandex.ru/click/dtype=stred/pid=30/cid=529/*)"><img src="http://info.maps.yandex.net/traffic/moscow/current_traffic_88.gif" alt="Пробки на Яндекс.Картах" border="0"/></a><p>Информация о состоянии загруженности <br/>автомобильных дорог в г. Москва<br/> предоставлена Аналитическим Центром<br/> «Яндекс. Пробки»</p></div>';
		}
		else{
			var smilinkBanner = '';
		}		
		
		str += '<a id="newsearch" onclick="newSearch_();"><img alt="'+NEW_SEARCH+'" src="'+RES_ROOT+'images/'+CITY_SUBDOMAIN[CITYID__]+'/'+IMAGES_ROOT+'/new-search.gif"/></a>'+
			'<span id="link-to-routes" class="ajaxlink" onclick="showLinkToRoutes(this);">'+LINK_TO_ROUTES+'</span>';
		
		if(routes.length>start+PAGE_SIZE){
			str += '<span id="nextpage" class="ajaxlinkappeal" onclick="echoSerp_('+(start+PAGE_SIZE)+',\'results\');"><em>'+NEXT_WAYS+' »</em></span>';
		}
		if(start!=0){
			str += '<span id="prevpage" class="ajaxlinkappeal" onclick="echoSerp_('+(start-PAGE_SIZE)+',\'results\');"><em>« '+PREV_WAYS+'</em></span>';
		}	
		
		if(HASTRAF__==1){
			if(gid('traffic-time').value==0){
				str += '<div id="switch-traftime"><strong>'+TRAFFIC_PRELUDE+'</strong> <em>'+COUNT_WITHOUT_TRAFFIC+'</em><br/><span class="ajaxlink" onclick="switchTrafTime();">'+COUNT_WITH_TRAFFIC+'</span></div>';
			}
			else{
				str += '<div id="switch-traftime"><strong>'+TRAFFIC_PRELUDE+'</strong> <span class="ajaxlink" onclick="switchTrafTime();">'+COUNT_WITHOUT_TRAFFIC+'</span><br/><em>'+COUNT_WITH_TRAFFIC+'</em></div>';
			}
		}
		
		if(start==0){
			container.className='lead';
		}
		else{
			container.className='nolead';
		}
		
		gid('explanation').innerHTML = smilinkBanner+EXPLANATION[CITYID__];
		container.innerHTML = str;
		showTextResults();
		if(doHiddenSort){
			hiddenSort(0,'speed',PAGE_SIZE);
		}
		else if(haveToLoadSecondPage && start==PAGE_SIZE){
			haveToLoadSecondPage = false;
			hiddenSort(start,'speed',2*PAGE_SIZE);
		}
		gid('link-to-routes-win').innerHTML = 
				'<img class="close-win" src="'+RES_ROOT+'images/msk/'+IMAGES_ROOT+'/closewindow-mini.gif" onclick="closeLinkToRoutes();" alt="закрыть окно"/>'+
				'<strong>'+LINK_WORD+':</strong><br/><a href="'+link+'" target="_blank">'+linkspec+'</a><br/><br/>'+
				'<strong>'+BLOGOCODE_WORD+':</strong><br/><textarea onclick="selectTextarea(this);" alt="'+CITY_ROUTES[CITYID__]+'">&lt;a href="'+link+'"&gt;'+CITY_ROUTES[CITYID__]+'&lt;/a&gt;</textarea>';
		
		showRouteOnMap(routes[start]);
		return counter;
	};
	/*=== всякие функции по истории и попутчикам ===*/
	this.loadWaysHistory=function(){
			// функция загружает все маршруты из истории юзера в массив в памяти и в список на форме
		GDownloadUrl('/modules/history/loaders/getways.loader.php',function(data)
				{
					var xml=GXml.parse(data);
					if(!xml || !xml.firstChild || xml.firstChild.tagName == 'parsererror'){
						return false;
					}
					var ways = xml.firstChild.getElementsByTagName('way');
					waysHistory = new Array();
					var str = '';
					if(ways.length==0){
						alert('У Вас пока нет истории поиска. Попробуйте поискать маршруты.');
					}
					else{
						var len = ways.length;
						for(var i=0;i<len;i++){
							wlen = waysHistory.length;
							waysHistory[wlen] = new Array();
							waysHistory[wlen][_wayshistoryid] = ways[i].getAttribute('id');
							waysHistory[wlen][_wayshistoryalat] = ways[i].getAttribute('alat');
							waysHistory[wlen][_wayshistoryalng] = ways[i].getAttribute('alng');
							waysHistory[wlen][_wayshistoryblat] = ways[i].getAttribute('blat');
							waysHistory[wlen][_wayshistoryblng] = ways[i].getAttribute('blng');
							waysHistory[wlen][_wayshistoryaaddr] = ways[i].getAttribute('aaddr');
							waysHistory[wlen][_wayshistorybaddr] = ways[i].getAttribute('baddr');
							waysHistory[wlen][_wayshistoryvisited] = ways[i].getAttribute('visited');
							waysHistory[wlen][_wayshistoryname] = ways[i].getAttribute('wn');
							waysHistory[wlen][_wayshistoryname] = waysHistory[wlen][_wayshistoryname].replace(/-->/, '&rarr;')
							str += '<li><span class="ajaxlink" onclick="searchFromHistory_('+wlen+')">'+waysHistory[wlen][_wayshistoryname]+'</span>'+
									' <small>('+ways[i].getAttribute('visited')+')</small>'+'</li>';
						}
						gid('mywayshistory').innerHTML = str;
						gid('wayshistorylist').style.display='block';
					}
					
				},
				"q=hello"
			);
	};
	this.searchFromHistory=function(waynum){
			// функция по клику на маршрут в списке истории - сразу берет и ищет его
		this.newSearch();
		var tmp = new GLatLng(waysHistory[waynum][_wayshistoryalat],waysHistory[waynum][_wayshistoryalng]);
		pointA=gmAddPoint(map,tmp,waysHistory[waynum][_wayshistoryaaddr],'','orig',true);
		
		tmp = new GLatLng(waysHistory[waynum][_wayshistoryblat],waysHistory[waynum][_wayshistoryblng]);
		pointB=gmAddPoint(map,tmp,waysHistory[waynum][_wayshistorybaddr],'','dest',true);
		
		pointAaddr=waysHistory[waynum][_wayshistoryaaddr];
		if(pointAaddr==START_POINT){
			gid('pointastreet').value = STREET_STRING;
		}
		else{
			gid('pointastreet').value = pointAaddr;
		}
		gid('pointahouse').value = HOUSE_STRING;
		gid('pointacorp').value = CORP_STRING;
		gid('pointabuild').value = BUILD_STRING;
		gid('aFromText').value = '2';
		
		
		pointBaddr=waysHistory[waynum][_wayshistorybaddr];
		if(pointBaddr==DESTINATION_POINT){
			gid('pointbstreet').value = STREET_STRING;
		}
		else{
			gid('pointbstreet').value = pointBaddr;
		}
		gid('pointbhouse').value = HOUSE_STRING;
		gid('pointbcorp').value = CORP_STRING;
		gid('pointbbuild').value = BUILD_STRING;
		gid('bFromText').value = '2';
		
		gid('wayshistorylist').style.display='none';
		getRoutes('speed',1,gid('traffic-time').value,waysHistory[waynum][_wayshistoryid]);
	};
	historyAddWay=function(waysHistoryId){
		GDownloadUrl('/modules/history/loaders/addway.loader.php',function(data)
				{
					//сохраняем полученный идентификатор истории
					var xml=GXml.parse(data);
					var hid=0;
					if(xml){
						var out = xml.documentElement.getElementsByTagName("out");
						if(out && out.length>0){
							hid = out[0].getAttribute('hid');
						}
					}
					gid('hid').value = hid;
					
					// и выводим объекты на карте, если они пришли
					if(LOCALE__=='ru'){
						var oa = xml.documentElement.getElementsByTagName("oa");
						if(oa && oa.length>0){
							objectManager.showMarkers(oa);
						}
					}
				},
				"&alat="+encodeURIComponent(pointA.getPoint().lat())+
				"&alng="+encodeURIComponent(pointA.getPoint().lng())+
				"&blat="+encodeURIComponent(pointB.getPoint().lat())+
				"&blng="+encodeURIComponent(pointB.getPoint().lng())+
				"&aaddr="+encodeURIComponent(pointAaddr)+
				"&baddr="+encodeURIComponent(pointBaddr)+
				"&acityid="+CITYID__+
				"&bcityid="+CITYID__+
				"&wayid="+waysHistoryId
			);
	};
	historyAddRoute=function(waysHistoryId,pts,route){
		if(LOCALE__!='ru'){return false}
		//return false;
		var spts = '';
		spts += pointAaddr+';'+pointBaddr+';'+route.getW1()+';'+route.getW2()+';';
		var temppts = pts.split(';');
		var j = 0;
		var len = route.getUnitCount();
		for(var i=0;i<len;i++){
			if(route.getUnitType(i)!=0){
				spts += route.getUnitIcwn(i)+','+route.getPointCount(i)+','+route.getUnitWalkBefore(i)+','+temppts[j]+';';
				j++;
			}
		}
		
		GDownloadUrl('/modules/history/loaders/addroute.loader.php',function(data)
				{//тут уже надо вернуть количество попутчиков по этому маршруту
					var xml=GXml.parse(data);
					if(xml && xml.firstChild && xml.firstChild.getAttribute('link')!=''){
						var num = xml.firstChild.getAttribute('num');
						var str = '';
						if(num==0){
							str += NO_FELLA_WORD;
						}
						else{
							str += '<a href="'+xml.firstChild.getAttribute('link')+'" target="_blank">'+num+' '+sklonit(FELLA_WORD,num)+'</a>';
						}
						route.setFellaz(num,str);
						gid('fellaz-'+route.getUid()).innerHTML = str;
						
						//var routeId = xml.firstChild.getAttribute('routeid');
						//var userStatus = xml.firstChild.getAttribute('userstatus');
						//var oldRating = xml.firstChild.getAttribute('oldrating');
						var routeId = 1;
						var userStatus = 'notvoted';
						var oldRating = 3;
						//route.setRating(routeId, userStatus, oldRating);
					}
				},
				"&pts="+pts+
				"&spts="+spts+
				"&wayid="+waysHistoryId
			);
	};
	/*=== конец функций по истории и попутчикам ===*/
	getRoutes=function(target,showtraf,timetraf,waysHistoryId){
		if(pointA&&pointB)
		{
			var distance = Math.round(pointA.getPoint().distanceFrom(pointB.getPoint()));
			if(distance==0){
				alert(SIMILAR_START_DEST_POINTS_ERROR);
				return null;
			}
			clearCheckpoints();
			// очищаем объекты и объявления на карте
			objectManager.clearPoints(map);
			var loadingblock = gid('loading');
			setBlockTopOffset(loadingblock,200);
			loadingblock.style.display='block';
			var start = 0;
			var cuttrans = checkTrans();
			
			waysHistoryId = waysHistoryId==null?0:waysHistoryId;
			gid('hid').value = waysHistoryId;
			historyAddWay(waysHistoryId);
			showtraf = showtraf==null?1:showtraf;
			timetraf = timetraf==null?0:timetraf;
			CDownloadUrl('get',CORE_FOLDER+"gsearch.htm?rad="+encodeURIComponent(n)+
								"&target=summary"+
								"&types="+cuttrans+
								"&alat="+encodeURIComponent(pointA.getPoint().lat())+
								"&alng="+encodeURIComponent(pointA.getPoint().lng())+
								"&blat="+encodeURIComponent(pointB.getPoint().lat())+
								"&blng="+encodeURIComponent(pointB.getPoint().lng())+
								"&srt="+encodeURIComponent(start)+
								"&apt="+encodeURIComponent(gid('apt').value)+
								"&bpt="+encodeURIComponent(gid('bpt').value)+
								"&showtraf="+showtraf+"&timetraf="+timetraf+
								"&aaddr="+encodeURIComponent(pointAaddr)+
								"&baddr="+encodeURIComponent(pointBaddr)+
								"&cityid="+CITYID__+
								"&lang="+LOCALE__,
			function(data)
			{
				var xml=GXml.parse(data);
				//hid = xml.firstChild.getAttribute('hid');
				//gid('hid').value = hid;
				gid('loading').style.display='none';
				if(!xml || !xml.firstChild || !xml.firstChild.tagName || xml.firstChild.tagName=='parsererror'){
					alert(ROUTES_NOT_FOUND_POINTS_TOO_FAR);
					return false;
				}
				var err = parseRoutes(xml);
				if(routes.length==0){
					if(cuttrans!=''){
						alert(ROUTES_NOT_FOUND_TRY_MORE_TRANS);
					}
					else if(err[0]=='ErrorGoWalk'){
						var param = err[1].split('_');
						alert(TRY_WALK_1+param[0]+TRY_WALK_2+TRY_WALK_3+param[1]+TRY_WALK_4);
					}
					else if(err[0]=='ErrorNoRoutes'){
						alert(ROUTES_NOT_FOUND_POINTS_TOO_FAR);
					}
					else if(err[0]=='ErrorSamePoints'){
						alert(SIMILAR_START_DEST_POINTS_ERROR);
					}
					else if(err[0]=='ErrorObstacles'){
						alert(POINT_INSIDE_OBSTACLE_ERROR);
					}
					else if(err[0]=='NoGoodRoutes'){
						var param = err[1].split('_');
						alert(NO_GOOD_ROUTES_FOUND+'\r\n'+TRY_WALK_1+param[0]+TRY_WALK_2+TRY_WALK_3+param[1]+TRY_WALK_4);
					}
					else{
						alert(ROUTES_NOT_FOUND_POINTS_TOO_FAR);
					}
					specClear();
				}
				else{
					echoSerp(0,'results',true);
					scroll_();
				}
			}
			);
		}
		else
		{
			alert(ENTER_POINTS);
		}
	};
	this.reSortRoutes=function(combo){
			// перезапрашиваем маршруты с другой сортировкой
		var sortby = combo.value;
		getRoutes(sortby);
	};
	this.requestBySubstr=function(){
		var substr = gid('substr').value;
	
		if(substr==''){
			alert(ENTER_SEARCH_STRING);}
		else{
			//substr = encodeURIComponent(substr);
			gid('objtypes').style.display = 'none';
			gid('objs').innerHTML = '';
			gid('objs').style.display = 'block';
			gid('toroot').style.display = 'block';
			
			CDownloadUrl('get',CORE_FOLDER+'options.htm?s='+encodeURIComponent(substr)+'&act=objbysubstr&cityid='+CITYID__+"&lang="+LOCALE__ ,function(data){
       
				var xml=GXml.parse(data);
				var str = '<ul class="firstcol">';
			
				var objects = xml.firstChild.getElementsByTagName('o');
				var len = objects.length;
				var str = new Array('','','','');
				var quarter = Math.ceil(len/4);
				var delta = new Array(quarter,2*quarter,3*quarter,len);
				var name = '';
				for(var i=0;i<len;i++){
					for(var j=0;j<4;j++){
						if(i<delta[j]){
							name = objects[i].getAttribute('n');
							name = name.replace(/"/,'');
							str[j] += '<li><a onclick="setObject('+objects[i].getAttribute('lat')+
								','+objects[i].getAttribute('lng')+',\''+objects[i].getAttribute('n')+'\',\''+objects[i].getAttribute('a')+'\')"><strong>'+name.substring(0,2)+'</strong>'+name.substring(2,name.length)+'</a></li>';
							break;
						}
					}
				}
				gid('objs').innerHTML = '<ul>'+str[0]+'</ul>'+
				'<ul>'+str[1]+'</ul>'+
				'<ul>'+str[2]+'</ul>'+
				'<ul>'+str[3]+'</ul>';
			}
			);
		}
	};
	this.setObject=function(lat,lng,name,addr){
			// функция устанавливает точку, выбранную в окошке выбора объектов
		var pt = gid('hiddencontainer').value;
		var point = new GLatLng(lat,lng);
		if(pt == 'a'){
			objecta = new Array();
			objecta[0] = lat;
			objecta[1] = lng;
			objecta[2] = name;
			objecta[3] = addr;
			pointAaddr=name;
			if(pointA){
				map.removeOverlay(pointA);
			}
			pointA=gmAddPoint(map,point,pointAaddr,'','orig',true);
		}
		else{
			objectb = new Array();
			objectb[0] = lat;
			objectb[1] = lng;
			objectb[2] = name;
			objectb[3] = addr;
			pointBaddr=name;
			if(pointB){
				map.removeOverlay(pointB);
			}
			pointB=gmAddPoint(map,point,pointBaddr,'','dest',true);
		}
		map.panTo(point);
		gid(pt+'objname').value = name;
		gid('point'+pt+'street').value = addr;
		gid('point'+pt+'house').value = HOUSE_STRING;
		gid('point'+pt+'corp').value = CORP_STRING;
		gid('point'+pt+'build').value = BUILD_STRING;
		gid(pt+'FromText').value = '2';
		closeObjFinder();
	};
	this.toRoot=function(){
			// переключаемся в каталог типов объектов
		gid('objs').style.display = 'none';
		gid('objs').innerHTML = '';
		gid('toroot').style.display = 'none';
		gid('objtypes').style.display = 'block';
	};
	this.closeObjFinder=function(){
			// закрываем окошко с выбором объектов
		gid('objectfinder').style.display = 'none';
		gid('objs').style.display = 'none';
		gid('objs').innerHTML = '';
		gid('toroot').style.display = 'none';
		gid('objtypes').style.display = 'block';
	};
	this.getObjsByType=function(typeid){
			// выводим список объектов по айдишнику типа
		gid('objtypes').style.display = 'none';
		gid('objs').style.display = 'block';
		gid('toroot').style.display = 'block';
			//делаем запрос объектов
			
					CDownloadUrl('get',CORE_FOLDER+'options.htm?t='+typeid+'&act=objbytype&cityid='+CITYID__+"&lang="+LOCALE__,function(data){
			var xml=GXml.parse(data);
			var str = '<ul>';
				// и выводим объекты в блок #objs
			var objects = xml.firstChild.getElementsByTagName('o');
			var len = objects.length;
			var str = new Array('','','','');
			var quarter = Math.ceil(len/4);
			var delta = new Array(quarter,2*quarter,3*quarter,len);
			var name = '';
			var addr = '';
			for(var i=0;i<len;i++){
				for(var j=0;j<4;j++){
					if(i<delta[j]){
						name = objects[i].getAttribute('n');
						name = name.replace(/"/g,'\&#34;');
						addr = objects[i].getAttribute('a');
						addr = addr.replace(/"/g,'\&#34;');
						str[j] += '<li><a onclick="setObject('+objects[i].getAttribute('lat')+
							','+objects[i].getAttribute('lng')+',\''+name+'\',\''+addr+'\')"><strong>'+name.substring(0,2)+'</strong>'+name.substring(2,name.length)+'</a></li>';
						break;
					}
				}
			}
			var sup = '<ul class="firstcol">'+str[0]+'</ul>'+
			'<ul>'+str[1]+'</ul>'+
			'<ul>'+str[2]+'</ul>'+
			'<ul>'+str[3]+'</ul>';
			gid('objs').innerHTML = sup;
		});
	
	};
	this.getObject=function(pt){
			// открываем окошко выбора объектов
		gid('objectfinder').style.display = 'block';
		gid('hiddencontainer').value = pt;
		
			//делаем запрос категорий объектов
	
          CDownloadUrl('get',CORE_FOLDER+'options.htm?act=types&cityid='+CITYID__+"&lang="+LOCALE__,function(data){
                  var xml=GXml.parse(data);
			var str = '<ul class="firstcol">';
				// и выводим дерево категорий в блок #objtypes
			var types = xml.firstChild.getElementsByTagName('t');
			for(var i=0;i<types.length;i++){
				var subtypes = types[i].getElementsByTagName('st');
				if(i%5==0 && i>0){
					str += '</ul><ul>';
				}
				if(subtypes.length==0){
						// если нет подрубрик - выводим просто категорию
					str += '<li><a onclick="getObjsByType('+types[i].getAttribute('id')+')">'+types[i].getAttribute('n')+'</a></li>';
				}
				else{
					str += '<li>'+types[i].getAttribute('n')+'<ul>';
					for(var j=0;j<subtypes.length;j++){
						str += '<li><a onclick="getObjsByType('+subtypes[j].getAttribute('id')+')">'+subtypes[j].getAttribute('n')+'</a></li>';
					}
					str += '</ul></li>';
				}
			}
			gid('objtypes').innerHTML = str;
		} 
           
        );
    };
	this.showNumPointsWin=function(event,srcElem,numPoints){
			// показываем окошко с инфой о пробках
		var elem = gid('numpoints-win');
		elem.innerHTML = numPoints;
		var pos = getPositionByElem(srcElem);
		pos.y += 28;
		//pos.x += srcElem.offsetWidth+5;
		elem.style.left = pos.x + "px";
		elem.style.top 	= pos.y + "px";
		elem.style.display = 'block';
	};
	closeNumPointsWin=function(numPoints){
			// скрываем окошко с инфой о пробках
		gid('numpoints-win').style.display = 'none';
	};
	this.showTrafficWin=function(uid,unit){
			// показываем окошко с инфой о пробках
		var elem = gid('traf-win');
		elem.innerHTML = gid('traf-'+uid+'-'+unit).innerHTML;
		var pos = getPositionById('trafswitch-'+uid+'-'+unit);
		pos.y += 25;
		elem.style.left = pos.x + "px";
		elem.style.top 	= pos.y + "px";
		elem.style.display = 'block';
	};
	this.closeTrafficWin=function(uid,unit){
			// скрываем окошко с инфой о пробках
		gid('traf-win').style.display = 'none';
	};
	this.showLinkToRoutes=function(offsetElem){
			// показываем окошко со ссылкой на маршруты
		var elem = gid('link-to-routes-win');
		var pos = getPositionById(offsetElem.id);
		elem.style.left = pos.x + "px";
		elem.style.top 	= pos.y + "px";
		elem.style.display = 'block';
	};
	
	this.closeLinkToRoutes=function(){
			// показываем окошко со ссылкой на маршруты
		gid('link-to-routes-win').style.display = 'none';
	};
	
	this.getRoutesPrepare=function(){
		
				// функция готовит координаты точек и делает запрос к серверу, принимает ответ и выдает маршруты, если они нашлись
		gid('traffic-time').value=0;
		haveToLoadSecondPage = true;
		var aFromText = gid('aFromText').value;
		var bFromText = gid('bFromText').value;
		
		if(aFromText==0){pointAaddr=START_POINT;}
		if(bFromText==0){pointBaddr=DESTINATION_POINT;}
		
		if(aFromText!=1 && bFromText!=1){
				// ничего не надо геокодить — сразу запрашиваем маршруты у сервера
			getRoutes('');
		}
		else if((aFromText==0 || aFromText==2) && bFromText==1){
			if(pointA){
				pointByAddr('pointB', 'pointbstreet', 'pointbhouse', 'pointbcorp', 'pointbbuild','b');
			}
			else{
				alert(ENTER_START_POINT);
			}
		}
		else if(aFromText==1 && (bFromText==0 || bFromText==2)){
			if(pointB){
				pointByAddr('pointA', 'pointastreet', 'pointahouse', 'pointacorp', 'pointabuild','a');
			}
			else{
				alert(ENTER_DESTINATION_POINT);
			}
		}
		else{
				// все введено с клавиатуры — сначла все геокодим, потом к серверу
			pointByAddr('pointA', 'pointastreet', 'pointahouse', 'pointacorp', 'pointabuild','both');
		}
		
	};
	
	this.selectTextarea=function(textarea){
		textarea.focus();
		textarea.select();
	};
	echoContextAds = function(containerId){
		var container=gid(containerId);
		var str = gid('context-ads-src').innerHTML;
		container.innerHTML = str;
	};
	showTextResults =function(){
		gid('results_').style.display='block';
	};
	this.switchMap=function(num,offset)
	{
		var link = gid('resh-'+offset);
		link.innerHTML = routes[num].getHtmlInnerHeader(num,offset,false);
		showRouteOnMap(routes[num]);
		var i=0;
		var start = num-offset;
		while(i<PAGE_SIZE){
			if(i!=offset){
				var c = gid('resh-'+i);
				if(c){
					c.innerHTML = routes[start+i].getHtmlInnerHeader(start+i,i,true);
				}
			}
			i++;
		}
	};
	
	hiddenSort=function(routeNum,target,maximum){
			// скрытые запросы на сортировку
		showtraf = 1;
		timetraf = gid('traffic-time').value;
		historyAddRoute(gid('hid').value,routes[routeNum].getPts(),routes[routeNum]);
		if(routeNum<routes.length-1 && routeNum<maximum-1){
			hiddenSort(routeNum+1,target,maximum);
		}
	};
	
	this.getBestTargetRoute=function(routeNum,target){
			// делаем запрос на лучший маршрут внутри дерева по некоему критерию
		showtraf = 1;
		timetraf = gid('traffic-time').value;
		
		CDownloadUrl('get',CORE_FOLDER+"target.htm?routenum="+encodeURIComponent(routeNum)+
								"&route="+encodeURIComponent(routeNum)+
								"&target="+encodeURIComponent(target)+
								"&showtraf="+encodeURIComponent(showtraf)+
								"&timetraf="+encodeURIComponent(timetraf)+
								"&cityid="+encodeURIComponent(CITYID__)+
								"&alat="+encodeURIComponent(pointA.getPoint().lat())+
								"&alng="+encodeURIComponent(pointA.getPoint().lng())+
								"&blat="+encodeURIComponent(pointB.getPoint().lat())+
								"&blng="+encodeURIComponent(pointB.getPoint().lng())+
								"&lang="+LOCALE__
								,function(data)
			{
				var xml=GXml.parse(data);
				if(xml && xml.firstChild && xml.firstChild.tagName == 'r'){
					var routesXml = xml.firstChild;
					var pastStats = new Array();
					pastStats['speed'] = routes[routeNum].getTime();
					pastStats['changes'] = routes[routeNum].getChangeCount();
					pastStats['walk'] = routes[routeNum].getWalk();
					pastStats['cost'] = routes[routeNum].getCost();
					//добавляем маршрут в историю и запрашиваем попутчиков
					routes[routeNum] = parseRoute(routesXml,routeNum);
					historyAddRoute(gid('hid').value,routesXml.getAttribute('pts'),routes[routeNum]);
					var offset = routeNum%PAGE_SIZE;
					gid('result-'+offset).innerHTML = echoTextRoute(routes[routeNum],routeNum,offset,false,false,false,false,pastStats);
					if(allowBlink){calculateBlink(routes[routeNum],routeNum,pastStats,true)}
					this.switchMap(routeNum,offset);
					showRouteOnMap(routes[routeNum]);
				}
				else{
					alert('Не удалось подгрузить маршрут.');
				}
			}
		);
	};
	
	this.switchRoute=function(wayid,na,nb,unitNum,routeNum,target,type,showtraf,timetraf,cityid){
		closeNumPointsWin(0);
		showtraf = 1;
		timetraf = gid('traffic-time').value;
		
			// переключаем маршрут по запросу юзера
		CDownloadUrl('get',CORE_FOLDER+"unit.htm?wayid="+encodeURIComponent(wayid)+
								"&na="+encodeURIComponent(na)+
								"&nb="+encodeURIComponent(nb)+
								"&unit="+encodeURIComponent(unitNum)+
								"&route="+encodeURIComponent(routeNum)+
								"&target="+encodeURIComponent(target)+
								"&type="+encodeURIComponent(type)+
								"&showtraf="+encodeURIComponent(showtraf)+
								"&timetraf="+encodeURIComponent(timetraf)+
								"&cityid="+encodeURIComponent(CITYID__)+
								"&alat="+encodeURIComponent(pointA.getPoint().lat())+
								"&alng="+encodeURIComponent(pointA.getPoint().lng())+
								"&blat="+encodeURIComponent(pointB.getPoint().lat())+
								"&blng="+encodeURIComponent(pointB.getPoint().lng())+
								"&lang="+LOCALE__
								,function(data)
			{
				var xml=GXml.parse(data);
				if(xml && xml.firstChild && xml.firstChild.tagName == 'r'){
					var routesXml = xml.firstChild;
					var pastStats = new Array();
					pastStats['speed'] = routes[routeNum].getTime();
					pastStats['changes'] = routes[routeNum].getChangeCount();
					pastStats['walk'] = routes[routeNum].getWalk();
					pastStats['cost'] = routes[routeNum].getCost();
					//добавляем маршрут в историю и запрашиваем попутчиков
					routes[routeNum] = parseRoute(routesXml,routeNum);
					historyAddRoute(gid('hid').value,routesXml.getAttribute('pts'),routes[routeNum]);
					var offset = routeNum%PAGE_SIZE;
					gid('result-'+offset).innerHTML = echoTextRoute(routes[routeNum],routeNum,offset,false,false,false,false,pastStats);
					if(allowBlink){calculateBlink(routes[routeNum],routeNum,pastStats,true)}
					this.switchMap(routeNum,offset);
					showRouteOnMap(routes[routeNum]);
				}
				else{
					alert('Не удалось подгрузить маршрут.');
				}
			}
		);
	};
	calculateBlink=function(route,routeNum,pastStats,blinkActive){
		/*var news = new Array();
		if(pastStats['speed']!=route.getTime()){
			news.push('route-'+routeNum+'-speed');
		}
		if(pastStats['changes']!=route.getChangeCount()){
			news.push('route-'+routeNum+'-changes');
		}
		if(pastStats['walk']!=route.getWalk()){
			news.push('route-'+routeNum+'-walk');
		}
		if(pastStats['cost']!=route.getCost()){
			news.push('route-'+routeNum+'-cost');
		}
		
		var active = new Array();
		
		if(blinkActive){
			var len = route.getUnitCount();
			for(var i=0;i<len;i++){
				active.push('active-'+routeNum+'-'+i);
			}
		}
		if(news.length>0 || active.length>0){
			blinkItSpecial(250,news.join(','),active.join(','),6);
		}*/
	};
	parseRoutes=function(xml)
	{
		var all = xml.firstChild;
		routes = new Array();
		var routesXml = xml.documentElement.getElementsByTagName("r");
		for(var i=0;i<routesXml.length;i++){
			routes[i] = parseRoute(routesXml[i],i);
		}
		var err = new Array();
		err[0] = all.getAttribute('err');
		err[1] = all.getAttribute('param');
		return err;
	};
	parseRoute=function(a,num_)
	{
		var b=new cRoute();
		b.setHeaders(num_,a.getAttribute('cc'),a.getAttribute('pc'),a.getAttribute('c'),a.getAttribute('t'),a.getAttribute('l'),a.getAttribute('w1'),a.getAttribute('w2'),a.getAttribute('target'),a.getAttribute('wtotal'),a.getAttribute('pts'));
		var c=a.getElementsByTagName("u");
		for(var i=0;i<c.length;i++)
		{
			b.addUnitHeaders(c[i].getAttribute('wn'),c[i].getAttribute('wt'),c[i].getAttribute('pc'),c[i].getAttribute('t'),c[i].getAttribute('l'),c[i].getAttribute('c'),c[i].getAttribute('wb'),c[i].getAttribute('tq'),c[i].getAttribute('td'),c[i].getAttribute('iwn'),c[i].getAttribute('icwn'),num_,c[i].getAttribute('unum'),c[i].getAttribute('url'));
			var d=c[i].getElementsByTagName("p");
			for(var j=0;j<d.length;j++)
			{
				b.addPoint(d[j].getAttribute('n'),d[j].getAttribute('a'),d[j].getAttribute('lat'),d[j].getAttribute('lng'),HASTRAF__,d[j].getAttribute('traf'))
			}
		}
		return b;
	};
	echoTextRoute=function(route,num,offset,withDiv,echoToPrint,allLinks,doBlink,pastStats)
	{	// функция выводит в строку текстово-графическое представление маршрута
		withDiv = withDiv==null?true:withDiv;
		echoToPrint = echoToPrint==null?false:echoToPrint;
		allLinks = allLinks==null?false:allLinks;
		doBlink = doBlink==null?false:doBlink;
		var str='';
		if(withDiv){str += '<div id="result-'+offset+'" class="result">';}
		if(offset==0){
			str+=route.getHtmlHeader(num,offset,false);
		}
		else{
			str+=route.getHtmlHeader(num,offset,true);
		}
		str+=route.getRouteInfo(echoToPrint,true);
		str+='<div class="textroute">';
		str+=route.getBegPoint(pointAaddr);
		str+=route.getUnitsInText();
		str+=route.getEndPoint(pointBaddr);
		str+='</div>';
		
		if(offset==0){
			//str += '<span id="tomap-'+offset+'" class="ajaxlink checked tomap" onClick="switchMap('+num+','+offset+');">'+ON_MAP+'</span>';
		}
		else{
			//str += '<span id="tomap-'+offset+'" class="ajaxlink tomap" onClick="switchMap('+num+','+offset+');">'+PUT_TO_MAP+'</span>';
		}
		str += '<span id="toprint-'+offset+'" class="ajaxlink toprint" onClick="toPrint('+num+','+offset+');">'+PUT_TO_PRINT+'</span>';
		if(withDiv){str+='</div>';}
		
		if(doBlink && allowBlink){
			//blinkIt(250,'routeinfo-'+num,6);
		}
		
		if(pastStats==2 && allowBlink){
			var news = new Array();
			if(pastStats['speed']!=route.getTime()){
				news.push('route-'+num+'-speed');
			}
			if(pastStats['changes']!=route.getChangeCount()){
				news.push('route-'+num+'-changes');
			}
			if(pastStats['walk']!=route.getWalk()){
				news.push('route-'+num+'-walk');
			}
			if(pastStats['cost']!=route.getCost()){
				news.push('route-'+num+'-cost');
			}
			if(news.length>0){
				blinkItSpecial(250,news.join(','),6);
			}
		}
		return str;
	};
	blinkItSpecial=function(time,stat,active,iterator) {
		if (iterator == 0) {
			clearTimeout(blinker);
			return true;
		}
		
		var elems_ = stat.split(',');
		for(var i=0;i<elems_.length;i++){
			if(gid(elems_[i])){
				if(iterator%3 == 0){
					gid(elems_[i]).style.visibility = "hidden";
				}
				else if(iterator%3 == 2){
					gid(elems_[i]).style.visibility = "visible";
					gid(elems_[i]).style.fontWeight = 'bold';
				}
				else {
					gid(elems_[i]).style.visibility = "visible";
					gid(elems_[i]).style.fontWeight = 'normal';
				}
			}
		}
		
		var elems_ = active.split(',');
		for(var i=0;i<elems_.length;i++){
			if(gid(elems_[i])){
				if(iterator%3 == 0){
					gid(elems_[i]).style.visibility = "hidden";
				}
				else if(iterator%3 == 2){
					gid(elems_[i]).style.visibility = "visible";
					gid(elems_[i]).style.fontWeight = 'normal';
				}
				else {
					gid(elems_[i]).style.visibility = "visible";
					gid(elems_[i]).style.fontWeight = 'bold';
				}
			}
		}
		
		clearTimeout(blinker);
		iterator--;
		blinker = setTimeout('blinkItSpecial('+time+',\''+stat+'\',\''+active+'\','+iterator+')', time);
	};
	/*blinkIt=function(time,elem,iterator) {
		if (iterator == 0) {
			clearTimeout(blinker);
			return true;
		}
		
		if(iterator%2 == 0){
			gid(elem).style.visibility = "hidden";
		}
		else {
			gid(elem).style.visibility = "visible";
		}
		clearTimeout(blinker);
		iterator--;
		blinker = setTimeout('blinkIt('+time+',\''+elem+'\','+iterator+')', time);
	};*/
	showRouteOnMap=function(a)
	{
		if(a!=null)
		{
			clearCheckpoints();
			p=new Array();
			var b=a.getUnitCount();
			//var pointBeg = null;
			var pointBeg = pointA.getPoint();
			for(var i=0;i<b;i++)
			{
				if(a.getUnitType(i)!=0){
					var c=a.getMapWayName(i);
					var d=a.getPointCount(i);
					for(var j=0;j<=d;j++)
					{
						var e=new GLatLng(a.getPLat(i,j),a.getPLng(i,j));
						p.push(gmAddCheckpoint(map,e,a.getPName(i,j),a.getPAddress(i,j),c,a.getPTextStyle(i),a.getPMapIconLink(i,j)));

						if((i>0 || j>0) && pointBeg!=pointA.getPoint() && allowPolylines){
							polylines.push(new GPolyline([pointBeg,e], "#ff0000", 5));
							map.addOverlay(polylines[polylines.length-1]);//dfdf
						}
						else if(i==0 && j==0 && pointBeg!=pointA.getPoint() && allowPolylines){
							polylines.push(new GPolyline([pointA.getPoint(),e], "#ff0000", 5));
							map.addOverlay(polylines[polylines.length-1]);//dsfdsf
						}
						pointBeg = e;
					}
				}
			}
			if(pointBeg==null){
				pointBeg = pointA.getPoint();
			}
			polylines.push(new GPolyline([pointBeg,pointB.getPoint()], "#ff0000", 5));
			if(allowPolylines){
				//map.addOverlay(polylines[polylines.length-1]);//dsfdsfdsf
			}
			
			var bounds = new GLatLngBounds();
			for (var i=0; i< p.length; i++) {
				bounds.extend(p[i].getPoint());
			}
			bounds.extend(pointA.getPoint());
			bounds.extend(pointB.getPoint());
			map.setZoom(map.getBoundsZoomLevel(bounds));
			map.setCenter(bounds.getCenter());
		}
	};
	hideHint=function(){
		gid('infohint').style.display = 'none';
		clearTimeout(t1);
	};
	this.showHint=function(){
		gid('infohint').style.display = 'block';
		t1=setTimeout(hideHint,1000);
	};
	this.focusinput=function(input, defaultstr,pt){
		if(input.value == defaultstr){
			input.value = "";
			if(pt=='a'){
				objecta = null;
			}
			else{
				objectb = null;
			}
		}

	};
	this.keydown=function(event,pt){
		if(pt=='a'){
			objecta = null;
		}
		else{
			objectb = null;
			var key = event.keyCode;
			if(key==13){
				doSearch();
			}
		}
	};
	this.blurinput=function(input, defaultstr,pt){
		if(input.value == ""){
			input.value = defaultstr;
		}
		else{
			switchTriggers(pt);
		}
	};
	switchTriggers=function(point){
		if(point=='a'){
			gid('aFromText').value = '1';
		}
		else if(point=='b'){
			gid('bFromText').value = '1';
		}
	};
	scroll_=function()
	{
		var a=0;
		if(typeof(window.pageYOffset)=='number')
		{
			a=window.pageYOffset
		}
		else if(document.body&&(document.body.scrollLeft||document.body.scrollTop))
		{
			a=document.body.scrollTop
		}
		else if(document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop))
		{
			a=document.documentElement.scrollTop;
		}
		
		if(a<120)
		{
			window.scrollBy(0,400);
			t=setTimeout(scroll_,5);
		}
		else clearTimeout(t);
	};
	clearCheckpoints=function()
	{
		for(var i=0;i<p.length;i++)
		{
			map.removeOverlay(p[i]);
		}
		for(var i=0;i<polylines.length;i++)
		{
			map.removeOverlay(polylines[i]);
		}
	};
	this.clearMap=function()
	{
		clearPoints();
		map.clearOverlays();
		gid('log').innerHTML='';
	};
	this.newSearch=function(){
			// при новом поиске сначала чистим карту и выдачу
		clearAll();
			// а затем чистим все объекты поиска
		haveToLoadSecondPage = true;
	};
	specClear=function(){
		resetCheckboxes();
		gid('results_').style.display='none';
		gid('traffic-time').value = 0;
	};
	clearAll=function(){
		resetMap();
		clearPoints();
		resetCheckboxes();
		gid('results_').style.display='none';
		gid('traffic-time').value = 0;
	};
	resetCheckboxes=function(){
		for(var i=1;i<=6;i++){
			checkbox = gid('cb'+i);
			checkbox.checked=true;
		}
	};
	resetMap=function(){
		b = 12;
		c = CITY_LAT[CITYID__];
		d = CITY_LNG[CITYID__];
		map.setCenter(new GLatLng(c,d),b);
	};
	this.clearPoints=function()
	{
		if(pointA){
			map.removeOverlay(pointA);
		}
		if(pointB){
			map.removeOverlay(pointB);
		}
		clearCheckpoints();
		pointA=null;
		pointB=null;
		objecta=null;
		objectb=null;
		gid('aFromText').value = '1';
		gid('bFromText').value = '1';
		pointAaddr='';
		pointBaddr='';
		gid('pointastreet').value = STREET_STRING;
		gid('pointahouse').value = HOUSE_STRING;
		gid('pointacorp').value = CORP_STRING;
		gid('pointabuild').value = BUILD_STRING;
		gid('pointbstreet').value = STREET_STRING;
		gid('pointbhouse').value = HOUSE_STRING;
		gid('pointbcorp').value = CORP_STRING;
		gid('pointbbuild').value = BUILD_STRING;
		
		// очищаем объекты и объявления на карте
		objectManager.clearPoints(map);
	};
	pointByAddr=function(pointname, street, house, corp, build,param)
	{
			var tmpparam = param=='both'?'a':param;
		if((tmpparam=='a' && objecta) || (tmpparam=='b' && objectb)){
				// если мы вводили не адресом, а выбором из списка
			if(tmpparam=='a'){
				var pt = new GLatLng(objecta[0],objecta[1]);
			}
			else{
				var pt = new GLatLng(objectb[0],objectb[1]);
			}
			
			var shortaddress = gid(tmpparam+'objname').value+' ('+gid('point'+tmpparam+'street').value+')';
			
			if(pointname=='pointA'){
				if(!pointA){
					pointA=gmAddPoint(map,pt,START_POINT,'','orig',true);
				}
				else{
					pointA.setPoint(pt);
				}
				pointAaddr=shortaddress;
				if(param=='a'){
					getRoutes('');
				}
				else if(param=='both'){
					pointByAddr('pointB', 'pointbstreet', 'pointbhouse', 'pointbcorp', 'pointbbuild','b');
				}
			}
			else{
				if(!pointB){
					pointB=gmAddPoint(map,pt,DESTINATION_POINT,'','dest',true);
				}
				else{
					pointB.setPoint(pt);
				}
				pointBaddr=shortaddress;
				
				if(param=='b'){
					getRoutes('');
				}
			}
			map.panTo(pt,map.getZoom());
		}
		else{
			var street = getbyid(street).value;
			var house = getbyid(house).value;
			var corp = getbyid(corp).value;
			var build = getbyid(build).value;
		
			if(street==STREET_STRING && house==HOUSE_STRING && corp==CORP_STRING && build==BUILD_STRING){
				alert(ENTER_ADDRESS);
				return false;
			}
			else if(corp.indexOf('/')>-1 || build.indexOf('/')>-1){
				alert(SLASH_HOUSE);
				return false;
			}
		
			if(street==STREET_STRING){
				street='';
			}
			if(house==HOUSE_STRING){
				house='';
			}
			if(corp==CORP_STRING){
				corp='';
			}
			if(build==BUILD_STRING){
				build='';
			}
			if(corp != ''){
				house = house+CORP_STRING_SHORT+corp;
			}
			if(build != ''){
				house = house+BUILD_STRING_SHORT+build;
			}
		
			var address;
			var shortaddress;
			if(street.toLowerCase().indexOf('метро ')==0 || house==''){
				address = 'Россия, '+CITY_NAME[CITYID__]+', '+street;
				shortaddress = street;
			}
			else{
				address = 'Россия, '+CITY_NAME[CITYID__]+', '+street+', '+house;
				shortaddress = street+', '+house;
			}
		
			if(geocoder)
			{
				geocoder.getLatLng(address,function(a)
				{
					if(!a)
					{
						alert(ADDRESS_NOT_FOUND_1+address+ADDRESS_NOT_FOUND_2);
					}
					else
					{
						if(pointname=='pointA')
						{
							if(!pointA)
							{
								pointA=gmAddPoint(map,a,START_POINT,'','orig',true);
							}
							else
							{
								pointA.setPoint(a);
							}
							pointAaddr=shortaddress;
							if(param=='a'){
								getRoutes('');
							}
							else if(param=='both'){
								pointByAddr('pointB', 'pointbstreet', 'pointbhouse', 'pointbcorp', 'pointbbuild','b');
							}
						}
						else
						{
							if(!pointB)
							{
								pointB=gmAddPoint(map,a,DESTINATION_POINT,'','dest',true);
							}
							else
							{
								pointB.setPoint(a);
							}
							pointBaddr=shortaddress;
						
							if(param=='b'){
								getRoutes('');
							}
						}
						map.panTo(a,map.getZoom());
					}
				}
				)
			}
		}
	};
	this.printPage=function(num){
		// функция выводит в отдельный блок выбранный для печати маршрут и кнопку "распечатать"
		var printblock  = gid('printblock');
		var str = '<a id="closeprint" onclick="closePrint();">'+CLOSE_WINDOW+'</a>'+
			'<a id="doprint" onclick="window.print();">'+DO_PRINT+'</a>'+
			'<div class="printhead">'+
			'	<h3>'+CITY_ROUTES[CITYID__]+' <br/>http://'+CITY_SUBDOMAIN[CITYID__]+'.rusavtobus.ru/</h3>'+
			'</div>';
			
		var i=0;
		while(i<PAGE_SIZE && (i+num)<routes.length){
			
			var result = gid('result-'+i);
			var elems = getElementsByClassName('routeinfo','div',result);
			str += '<div class="result">';
			str += '<h2>'+(i+1)+' '+VARIANT_WORD+'</h2>';
			str += '<div class="routeinfo">'+elems[0].innerHTML+'</div>';
		
			elems = getElementsByClassName('textroute','div',result);
			str += '<div class="textroute">'+elems[0].innerHTML+'</div>';
			str += '</div>';
			i++;
		}
		
		printblock.innerHTML = str;
		setBlockTopOffset(printblock,20);
		printblock.style.display = 'block';		
	}
	this.toPrint=function(a,b){
			// функция выводит в отдельный блок выбранный для печати маршрут и кнопку "распечатать"
		var printblock  = gid('printblock');
		var str = '<a id="closeprint" onclick="closePrint();">'+CLOSE_WINDOW+'</a>'+
			'<a id="doprint" onclick="window.print();">'+DO_PRINT+'</a>'+
			'<div class="printhead">'+
			'<img src="'+RES_ROOT+'images/'+RES_FOLDER+'/'+IMAGES_ROOT+'/logo-white.gif" alt="'+CITY_ROUTES[CITYID__]+'"/>'+
			'	<h3>'+CITY_ROUTES[CITYID__]+' <br/>http://'+CITY_SUBDOMAIN[CITYID__]+'.rusavtobus.ru/</h3>'+
			'</div>';

		var result = gid('result-'+b);
		
		str += '<div class="result">';
		str += '<h2>'+YOUR_ROUTE+'</h2>'
		str += routes[a].getRouteInfoForPrint();
		
		str += '<div class="textroute">';
		str += routes[a].getBegPoint(pointAaddr);
		str += routes[a].getUnitsInText(true);
		str += routes[a].getEndPoint(pointBaddr);
		str += '</div>';
		
		printblock.innerHTML = str;
		setBlockTopOffset(printblock,20);
		printblock.style.display = 'block';
	};
	setBlockTopOffset=function(block,offset){
			// функция позиционирует нужный блок с нужным отступом сверху при любой позиции скролла в браузере
		var a=0;
		if(typeof(window.pageYOffset)=='number')
		{
			a=window.pageYOffset
		}
		else if(document.body&&(document.body.scrollLeft||document.body.scrollTop))
		{
			a=document.body.scrollTop
		}
		else if(document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop))
		{
			a=document.documentElement.scrollTop;
		}
		block.style.top = (a+offset)+'px';
	};
	this.closePrint=function(){
			// функция выводит в отдельный блок выбранный для печати маршрут и кнопку "распечатать"
		gid('printblock').style.display = 'none';
	};
	this.closeCurrentMarker=function(){
		objectManager.closeCurrentMarker();
	};
	this.doQuestion_=function(){
		var alat='-1';
		var alng='-1';
		var blat='-1';
		var blng='-1';
		if(pointB){
			blat=pointB.getPoint().lat();
			blng=pointB.getPoint().lng();
		}
		if(pointA){
			alat=pointA.getPoint().lat();
			alng=pointA.getPoint().lng();
		}
		if(document.getElementById('email').value != "" && document.getElementById('email').value != YOUR_MAIL){
			dojo.xhrPost({
         	  url: CORE_FOLDER+'send.htm',
         	  load: success,
         	  content: {email: dojo.byId('email').value,
						question: dojo.byId('question').value,
						blat: blat,
						blng: blng,
						alat: alat,
						alng: alng,
						lang: LOCALE__,
						cityid: CITYID__
						}
			});
		}
	};
	function success(data,ioArgs){
		if(data=='<all/>'){
						document.getElementById("questions").innerHTML = 
							'<fieldset><input type="button" id="newquestion" name="newquestion" value="'+MESSAGE_SENT_RENEW+'" onclick="resetQuestion();"/></fieldset>';
					}else{
						alert(data);	
					}
	}
	resetQuestion=function(){
		document.getElementById("questions").innerHTML = '<fieldset>'+
		'<input type="text" id="email" name="email" value="'+YOUR_MAIL+'" onfocus="focusinput_(this,&#39;'+YOUR_MAIL+'&#39;);" onblur="blurinput_(this,&#39;'+YOUR_MAIL+'&#39;);"/><br/>'+
		'<textarea name="question" id="question"></textarea><br/>'+
		'<input type="button" id="submitquestion" name="submitquestion" value="'+SEND_MESSAGE+'" onclick="doQuestion_();"/>'+
		'</fieldset>';
	};
	this.showElement=function(id){
		gid(id).style.display = 'block';
	};
	this.hideElement=function(id){
		gid(id).style.display = 'none';
	};
	function getElementsByClassName(strClass, strTag, objContElm) {
		strTag = strTag || "*";
		objContElm = objContElm || document;
		var objColl = objContElm.getElementsByTagName(strTag);
		if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
		var arr = new Array();
		var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
		var arrClass = strClass.split(delim);
		for (var i = 0, j = objColl.length; i < j; i++) {
			var arrObjClass = objColl[i].className.split(' ');
			if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
				var c = 0;
				comparisonLoop:
				for (var k = 0, l = arrObjClass.length; k < l; k++) {
					for (var m = 0, n = arrClass.length; m < n; m++) {
						if (arrClass[m] == arrObjClass[k]) c++;
						if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
							arr.push(objColl[i]);
							break comparisonLoop;
						}
					}
				}
			}
		return arr;
	};
	getPositionByMouse=function(e){
		var x_ = 0, y_ = 0;

		if (!e) e = window.event;

		if (e.pageX || e.pageY)
		{
			x_ = e.pageX;
			y_ = e.pageY;
		}
		else if (e.clientX || e.clientY)
		{
			x_ = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
			y_ = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
		}
		return {x:x_, y:y_};
	};
	getPositionByElem = function(elem){
		var e = elem;
		var obj = e;
		var curleft = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				curleft += obj.offsetLeft;
				obj = obj.offsetParent;
			}
		}
		else if (obj.x)
			curleft += obj.x;

		curleft -= Math.floor((document.documentElement.offsetWidth - gid('container').offsetWidth)/2)
	
		var obj = e;
	
		var curtop = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				curtop += obj.offsetTop;
				obj = obj.offsetParent;
			}
		}
		else if (obj.y)
			curtop += obj.y;

		return {x:curleft, y:curtop};
	};
	getPositionById = function(id)
	{
		var e = gid(id);
		var obj = e;
		var curleft = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				curleft += obj.offsetLeft;
				obj = obj.offsetParent;
			}
		}
		else if (obj.x)
			curleft += obj.x;

		curleft -= Math.floor((document.documentElement.offsetWidth - gid('container').offsetWidth)/2)
	
		var obj = e;
	
		var curtop = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				curtop += obj.offsetTop;
				obj = obj.offsetParent;
			}
		}
		else if (obj.y)
			curtop += obj.y;

		return {x:curleft, y:curtop};
	};
}