var mapview;var savedPos;var stCh;var TIMEOUT=30000;var TOOLBAR_HEIGHT=50;var SB_HEIGHT=27;var INFO_WND_WIDTH=200;var INFO_WND_HEIGHT=150;var S_WND_WIDTH=680;var S_WND_HEIGHT=450;var L_WND_WIDTH=270;var L_WND_HEIGHT=180;var ID_SEP='_';var MAX_SCALE=500;var MIN_SCALE=3000000;var selExtParams=new ObjExtParams();selExtParams.addMapParam(ObjParams.Map);selExtParams.addMapParam(ObjParams.Layer);selExtParams.addMapParam(ObjParams.Name);selExtParams.addMapParam(ObjParams.Semantics);var infoWnd;var searchWnd;var linkWnd;var routeWnd;function main(){var hideMask=function(){Ext.fly('loading-mask').fadeOut({remove:true});};Ext.get('loading').remove();hideMask.defer(250);stCh=new StatusChecker();extend(MeasureManager,DrawManager);extend(RouteManager,DrawManager);var canv=getCanvas();canv.width=0;canv.height=0;var firstload=true;var mask=new Ext.LoadMask(Ext.getBody(),{msg:'Пожалуйста, подождите... (<a href="javascript:void(0)" onclick="abort();">Отменить запрос</a>)'});MapView.setCrossDomain(false);mapview=new MapView(Ext.getDom('map'),0,5000);var ptr=new ObjPtr(APP_ROOT+"content/images/ptr.gif",{width:21,height:32},10,function(sz){return{x:sz.width/2,y:sz.height}});mapview.enableDragMode();mapview.enableSelectMode();mapview.enableWheelZoom();mapview.setTimeout(TIMEOUT);mapview.addOnTimeOut(function(id,msg){mask.hide();stCh.remove();stCh.update();alert(msg);});mapview.addOnAbort(function(id){mask.hide();stCh.remove();stCh.update();});var loginCtrl=new LoginCtrl('btnLogin','mapPanel',L_WND_WIDTH,L_WND_HEIGHT);loginCtrl.onLogout=function(sender,args){mapview.logout(null,function(id,isnew,type,res){if(res.Status==LStatus.Empty){window.location.href=LOGIN_PAGE;return false;}sender.setAnonymousText();msPanel.loadRoot();setUserMapSet(res.MapSet);return true;})};loginCtrl.onLogin=function(sender,args){mapview.login(args.login,args.pwd,args.rem,null,function(id,isnew,type,res){if(res.Status==LStatus.Ok){sender.setLoggedText(res.User.Login);sender.clearPwd();sender.hide();msPanel.loadRoot();setUserMapSet(res.MapSet);}else if(res.Status==LStatus.Unknown)alert('Неверный логин/пароль');else if(res.Status==LStatus.Locked)alert('Ваш вход заблокирован');else if(res.Status==LStatus.Expired)alert('Время действия вашего логина истекло');else if(res.Status==LStatus.Empty)window.location.href=LOGIN_PAGE;return true;})};var urlSelRId=null;mapview.addOnPreCallback(function(id,isNewMapSet,type){if(type=='all'){var sCfg=mapview.getStartConfig();if(firstload&&sCfg&&sCfg.obj)urlSelRId=id;stCh.reset();if(isNewMapSet)resetMesModes(mode,true);mask.show();}else stCh.add();stCh.update();});mapview.addOnCallback(function(id,isNewMapSet,type,extraData){if(type=='all'){mask.hide();if(mapview.getSelObj()==null&&urlSelRId){if(urlSelRId==id)Ext.Msg.show({title:'Информация',buttons:Ext.Msg.OK,icon:Ext.MessageBox.INFO,msg:'Запрашиваемый объект не найден'});urlSelRId=null;}}else{stCh.remove();stCh.update();}var msInfo=mapview.getMapSetInfo();if(isNewMapSet){var cu=mapview.getUser();if(cu.isAnonymous)loginCtrl.setAnonymousText();else loginCtrl.setLoggedText(cu.login);if(!msInfo||!msInfo.Maps){layerPanel.setRootNode(new Ext.tree.TreeNode());var errCfg={title:'Ошибка',buttons:Ext.Msg.OK,icon:Ext.MessageBox.ERROR};if(!msInfo){errCfg.msg='Данный набор карт не существует или недоступен';Ext.Msg.show(errCfg);}else if(!msInfo.Maps){errCfg.msg='Нет доступных для Вас карт';Ext.Msg.show(errCfg);}return;}var ms=mapview.getMapSetView();initScaleSlider(mapview.getScale(),mapview.getMinScale(),mapview.getMaxScale(),function(newScale){mapview.setScale(newScale);mapview.update();});if(msInfo){var btnAddr=Ext.getCmp('btnAddrSc');var btnOrg=Ext.getCmp('btnOrgSc');if(mapview.getAddrParams())btnAddr.setDisabled(false);else btnAddr.setDisabled(true);if(msInfo.IsOrg)btnOrg.setDisabled(false);else btnOrg.setDisabled(true);if(msInfo.IsOrg)selExtParams.addDbParam(ObjDbParams.Org);mapview.setClickSelObjParams(selExtParams);var root=new Ext.tree.AsyncTreeNode({expanded:true,children:htmlEncode(mapSetToJSON(msInfo,ms.Maps),'text')});layerPanel.setRootNode(root);}}else setSliderScale(mapview.getScale());if(isNewMapSet||type=='login'||type=='logout'){var graphs=mapview.getGraphs();var sgEl=Ext.getCmp('searchGroup');sgEl.remove('btnGraph',true);if(graphs){sgEl.add({text:' Маршруты',iconAlign:'left',iconCls:'routes',id:'btnGraph',toggleGroup:'measure',enableToggle:true,allowDepress:true,pressed:false,graphs:graphs,tooltip:'Режим определения маршрутов на карте',listeners:{toggle:{fn:function(sender,pressed){if(pressed)enableRouteMode(sender);else disableRouteMode(sender);}}}});}sgEl.doLayout();}if(type=='all'&&extraData){iterTree(msTree.root,function(node){if(node.isLeaf()){if(msTree.getClearId(node.id)==msInfo.Id)node.getUI().addClass('sel-map');else node.getUI().removeClass('sel-map');}})}if((type=='all'&&isNewMapSet)||type=='seldone'||type=='clickdone'||type=='finddone'){if(!extraData&&type!='all')return;var sObj=mapview.getSelObj();if(!sObj)return;if(!infoWnd){var mpPos=mapPanel.getPosition();infoWnd=new InfoWnd(mpPos[0]+5,mpPos[1]+mapPanel.getInnerHeight()+TOOLBAR_HEIGHT-INFO_WND_HEIGHT-5,INFO_WND_WIDTH,INFO_WND_HEIGHT);infoWnd.beforehide=function(){mapview.unSelectObj();}}infoWnd.show('mapPanel');var spec={cn:[]};if(sObj.Info.Name)spec.cn[spec.cn.length]={tag:'div',html:'Название: <b>'+sObj.Info.Name+'</b>'};var a=getAddrObj(sObj.Info.Semantics,mapview.getAddrParamsForMap(sObj.Info.MapId)).getAddr();if(a)spec.cn[spec.cn.length]={tag:'div',html:a};var t=getTownObj(sObj.Info.Semantics,mapview.getTownParamsForMap(sObj.Info.MapId)).getFullName();if(t)spec.cn[spec.cn.length]={tag:'div',html:t};if(sObj.DbInfo){if(sObj.DbInfo.Org)spec.cn[spec.cn.length]={tag:'div',cn:[{tag:'a',id:'org-in-obj',cls:'btn',href:'javascript:void(0)',html:'Организации ('+sObj.DbInfo.Org+')'}]};}infoWnd.setMarkup(spec);if(sObj.DbInfo&&sObj.DbInfo.Org){Ext.getDom('org-in-obj').onclick=function(){if(!searchWnd)searchWnd=createSearchWnd();searchWnd.orgsInObj(sObj.ListName,sObj.Key);searchWnd.showTab(2);searchWnd.show();};}var isMapOn=mapview.isMapOn(sObj.Info.MapId);var isLayerOn=mapview.isLayerOn(sObj.Info.MapId,sObj.Info.LayerId);if(!isMapOn||!isLayerOn){Ext.Msg.confirm('Подтверждение включения слоя','Слой с выделенным объектом сейчас отключен. Включить его?',function(btn){if(btn=='yes'){if(!isMapOn)layerPanel.getNodeById(sObj.Info.MapId).getUI().toggleCheck(true);if(!isLayerOn)layerPanel.getNodeById(sObj.Info.MapId+ID_SEP+sObj.Info.LayerId).getUI().toggleCheck(true);applyView();}});}}});mapview.addOnError(function(id,status,statusText){mask.hide();stCh.remove();stCh.update();if(status!=null)status=status+"; ";else status="";alert("Ошибка: "+status+statusText);});mapview.addOnAbortAll(function(){stCh.reset();stCh.update();mask.hide();setSliderScale(mapview.getScale());});mapview.addOnMouseMove(function(e){var evt=e?e:event;var pos=mapview.translate(evt.clientX,evt.clientY);var posPlane=mapview.getPlaneByRelPos(pos.left,pos.top);Ext.getCmp('sbCoord').setText('X = '+formatting(posPlane.left,'м')+' Y = '+formatting(posPlane.top,'м'));});var slider=mapview.createChildEl('div','slider');var tblSlider=Ext.getDom('slider-table');tblSlider.style.display='';slider.appendChild(tblSlider);slider.className='sliderDiv';MapView.setPosition(slider,27,63);var moveEl=mapview.createChildEl('div','moveEl');var tblMove=Ext.getDom('move-table');tblMove.style.display='';moveEl.appendChild(tblMove);moveEl.className='sliderDiv';MapView.setPosition(moveEl,10,5);openMapSet(null,0,null);var mapPanel=new Ext.Panel({region:'center',id:'mapPanel',bbar:new Ext.ux.StatusBar({id:'main-statusbar',defaultText:'Готово',defaultType:'tbtext',height:SB_HEIGHT,items:[{id:'sbCoord'},'-',{id:'sbScale'}]}),tbar:[{xtype:'buttongroup',title:'Управление картой',height:TOOLBAR_HEIGHT,defaults:{scale:'small',iconAlign:'top'},items:[{tooltip:'Перемещение карты и выделение объектов',iconCls:'drag',id:'dragBtn',enableToggle:true,allowDepress:false,pressed:true,toggleGroup:'mapcontrols',listeners:{toggle:{fn:function(sender,pressed){if(pressed){resetMapControls();mapview.enableDragMode();mapview.enableSelectMode();}}}}},{tooltip:'Увеличить фрагмент карты. Выделите область для увеличения',iconCls:'zoom-in',xtype:'splitbutton',id:'zoomInBtn',enableToggle:true,allowDepress:false,toggleGroup:'mapcontrols',listeners:{toggle:{fn:function(sender,pressed){if(pressed){resetMapControls();mapview.addOnMouseDown(mouseDownSelectArea);}}}},menu:{xtype:'menu',id:'mScale',width:105,items:[{xtype:'menutextitem',text:'Укажите масштаб:'},{xtype:'textfield',id:'txtScale',width:95,enableKeyEvents:true,listeners:{keyup:{fn:function(s,e){if(e.getKey()==e.ENTER){var sc=parseInt(s.getValue());var min=mapview.getMinScale()?mapview.getMinScale():MIN_SCALE;var max=mapview.getMaxScale()?mapview.getMaxScale():MAX_SCALE;if(isNaN(sc)||sc<max||sc>min){s.markInvalid('Масштаб должен быть числом от '+max+' до '+min);}else{if(sc&&sc>0){if(mapview.getScale()!=sc){mapview.setScale(sc);mapview.update();Ext.getCmp('mScale').hide();s.setValue('');}else alert('Указанный масштаб уже установлен');}}}}}}}]}},{tooltip:'Уменьшить масштаб',iconCls:'zoom-out',id:'zoomOutBtn',enableToggle:true,allowDepress:false,toggleGroup:'mapcontrols',listeners:{toggle:{fn:function(sender,pressed){if(pressed){resetMapControls();mapview.addOnMouseUp(mouseUpZoomOut);}}}}},{tooltip:'Запомнить положение карты',iconCls:'savepos',listeners:{click:{fn:function(sender,e){var pos=mapview.getMapPos();savedPos.pos={left:pos.left,top:pos.top};savedPos.scale=mapview.getScale();}}}},{tooltip:'Перейти к сохраненному положению карты',iconCls:'restorepos',listeners:{click:{fn:function(sender,e){if(!savedPos.pos){alert('Вы еще не сохраняли положение для данной карты');return;}if(savedPos.scale==mapview.getScale()){mapview.moveTo(savedPos.pos.left,savedPos.pos.top);}else{mapview.setScale(savedPos.scale);mapview.setMapPosition(savedPos.pos);mapview.update();}}}}},{tooltip:'Сформировать ссылку на карту',iconCls:'maplink',listeners:{click:{fn:function(sender,e){if(!linkWnd)linkWnd=new LinkWindow('mapPanel',600,280);var root='http://'+location.hostname;var url=root+location.pathname;var maplink=mapview.getMapUrl(url);var link=mapview.getPosUrl(url);var html='<a href="'+link+'" target="_blank"><img style="border:none" src="'+root+APP_ROOT+'content/images/logomap31.gif" alt="map31.ru" title="Показать на карте" /></a>';linkWnd.setLink(maplink,link,html);linkWnd.show();}}}},{text:' Размер карты',iconAlign:'left',iconCls:'listitems',id:'sizeMenu',menu:{items:['<b class="menu-title"> Выберите размер карты</b>',{text:'Максимальный (1700x1200)',checked:true,group:'size',size:{width:1700,height:1200},handler:mapSizeChanged},{text:'1000x800',checked:false,group:'size',size:{width:1000,height:800},handler:mapSizeChanged},{text:'800x600',checked:false,group:'size',size:{width:800,height:600},handler:mapSizeChanged},{text:'600x400',checked:false,group:'size',size:{width:600,height:400},handler:mapSizeChanged},{text:'400x300',checked:false,group:'size',size:{width:400,height:300},handler:mapSizeChanged}]}}]},{xtype:'buttongroup',title:'Измерения',height:TOOLBAR_HEIGHT,defaults:{scale:'small',iconAlign:'left'},items:[{id:'btnDistance',text:'Расстояние',tooltip:'Режим измерений расстояний на карте',iconCls:'dist',enableToggle:true,allowDepress:true,pressed:false,toggleGroup:'measure',listeners:{toggle:{fn:function(sender,pressed){if(pressed)enableRulerMode(sender);else disableRulerMode(sender);}}}},{id:'btnSquare',text:'Площадь',tooltip:'Режим измерений площадей на карте',iconCls:'sq',enableToggle:true,allowDepress:true,pressed:false,toggleGroup:'measure',listeners:{toggle:{fn:function(sender,pressed){if(pressed)enableSqMode(sender);else disableSqMode(sender);}}}}]},{xtype:'buttongroup',id:'searchGroup',title:'Поиск',height:TOOLBAR_HEIGHT,defaults:{scale:'small',iconAlign:'left'},items:[{text:'Населенный пункт',id:'btnTownSc',iconCls:'town-search',listeners:{click:{fn:searchHandler}}},{text:'Адресный поиск',id:'btnAddrSc',iconCls:'addr-search',listeners:{click:{fn:searchHandler}}},{text:'Организации',id:'btnOrgSc',iconCls:'org-search',listeners:{click:{fn:searchHandler}}}]},'->',{id:'btnLogin',text:' ',iconCls:'login',tooltip:' '}],contentEl:'map',listeners:{resize:{fn:function(sender,adjWidth,adjHeight,rawWidth,rawHeight){var szMenu=Ext.getCmp('sizeMenu');var size=szMenu.menu.items.find(function(item){if(item&&item.checked)return true;}).initialConfig.size;var panelWidth=adjWidth;var panelHeight=adjHeight;var tt=sender.getTopToolbar();var bt=sender.getBottomToolbar();if(tt)panelHeight-=(TOOLBAR_HEIGHT+5);if(bt)panelHeight-=SB_HEIGHT;var w=size.width<panelWidth?size.width:panelWidth;var h=size.height<panelHeight?size.height:panelHeight;mapview.setViewPortPosition((panelWidth-w)/2,(panelHeight-h)/2);mapview.setSize(w,h);if(firstload){var qp=getQueryParams();if(qp&&qp[MapView.MS_PART]){var v=qp[MapView.V_PART];var ms=new MapSet(qp[MapView.MS_PART]);var sc=qp[MapView.SC_PART];if(isNaN(sc))sc=0;openMapSet(ms,sc,null);var ls=getUrlStr(qp[MapView.LS_PART],v);var k=qp[MapView.KEY_PART];var x=parseFloat(qp[MapView.X_PART]);var y=parseFloat(qp[MapView.Y_PART]);var st=getUrlStr(qp[MapView.ST_PART],v);var hn=getUrlStr(qp[MapView.H_PART],v);var geonim=getUrlStr(qp[MapView.G_PART],v);var cfg=null;if((ls&&k)||(st&&hn)){selExtParams.addDbParam(ObjDbParams.Org);cfg={obj:{selP:selExtParams}};if(ls&&k){k=parseInt(k);if(isNaN(k))k=0;cfg.obj.selObj={listName:ls,key:k};}else cfg.obj.address={street:st,house:hn,geonim:geonim};}else if(!isNaN(x)&&!isNaN(y))cfg={center:{x:x,y:y}};mapview.setStartConfig(cfg);}mapview.update();msPanel.loadRoot();firstload=false;}}}}});function getUrlStr(str,v){if(str&&(!v||v=='1.0'))return str.replace(/\+/g,' ');return str;}function applyView(){var msg='',selNodes=layerPanel.getChecked();var map;var idx;var ms=new MapSet();ms.Maps=new Array();Ext.each(selNodes,function(node){if(node.id.indexOf("_")==-1){map=new Map(node.id);map.Layers=new Array();ms.Maps.push(map);}else{var mapId=node.id.substring(0,node.id.indexOf("_"));var layerId=node.id.substring(node.id.indexOf("_")+1,node.id.length);if(ms.Maps){idx=findItemIdx(ms.Maps,mapId);if(idx!=-1){map=ms.Maps[idx];map.Layers.push(new Layer(layerId));}}}});mapview.setMapSetView(ms);mapview.update();}var msPanel=getMapSetTree();msPanel.addListener('click',function(node,e){var id=node.id;if(node.isLeaf())id=id.substring(0,node.id.indexOf(ID_SEP));var msv=mapview.getMapSetView();if(!node.isLeaf()||(msv&&msv.Id==id))return;var mapSet=new MapSet(id);var scale;var pos;openMapSet(mapSet,0,null);mapview.update();});var layerPanel=new Ext.tree.TreePanel({renderTo:'layer-div',useArrows:true,autoScroll:true,animate:false,enableDD:false,containerScroll:true,border:false,loader:new Ext.tree.TreeLoader(),rootVisible:false,root:new Ext.tree.AsyncTreeNode(),tbar:new Ext.Toolbar({items:[{text:'Применить',tooltip:'Применить состав карты',iconCls:'apply',handler:applyView},'->',{iconCls:'ch-all',tooltip:'Выделить все',handler:function(){iterTree(layerPanel.root,function(node){node.getUI().toggleCheck(true);})}},{iconCls:'unch-all',tooltip:'Сбросить все',handler:function(){iterTree(layerPanel.root,function(node){node.getUI().toggleCheck(false);})}}]})});var extVP=new Ext.Viewport({layout:'border',hideBorders:true,monitorResize:true,items:[{region:'east',id:'east-panel',split:true,title:'Меню',animFloat:false,resizable:true,floatable:false,width:250,minSize:1,maxSize:400,collapsible:true,margins:'0 0 0 0',layout:{type:'accordion',animate:true},items:[{contentEl:'mapset-div',title:'<b>Выбор карты</b>',border:false,layout:'fit',iconCls:'nav',autoScroll:true},{title:'<b>Состав карты</b>',contentEl:'layer-div',border:false,layout:'fit',iconCls:'settings',autoScroll:true}]},mapPanel]});Ext.QuickTips.init();var mm;var rm;var hf;function measureCb(id,isNewMapSet,type,extraData){if(!isNewMapSet&&(type=='all'||(type=='finddone'&&extraData)||(type=='seldone'&&extraData))){if(mm)mm.Update();if(rm)rm.Update();}}function vpChanged(s,args){var szHf=hf.getSize();var vpPos=mapview.getViewPortPosition();var szMap=mapview.getSize();hf.setPosition(vpPos.left+szMap.width-szHf.width-5,vpPos.top+5);}function getCanvas(){return document.getElementById("canvas");}function enterMeasureMode(){resetMapControls();Ext.getCmp('dragBtn').toggle(true);Ext.getCmp('zoomInBtn').disable();Ext.getCmp('zoomOutBtn').disable();mapview.disableDragMode();mapview.disableSelectMode();var canvas=getCanvas();canvas.parentNode.removeChild(canvas);mapview.getViewPortEl().appendChild(canvas);mapview.addOnCallback(measureCb);mapview.addOnViewPortChanged(vpChanged);return canvas;}var mode=0;function resetMesModes(testMode,destroy){if(testMode==mode&&mode>0){if(mm){mm.Dispose();mm=null;}if(hf){hf.Dispose();hf=null;}if(rm){rm.Dispose();rm=null;}if(routeWnd){if(destroy){routeWnd.destroy();routeWnd=null;}else routeWnd.hide();}mapview.removeOnCallback(measureCb);mapview.removeOnViewPortChanged(vpChanged);var canvas=getCanvas();canvas.parentNode.removeChild(canvas);document.body.appendChild(canvas);resetMapControls();mapview.enableDragMode();mapview.enableSelectMode();Ext.getCmp('zoomInBtn').enable();Ext.getCmp('zoomOutBtn').enable();mode=0;}}function enableRulerMode(sender){resetMesModes(mode);var c=enterMeasureMode();mode=1;hf=new HelpFrame({element:'hlpFrame'});hf.setTitle('Измерение расстояний');hf.setContent('Двойной клик мышки добавляет на карту новый отрезок расстояния. Удаление отрезка тоже производится двойным кликом мышки по уже существующей точке отрезка. Модифицировать линию измерения можно с помощью перетаскивания точек отрезков. Двойной клик мышки в середине отрезка разбивает его на два новых отрезка, что позволяет изменять линию измерения по своему желанию.');hf.setData('0 м.');hf.onCancel=function(){Ext.getCmp('btnDistance').toggle(false);};hf.onReset=function(){mm.Reset();hf.setData('0 м.');};vpChanged();mm=new MeasureManager(mapview,{canvas:c,color:'#f00',fill:'#fff',diam:6,width:4,mode:0});mm.OnChanged=function(d){d=d.d;hf.setData(distanceRound(d));};}function disableRulerMode(sender){resetMesModes(1);}function enableSqMode(sender){resetMesModes(mode);var c=enterMeasureMode();mode=2;hf=new HelpFrame({element:'hlpFrame'});hf.setTitle('Измерение площадей');hf.setContent('Двойной клик мышки добавляет на карту новый отрезок многоугольника. Удаление отрезка тоже производится двойным кликом мышки по уже существующей точке отрезка. Модифицировать многоугольник можно с помощью перетаскивания точек отрезков. Двойной клик мышки в середине отрезка разбивает его на два новых отрезка, что позволяет изменять линию измерения по своему желанию.');hf.setData('Периметр: 0 км (0 м)<br />Площадь: 0 км<sup>2</sup> (0 м<sup>2</sup>)');hf.onCancel=function(){Ext.getCmp('btnSquare').toggle(false);};hf.onReset=function(){mm.Reset();hf.setData('Периметр: 0 км (0 м)<br />Площадь: 0 км<sup>2</sup> (0 м<sup>2</sup>)');};vpChanged();mm=new MeasureManager(mapview,{canvas:c,color:'#f00',fill:'#fff',diam:6,width:4,mode:1});mm.OnChanged=function(s){var p=Math.round(s.d*1000)/1000;var s=Math.round(s.s*1000)/1000;var str="Периметр: "+Math.round(p)/1000+" км ("+p+" м)<br />";str+="Площадь: "+Math.round(s/1000)/1000+" км<sup>2</sup> ("+s+" м<sup>2</sup>)";hf.setData(str);};}function disableSqMode(sender){resetMesModes(2);}var activeTabIdx=0;function enableRouteMode(sender){function clearTab(idx){Ext.getDom('rt-data'+idx).innerHTML='Для определения маршрута выберите двойным кликом мыши начальную и конечную точки.';Ext.getDom('rt-info'+idx).innerHTML='';}function createRM(idx){rm=new RouteManager(mapview,{graph:sender.initialConfig.graphs[0],canvas:c,color:'#00f',fill:'#fff',diam:6,width:4});rm.onComplete=function(r){clearTab(idx);if(r.Steps){var data=[];var total=0;var l=0;var str;var currStr;for(i=0;i<r.Steps.length;i++){var d=r.Steps[i].Length;if(i==0){str=r.Steps[i].EInfo?r.Steps[i].EInfo[0]:'';l=d;}else if(str!=(r.Steps[i].EInfo?r.Steps[i].EInfo[0]:'')){data[data.length]={street:str,length:distanceRound(l)};str=r.Steps[i].EInfo?r.Steps[i].EInfo[0]:'';l=d;}else l+=d;if(i==r.Steps.length-1){data[data.length]={street:str,length:distanceRound(l)};}total+=d;}var pageCfg={pageSize:10,pageGroup:10,pageCls:'g-page',selPageCls:'g-selpage',remoting:{enabled:false,count:data.length}};var agCfg={data:data,template:[{markup:'<div><%= street %></div>',align:'left',cls:'g-cell'},{markup:'<div><%= length %></div>',align:'right',cls:'g-cell'}],width:sz[0]-25,height:sz[1]-120,pageCfg:pageCfg,rowCls:'g-row',altRowCls:'g-altrow',overCls:'g-overcls',selCls:'g-selcls'};var agRoute=new Grid(agCfg);agRoute.renderTo('rt-data'+idx);Ext.getDom('rt-info'+idx).innerHTML='Общая длина маршрута: '+distanceRound(total);}}}resetMesModes(mode);var c=enterMeasureMode();mode=3;var sz=[250,300];if(!routeWnd){routeWnd=new RouteWindow('mapPanel',sz[0],sz[1],function(tabIdx){MapView.addHandler(Ext.getDom('reset-btn'+tabIdx),'click',function(){clearTab(tabIdx);rm.Reset();});clearTab(tabIdx);});for(i=0;i<sender.initialConfig.graphs.length;i++)routeWnd.addTab({tabName:sender.initialConfig.graphs[i].name,spec:{tag:'div',cn:[{tag:'div',id:'rt-data'+i},{tag:'div',id:'rt-info'+i,style:'padding:5px;font-style:italic'},{tag:'table',style:'width:100%',cn:[{tag:'tr',cn:[{tag:'td',align:'center',cn:[{tag:'a',id:'reset-btn'+i,cls:'btn',href:'javascript:void(0);',html:'Сброс',style:'padding:5px;'}]}]}]}]}});}routeWnd.onCancel=function(){for(i=0;i<sender.initialConfig.graphs.length;i++)clearTab(i);Ext.getCmp('btnGraph').toggle(false);};routeWnd.tabChanged=function(idx){if(activeTabIdx!=idx){if(rm)rm.Dispose();activeTabIdx=idx;createRM(idx);clearTab(idx);}};routeWnd.onDestroy=function(){activeTabIdx=0;};createRM(activeTabIdx);routeWnd.show();}function disableRouteMode(sender){resetMesModes(3);}function searchHandler(sender,e){var tabN;var id=sender.getId();if(id=='btnTownSc')tabN=0;else if(id=='btnAddrSc')tabN=1;else if(id=='btnOrgSc')tabN=2;if(!searchWnd){searchWnd=createSearchWnd(tabN);searchWnd.show('mapPanel');}else searchWnd.showTab(tabN);}function createSearchWnd(tabN){var mpPos=mapPanel.getPosition();return new SearchWnd(mpPos[0]+(mapPanel.getInnerWidth()-S_WND_WIDTH)/2,mpPos[1]+TOOLBAR_HEIGHT+10,S_WND_WIDTH,S_WND_HEIGHT,tabN);}function setUserMapSet(resMapSet){var redraw=false;var inf=mapview.getMapSetInfo();var view=mapview.getMapSetView();var msNew=null;if(resMapSet){msNew=new MapSet(resMapSet.Id);if(resMapSet.Id!=inf.Id){redraw=true;}else{if(inf.Maps.length!=resMapSet.Maps.length)redraw=true;for(var i=0;i<inf.Maps.length;i++){var m=inf.Maps[i];var nm=findItem(resMapSet.Maps,m.Id);if(!nm){redraw=true;}else{var mapOn=false;if(view.Maps&&findItem(view.Maps,m.Id))mapOn=true;else if(m.On)mapOn=true;if(mapOn){if(!msNew.Maps)msNew.Maps=new Array();msNew.Maps.insert(new Map(m.Id));if(m.Layers.length!=nm.Layers.length)redraw=true;for(var j=0;j<m.Layers.length;j++){var l=m.Layers[j];var nl=findItem(nm.Layers,l.Id);if(!nl){redraw=true;}else{var layerOn=false;if(view.Maps&&view.Maps[i]&&view.Maps[i].Layers&&findItem(view.Maps[i].Layers,l.Id))layerOn=true;else if(l.On)layerOn=true;}}}}}}}else redraw=true;if(redraw){mapview.setMapSetView(msNew,true);if(msNew&&msNew.Id!=mapview.getMapSetInfo().Id)openMapSet(null,0,null);else openMapSet(msNew,0,null);mapview.update();}if(searchWnd){searchWnd.destroy();searchWnd=null;}return redraw;}}function openMapSet(mapSet,scale,pos){if(searchWnd){searchWnd.destroy();searchWnd=null;}if(infoWnd){infoWnd.destroy();infoWnd=null;}if(linkWnd){linkWnd.hide();}savedPos=new Object();mapview.setMapSetView(mapSet);mapview.setScale(scale);mapview.setMapPosition(pos);}function abort(){mapview.abort();}function iterTree(node,callback){if(node.hasChildNodes){for(var i=0;i<node.childNodes.length;i++){callback(node.childNodes[i]);iterTree(node.childNodes[i],callback);}}}function StatusChecker(){var requestsCount=0;this.reset=function(){requestsCount=0;};this.add=function(){requestsCount++;};this.remove=function(){if(requestsCount>0)requestsCount--;};this.update=function(){var cmp=Ext.getCmp('main-statusbar');if(requestsCount<=0)cmp.clearStatus({useDefaults:true});else cmp.showBusy('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Обработка запроса');};}function findItem(ar,id){if(!ar)return null;for(var i=0;i<ar.length;i++){if(ar[i].Id==id)return ar[i];}return null;}function findItemIdx(ar,id){for(var i=0;i<ar.length;i++){if(ar[i].Id==id)return i;}return-1;}function mapSetToJSON(msInfo,msView){var maps=new Array();var layers;var isChecked;var mapIdx=-1;for(var i=0;i<msInfo.Maps.length;i++){layers=new Array();isChecked=msInfo.Maps[i].On;if(msView){mapIdx=findItemIdx(msView,msInfo.Maps[i].Id);isChecked=(mapIdx==-1)?false:true;}maps.push({id:msInfo.Maps[i].Id,text:msInfo.Maps[i].Name,children:layers,checked:isChecked,expanded:true});if(!msInfo.Maps[i].Layers)continue;for(var j=0;j<msInfo.Maps[i].Layers.length;j++){isChecked=msInfo.Maps[i].Layers[j].On;if(mapIdx!=-1&&msView[mapIdx].Layers)isChecked=findItemIdx(msView[mapIdx].Layers,msInfo.Maps[i].Layers[j].Id)==-1?false:true;layers.push({id:msInfo.Maps[i].Id+ID_SEP+msInfo.Maps[i].Layers[j].Id,text:msInfo.Maps[i].Layers[j].Name,leaf:true,checked:isChecked});}}return maps;}MyTree=Ext.extend(Ext.tree.TreePanel,{constructor:function(basecfg,cfg){if(cfg)this._cfg=cfg;MyTree.superclass.constructor.call(this,basecfg);},_cfg:{uniqLeafs:true,sep:'_'},onload:null,onrequest:null,onpreload:null,onfailed:null,loaded:function(self,id,isnew,type,res){var parentNode;if(res.ParentId){parentNode=self.getNodeById(res.ParentId);parentNode.removeChild(parentNode.firstChild);parentNode.expand();}else{parentNode=self.getRootNode();self._ready=true;}parentNode.getUI().removeClass("x-tree-node-loading");for(var i=0;i<res.Items.length;i++){var node=new Ext.tree.TreeNode();node.id=res.Items[i].Id;node.text=res.Items[i].Name;if(!res.Items[i].IsLeaf){node.addListener('beforeexpand',function(node,deep,anim){if(!node.attributes.loaded){node.getUI().addClass("x-tree-node-loading");node.attributes.loaded=true;self.onrequest(node.id,self.onpreload,self.onload,self._failed,self._failed,self._failed);return false;}return true;});node.appendChild(new Ext.tree.TreeNode());}else{node.leaf=true;if(!self._cfg.uniqLeafs)node.id+=self._cfg.sep+self._counter;}parentNode.appendChild(node);}if(!self._cfg.uniqLeafs)self._counter++;},_ready:true,loadRoot:function(){if(!this._ready)return;var r=this.getRootNode();var ch;while(ch=r.firstChild)r.removeChild(ch);this._counter=0;this.onrequest(null,this.onpreload,this.onload,this._failed,this._failed,this._failed);this._ready=false;},_failed:function(){if(!this._ready)this._ready=true;if(this.onfailed)return onfailed();else return false;},_counter:0,getClearId:function(id){if(this._cfg.uniqLeafs)return id;return id.substring(0,id.indexOf(this._cfg.sep));}});var msTree;function getMapSetTree(){if(!msTree){msTree=new MyTree({renderTo:'mapset-div',useArrows:true,autoScroll:true,animate:false,enableDD:false,containerScroll:true,border:false,loader:new Ext.tree.TreeLoader(),rootVisible:false,root:{nodeType:'async',text:'root',draggable:false,id:'top'}},{uniqLeafs:false,sep:ID_SEP});msTree.onrequest=mapview.getMapSetItems;msTree.onpreload=function(){return false;};msTree.onload=function(id,isnew,type,res){msTree.loaded(msTree,id,isnew,type,res);return false;};}return msTree;}function resetMapControls(){mapview.removeOnMouseDown(mouseDownSelectArea);mapview.removeOnMouseUp(mouseUpZoomOut);mapview.disableDragMode();mapview.disableSelectMode();}function mapSizeChanged(sender,args){var size=sender.initialConfig.size;var mapPanel=Ext.getCmp('mapPanel');var panelWidth=mapPanel.getInnerWidth();var panelHeight=mapPanel.getHeight()-mapPanel.getTopToolbar().initialConfig.items[0].height;var w=size.width<panelWidth?size.width:panelWidth;var h=size.height<panelHeight?size.height:panelHeight;mapview.setSize(w,h);mapview.setViewPortPosition((panelWidth-w)/2,(panelHeight-h)/2);}var evX0;var evY0;var sa;function mouseDownSelectArea(e){var evt=e?e:event;if(!sa)sa=mapview.createChildEl('div','select-area');sa.className='selectArea';var pos=mapview.translate(evt.clientX,evt.clientY);evX0=pos.left;evY0=pos.top;MapView.setSize(sa,0,0);MapView.setPosition(sa,pos.left,pos.top);sa.style.visibility='visible';MapView.addHandler(document,'mousemove',mouseMoveSelectArea);MapView.addHandler(document,'mouseup',mouseUpSelectArea);}function mouseMoveSelectArea(e){var evt=e?e:event;var pos=mapview.translate(evt.clientX,evt.clientY);var delta_x=pos.left-evX0;var delta_y=pos.top-evY0;if(delta_x>=0){MapView.setPosition(sa,evX0,null);MapView.setSize(sa,delta_x,null);}else{delta_x=Math.abs(delta_x);MapView.setPosition(sa,pos.left,null);MapView.setSize(sa,delta_x,null);}if(delta_y>=0){MapView.setPosition(sa,null,evY0);MapView.setSize(sa,null,delta_y);}else{delta_y=Math.abs(delta_y);MapView.setPosition(sa,null,pos.top);MapView.setSize(sa,null,delta_y);}return false;}function mouseUpSelectArea(e){MapView.removeHandler(document,'mousemove',mouseMoveSelectArea);MapView.removeHandler(document,'mouseup',mouseUpSelectArea);var size=MapView.objSize(sa);var pos=MapView.uiFindChildRelPos(sa);var mapSize=mapview.getSize();var mapPos=mapview.getMapPos();mapview.removeChildEl('select-area');sa=null;var ratioX=mapSize.width/size.width;var ratioY=mapSize.height/size.height;var ratio;var w;var h;if(ratioX>ratioY){ratio=ratioX;w=size.width;h=mapSize.height/ratio;}else{ratio=ratioY;w=mapSize.width/ratio;h=size.height;}var x=mapPos.left+pos.left+(pos.left/mapSize.width)*w;var y=mapPos.top+pos.top+(pos.top/mapSize.height)*h;if(mapview.changeScale(ratio,x,y))mapview.update();else alert('Достигнут предел масштабирования');}function mouseUpZoomOut(e){var evt=e?e:event;var pos=mapview.translate(evt.clientX,evt.clientY);var mapPos=mapview.getMapPos();if(mapview.changeScale(0.5,mapPos.left+pos.left,mapPos.top+pos.top))mapview.update();else alert('Достигнут предел масштабирования');}function resetView(){mapview.resetView();mapview.update();}function shiftMap(dir){var size=mapview.getSize();switch(dir){case'topleft':mapview.shiftOn(size.width/2,size.height/2);break;case'top':mapview.shiftOn(0,size.height/2);break;case'topright':mapview.shiftOn(-size.width/2,size.height/2);break;case'left':mapview.shiftOn(size.width/2,0);break;case'right':mapview.shiftOn(-size.width/2,0);break;case'downleft':mapview.shiftOn(size.width/2,-size.height/2);break;case'down':mapview.shiftOn(0,-size.height/2);break;case'downright':mapview.shiftOn(-size.width/2,-size.height/2);break;}}var power;var min;var max;var callback;function initScaleSlider(curr,_max,_min,_cb){callback=_cb;max=_max;min=_min;if(!min)min=MAX_SCALE;if(!max)max=MIN_SCALE;var dist=getBottomLimit()-getTopLimit();power=Math.log(max-min)/Math.log(dist);setSliderScale(curr);}function setSliderScale(curr){Ext.getCmp('sbScale').setText('1:'+Math.round(curr));if(curr-min>0)setSliderPos(Math.pow(curr-min,1/power));else setSliderPos(getTopLimit());}var slider;var dH;var h0;var isSliderClick;function sliderMouseDown(sender,e){var evt=e?e:event;isSliderClick=true;slider=sender;h0=MapView.uiFindChildRelPos(slider).top;dH=MapView.uiGetEventXY(slider.parentNode,evt.clientX,evt.clientY).top-h0;MapView.addHandler(document,'mousemove',sliderMouseMove);MapView.addHandler(document,'mouseup',sliderMouseUp);return false;}function sliderMouseMove(e){var evt=e?e:event;var currH=MapView.uiGetEventXY(slider.parentNode,evt.clientX,evt.clientY).top-dH;setSliderPos(currH);return false;}function sliderMouseUp(e){isSliderClick=false;MapView.removeHandler(document,'mousemove',sliderMouseMove);MapView.removeHandler(document,'mouseup',sliderMouseUp);var slider=Ext.getDom('scaleSlider');var h=MapView.uiFindChildRelPos(slider).top;if(h!=h0)doCallback(h);return false;}function scaleClick(sender,e){if(isSliderClick)return;var evt=e?e:event;var hPos=MapView.uiGetEventXY(sender,evt.clientX,evt.clientY).top;setSliderPos(hPos);doCallback(hPos);}function stepScaling(sender,dir){var slider=Ext.getDom('scaleSlider');var h=MapView.uiFindChildRelPos(slider).top;var step=Math.round((getBottomLimit()-getTopLimit())/10);var hPos;if(dir=='up')hPos=h-step;else hPos=h+step;setSliderPos(hPos);h=MapView.uiFindChildRelPos(slider).top;if(Math.abs(hPos-h)!=step)doCallback(h);}var topLimit=0;var bottomLimit;function setSliderPos(h){var slider=Ext.getDom('scaleSlider');if(h<getTopLimit())MapView.setPosition(slider,null,getTopLimit());else if(h>getBottomLimit())MapView.setPosition(slider,null,getBottomLimit());else MapView.setPosition(slider,null,h);}function doCallback(h){if(callback)callback(Math.pow(h,power)+min);}function getBottomLimit(){var slider=Ext.getDom('scaleSlider');if(!bottomLimit)bottomLimit=MapView.objSize(slider.parentNode).height-MapView.objSize(slider).height;return bottomLimit;}function getTopLimit(){return topLimit;}function getAddrObj(sem,addrP){var retVal=new Sv.Address();if(sem&&addrP){for(var i=0;i<sem.length;i++){if(sem[i].Code==addrP.Geonim)retVal.Geonim=sem[i].FullValue.trim();else if(sem[i].Code==addrP.Street)retVal.Street=sem[i].FullValue.trim();else if(sem[i].Code==addrP.HouseN)retVal.HouseN=sem[i].FullValue.trim();else if(sem[i].Code==addrP.HouseC)retVal.HouseC=sem[i].FullValue.trim();else if(sem[i].Code==addrP.HouseF)retVal.HouseF=sem[i].FullValue.trim();}}return retVal;}function getTownObj(sem,townP){var retVal=new Sv.Town();if(sem&&townP){for(var i=0;i<sem.length;i++){if(sem[i].Code==townP.Town)retVal.Name=sem[i].FullValue.trim();else if(sem[i].Code==townP.Region)retVal.Region=sem[i].FullValue.trim();else if(sem[i].Code==townP.Geonim)retVal.Geonim=sem[i].FullValue.trim();}}return retVal;}function formatting(number_val,unit){var res='';var number=new String(number_val);var Unit=new String(unit);var i=0;var len=0;var index=-1;var fpoint;while(number.charAt(i)!=""){if(number.charAt(i)=='.')index=i;len++;i++;}if(len==0)return res;fpoint=index;if(index==-1)index=len;var remainder=parseInt(index%3);var count=parseInt(index/3);var start=remainder;res=number.substring(0,remainder);for(k=0;k<count;k++){res+=' '+number.substr(start,3);start+=3;}if(fpoint>=0)res+=number.substr(fpoint,3);return res+' '+Unit;}function ObjPtr(url,sz,zIdx,get_hp){var size=sz;var hp;var vis=false;var d=mapview.createChildEl("div");d.style.position='absolute';d.style.zIndex=zIdx;d.style.cursor='pointer';d.onclick=function(){hideInt();vis=false;};hideInt();var img=new Image();img.onload=function(){img.onload=null;if(!size)size={width:img.width,height:img.height};MapView.setSize(d,size.width,size.height);var i=document.createElement('img');i.src=img.src;i.setAttribute('title','Кликните на изображении, чтобы скрыть');i.setAttribute('width',size.width.toString());i.setAttribute('height',size.height.toString());d.appendChild(i);};img.src=url;mapview.addOnPreCallback(onPreCb);mapview.addOnCallback(onCb);mapview.addOnMapShift(onShift);this.show=function(x,y){showInt(x,y);vis=true;};this.hide=function(){hideInt();vis=false;};function showInt(x,y){if(!hp)hp=get_hp(size);MapView.setPosition(d,x-hp.x,y-hp.y);d.style.display='';}function hideInt(){d.style.display='none';}function onPreCb(id,isNewMapSet,type){if(isNewMapSet){hideInt();vis=false;}}function onCb(id,isNewMapSet,type,extraData){if(type=='all'&&vis){var so=mapview.getSelObj();if(so&&so.Center){var rp=mapview.getRelPosByPlane(so.Center.X,so.Center.Y);showInt(rp.left,rp.top);}}else if(type=='seldone'||type=='finddone'||(type=='all'&&isNewMapSet)){if(!extraData&&type!='all')return;var so=mapview.getSelObj();if(so&&so.Center){var rp=mapview.getRelPosByPlane(so.Center.X,so.Center.Y);showInt(rp.left,rp.top);vis=true;}}else if(type=='unsel'||(type=='clickdone'&&extraData)){hideInt();vis=false;}}function onShift(dx,dy){if(vis){var p=MapView.uiFindChildRelPos(d);MapView.setPosition(d,p.left+dx,p.top+dy);}}}function getQueryParams(){var p=null;var query=location.search.length==0?null:location.search.substring(1);if(query)p=Ext.urlDecode(query);return p;}function getAddrSC(str,house,geonim,strict,addrP){if(!strict)str='*'+str+'*';var number;var idx='';var frac='';if(house.length>0){number=parseInt(house);var pos=house.indexOf('/');if(pos>-1){frac=house.substring(pos+1);idx=house.substring(number.toString().length,pos);}else idx=house.substring(number.toString().length);}var mscAr=new Array();for(var i=0;i<addrP.length;i++){var cAr=new Array();cAr.insert(new SemCond(addrP[i].params.Street,Operations.Equal,str));if(number){cAr.insert(new SemCond(addrP[i].params.HouseN,Operations.Equal,number.toString()));if(idx)cAr.insert(new SemCond(addrP[i].params.HouseC,Operations.Equal,idx));else cAr.insert(new SemCond(addrP[i].params.HouseC,Operations.Pass,''));if(frac)cAr.insert(new SemCond(addrP[i].params.HouseF,Operations.Equal,frac));else cAr.insert(new SemCond(addrP[i].params.HouseF,Operations.Pass,''));}if(geonim){cAr.insert(new SemCond(addrP[i].params.Geonim,Operations.Equal,geonim));}var msc=new MapSearchContext();msc.MapId=addrP[i].mapId;msc.Conds=new SemConds(cAr,CTypes.And);mscAr.insert(msc);}return new SearchContext(mscAr,false);}function distanceRound(d){if(d<1000)return Math.round(d)+' м.';else if(d<10000)return Math.round(d/10)/100+' км.';else if(d<100000)return Math.round(d/100)/10+' км.';return Math.round(d/1000)+' км.';}function HelpFrame(cfg){var self=this;var el=cfg.element;if(typeof(cfg.element)=='string')el=document.getElementById(cfg.element);el.style.display='';var titleEl=MapView.getElementsByClass('title2',el)[0];var contentEl=MapView.getElementsByClass('content',el)[0];var dataEl=MapView.getElementsByClass('data',el)[0];var btnReset=MapView.getElementsByClass('reset',el)[0];var btnCancel=MapView.getElementsByClass('cancel',el)[0];var imgHelp=document.getElementById('imgHelp');MapView.addHandler(btnReset,"click",resetClick);MapView.addHandler(btnCancel,"click",cancelClick);MapView.addHandler(imgHelp,"click",toggle);function resetClick(){if(self.onReset)self.onReset(self);}function cancelClick(){if(self.onCancel)self.onCancel(self);}function toggle(){var trCnt=contentEl.parentNode;var trLn=trCnt;while((trLn=trLn.nextSibling).nodeType!=1);if(trCnt.style.display=='none'){trCnt.style.display='';trLn.style.display='';}else{trCnt.style.display='none';trLn.style.display='none';}}this.setTitle=function(txt){titleEl.innerHTML=txt;};this.setContent=function(txt){contentEl.innerHTML=txt;};this.setData=function(txt){dataEl.innerHTML=txt;};this.setPosition=function(left,top){MapView.setPosition(el,left,top);};this.getSize=function(){return MapView.objSize(el);};this.onReset;this.onCancel;this.Dispose=function(){MapView.removeHandler(btnReset,"click",resetClick);MapView.removeHandler(btnCancel,"click",cancelClick);MapView.removeHandler(imgHelp,"click",toggle);this.onReset=null;this.onCancel=null;el.style.display='none';}}function htmlEncode(s,prop){for(var i=0;i<s.length;i++){if(s[i].children&&s[i].children.length>0)htmlEncode(s[i].children,prop);s[i][prop]=Utils.htmlEncode(s[i][prop]);}return s;}
