/*
 * Copyright (C) 2007-2008  Camptocamp
 *
 * This file is part of MapFish Client
 *
 * MapFish Client is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * MapFish Client is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with MapFish Client.  If not, see <http://www.gnu.org/licenses/>.
 */

/*

  Contains portion of OpenLayers.js:

  OpenLayers.js -- OpenLayers Map Viewer Library

  Copyright 2005-2007 MetaCarta, Inc., released under the Clear BSD license.
  Please see http://svn.openlayers.org/trunk/openlayers/license.txt
  for the full text of the license.

  Includes compressed code under the following licenses:

  (For uncompressed versions of the code used please see the
  OpenLayers SVN repository: <http://openlayers.org/>)

*/
(function(){window.mapfish={singleFile:true};var foolOpenLayers=true;var scripts=document.getElementsByTagName('script');for(var i=0;i<scripts.length;i++){var src=scripts[i].getAttribute('src');if(src&&src.lastIndexOf("OpenLayers.js")>-1){foolOpenLayers=false;break;}}
if(foolOpenLayers){window.OpenLayers._getScriptLocation=function(){return mapfish._getScriptLocation()+"../openlayers/";};}})();(function(){var singleFile=(typeof window.mapfish=="object"&&window.mapfish.singleFile);window.mapfish={_scriptName:"MapFish.js",_getScriptLocation:function(){if(window.gMfLocation){return window.gMfLocation;}
var scriptLocation="";var scriptName=mapfish._scriptName;var scripts=document.getElementsByTagName('script');for(var i=0;i<scripts.length;i++){var src=scripts[i].getAttribute('src');if(src){var index=src.lastIndexOf(scriptName);if((index>-1)&&(index+scriptName.length==src.length)){scriptLocation=src.slice(0,-scriptName.length);break;}}}
return scriptLocation;}};if(!singleFile){var jsfiles=new Array("lang/en.js","core/Color.js","core/GeoStat.js","core/GeoStat/Choropleth.js","core/GeoStat/ProportionalSymbol.js","core/Routing.js","core/Util.js","core/Searcher.js","core/Searcher/Map.js","core/Searcher/Form.js","core/PrintProtocol.js","core/Offline.js","core/Protocol.js","core/Protocol/MapFish.js","core/Protocol/MergeFilterDecorator.js","core/Protocol/TriggerEventDecorator.js","core/Strategy.js","core/Strategy/ProtocolListener.js","widgets/MapComponent.js","widgets/Shortcuts.js","widgets/ComboBoxFactory.js","widgets/recenter/Base.js","widgets/recenter/Coords.js","widgets/data/FeatureReader.js","widgets/data/FeatureStore.js","widgets/data/FeatureStoreMediator.js","widgets/data/SearchStoreMediator.js","widgets/data/LayerStoreMediator.js","widgets/data/GridRowFeatureMediator.js","widgets/geostat/Choropleth.js","widgets/geostat/ProportionalSymbol.js","widgets/tree/LayerTree.js","widgets/tree/LayerTreeExtra.js","widgets/toolbar/Toolbar.js","widgets/toolbar/CheckItem.js","widgets/toolbar/MenuItem.js","widgets/editing/FeatureList.js","widgets/print/Base.js","widgets/print/BaseWidget.js","widgets/print/SimpleForm.js","widgets/print/MultiPage.js","widgets/print/PrintAction.js");var allScriptTags="";var host=mapfish._getScriptLocation();for(var i=0;i<jsfiles.length;i++){if(/MSIE/.test(navigator.userAgent)||/Safari/.test(navigator.userAgent)){var currentScriptTag="<script src='"+host+jsfiles[i]+"'></script>";allScriptTags+=currentScriptTag;}else{var s=document.createElement("script");s.src=host+jsfiles[i];var h=document.getElementsByTagName("head").length?document.getElementsByTagName("head")[0]:document.body;h.appendChild(s);}}
if(allScriptTags){document.write(allScriptTags);}}})();mapfish.Util={};mapfish.Util.sum=function(array){for(var i=0,sum=0;i<array.length;sum+=array[i++]);return sum;};mapfish.Util.max=function(array){return Math.max.apply({},array);};mapfish.Util.min=function(array){return Math.min.apply({},array);};mapfish.Util.getIconUrl=function(wmsUrl,options){if(!options.layer){OpenLayers.Console.warn('Missing required layer option in mapfish.Util.getIconUrl');return'';}
if(!options.rule){options.rule=options.layer;}
if(wmsUrl.indexOf("?")<0){wmsUrl+="?";}else if(wmsUrl.lastIndexOf('&')!=(wmsUrl.length-1)){if(wmsUrl.indexOf("?")!=(wmsUrl.length-1)){wmsUrl+="&";}}
var options=OpenLayers.Util.extend({layer:"",rule:"",service:"WMS",version:"1.1.1",request:"GetLegendGraphic",format:"image/png",width:16,height:16},options);options=OpenLayers.Util.upperCaseObject(options);return wmsUrl+OpenLayers.Util.getParameterString(options);};mapfish.Util.arrayEqual=function(a,b){if(a==null||b==null)
return false;if(typeof(a)!='object'||typeof(b)!='object')
return false;if(a.length!=b.length)
return false;for(var i=0;i<a.length;i++){if(typeof(a[i])!=typeof(b[i]))
return false;if(a[i]!=b[i])
return false;}
return true;};mapfish.Util.isIE7=function(){var ua=navigator.userAgent.toLowerCase();return ua.indexOf("msie 7")>-1;};mapfish.Util.relativeToAbsoluteURL=function(source){if(/^\w+:/.test(source)||!source){return source;}
var h=location.protocol+"//"+location.host;if(source.indexOf("/")==0){return h+source;}
var p=location.pathname.replace(/\/[^\/]*$/,'');return h+p+"/"+source;};mapfish.Util.fixArray=function(subs){if(subs==''||subs==null){return[];}else if(subs instanceof Array){return subs;}else{return subs.split(',');}};mapfish.Protocol={decorateProtocol:function(config){var protocol=config.protocol;for(var key in config){if(key!="protocol"){if(!mapfish.Protocol[key]){OpenLayers.Console.error("mapfish.Protocol."+key+" does not exist");}else{protocol=new mapfish.Protocol[key](OpenLayers.Util.extend({protocol:protocol},config[key]));}}}
return protocol;}};mapfish.Searcher=OpenLayers.Class({initialize:function(){},getFilter:function(){},CLASS_NAME:"mapfish.Searcher"});Ext.namespace('mapfish.widgets');mapfish.widgets.MapComponent=function(config){Ext.apply(this,config);this.contentEl=this.map.div;var content=Ext.get(this.contentEl);content.setStyle('width','100%');content.setStyle('height','100%');mapfish.widgets.MapComponent.superclass.constructor.call(this);};Ext.extend(mapfish.widgets.MapComponent,Ext.Panel,{map:null,initComponent:function(){mapfish.widgets.MapComponent.superclass.initComponent.apply(this,arguments);this.on("bodyresize",this.map.updateSize,this.map);}});Ext.reg('mapcomponent',mapfish.widgets.MapComponent);Ext.namespace('mapfish.widgets.toolbar');mapfish.widgets.toolbar.CheckItem=function(config){Ext.apply(this,config);mapfish.widgets.toolbar.CheckItem.superclass.constructor.call(this);};Ext.extend(mapfish.widgets.toolbar.CheckItem,Ext.menu.CheckItem,{controlAdded:false,olHandler:null,initComponent:function(){mapfish.widgets.toolbar.CheckItem.superclass.initComponent.call(this);Ext.QuickTips.init();if(this.control){this.scope=this;this.checkHandler=this.handleChecked;}},handleChecked:function(item,checked){if(!this.controlAdded){this.map.addControl(this.control);this.controlAdded=true;}
if(checked){if(!this.olHandler){if(this.control.div){this.control.div.style.display='block';}}else{this.control.deactivate();eval('this.control.'+this.olHandler+'.activate();');}}else{if(!this.olHandler){if(this.control.div){this.control.div.style.display='none';}}else{this.control.deactivate();}}
this.saveState();},getState:function(){return{className:this.control.CLASS_NAME,olHandler:this.olHandler,active:this.checked};},applyState:function(state){if(!state){return false;}
if(this.control.CLASS_NAME==state.className&&this.olHandler==state.olHandler){this.checked=state.active;}else if(this.control.CLASS_NAME==state.className){this.checked=state.active;}
this.handleChecked(null,this.checked);},onRender:function(container,position){mapfish.widgets.toolbar.CheckItem.superclass.onRender.apply(this,arguments);if(this.tooltip){this.el.dom.qtip=this.tooltip;}}});Ext.reg('checkitem',mapfish.widgets.toolbar.CheckItem);Ext.namespace('mapfish.widgets.toolbar');mapfish.widgets.toolbar.MenuItem=function(config){Ext.apply(this,config);mapfish.widgets.toolbar.MenuItem.superclass.constructor.call(this);};Ext.extend(mapfish.widgets.toolbar.MenuItem,Ext.menu.Item,{initComponent:function(){mapfish.widgets.toolbar.MenuItem.superclass.initComponent.call(this);Ext.QuickTips.init();if(this.control){this.scope=this;this.handler=function(){this.control.trigger();};}},onRender:function(container,position){mapfish.widgets.toolbar.MenuItem.superclass.onRender.apply(this,arguments);if(this.tooltip){this.el.dom.qtip=this.tooltip;}}});Ext.reg('menuitem',mapfish.widgets.toolbar.MenuItem);OpenLayers.Util.extend(OpenLayers.Lang.en,{'mf.layertree.opacity':'Opacity','mf.layertree.remove':'Remove','mf.layertree.zoomToExtent':'Zoom to extent','mf.print.mapTitle':'Title','mf.print.comment':'Comments','mf.print.loadingConfig':'Loading the configuration...','mf.print.serverDown':'The print service is not working','mf.print.unableToPrint':"Unable to print",'mf.print.generatingPDF':"Generating PDF...",'mf.print.dpi':'DPI','mf.print.scale':'Scale','mf.print.rotation':'Rotation','mf.print.print':'Print','mf.print.resetPos':'Reset Pos.','mf.print.layout':'Layout','mf.print.addPage':'Add page','mf.print.remove':'Remove page','mf.print.clearAll':'Clear all','mf.print.pdfReady':'Your PDF document is ready.','mf.print.noPage':'No page selected, click on the "Add page" button to add one.','mf.print.print-tooltip':'Generate a PDF with at least the extent shown on the map','mf.error':'Error','mf.warning':'Warning','mf.information':'Information','mf.recenter.x':'X','mf.recenter.y':'Y','mf.recenter.submit':'Recenter','mf.recenter.missingCoords':'Some coordinates are missing.','mf.recenter.outOfRangeCoords':'Submitted coordinates (${myX}, ${myY}) are not in the map area<br />'+'and must be within following ranges:<br/>'+'${coordX} between ${minCoordX} and ${maxCoordX},<br />'+'${coordY} between ${minCoordY} and ${maxCoordY}','mf.recenter.ws.error':'An error occured when accessing the distant webservice:','mf.recenter.ws.service':'Selected service'});mapfish.Searcher.Map=OpenLayers.Class(mapfish.Searcher,OpenLayers.Control,{protocol:null,mode:null,searchTolerance:3,searchToleranceUnits:'pixels',pixelTolerance:2,delay:300,boxDivClassName:"olHandlerBoxZoomBox",displayDefaultPopup:false,onMouseMove:function(evt){},position:null,popupLonLat:null,response:null,initialize:function(options){this.mode=mapfish.Searcher.Map.CLICK;mapfish.Searcher.prototype.initialize.call(this,options);OpenLayers.Control.prototype.initialize.call(this,options);if(!this.protocol){OpenLayers.Console.error("no protocol set");return;}
switch(this.mode){case mapfish.Searcher.Map.CLICK:this.handler=new OpenLayers.Handler.Click(this,{click:this.handlePoint},{delay:this.delay,pixelTolerance:this.pixelTolerance});break;case mapfish.Searcher.Map.HOVER:this.handler=new OpenLayers.Handler.Hover(this,{pause:this.handlePoint,move:this.cancelSearch},{delay:this.delay,pixelTolerance:this.pixelTolerance});break;case mapfish.Searcher.Map.BOX:this.handler=new OpenLayers.Handler.Box(this,{done:this.handleBox},{boxDivClassName:this.boxDivClassName});break;case mapfish.Searcher.Map.EXTENT:break;default:OpenLayers.Console.error("unsupported mode");return;}},activate:function(){var activated=OpenLayers.Control.prototype.activate.call(this);if(activated){if(this.mode==mapfish.Searcher.Map.EXTENT){this.map.events.register("moveend",this,this.handleMoveend);}else if(this.displayDefaultPopup&&this.protocol.CLASS_NAME=="mapfish.Protocol.TriggerEventDecorator"){this.protocol.events.on({crudfinished:this.displayPopup,scope:this});}}
return activated;},deactivate:function(){var deactivated=OpenLayers.Control.prototype.deactivate.call(this);if(deactivated){if(this.mode==mapfish.Searcher.Map.EXTENT){this.map.events.unregister("moveend",this,this.handleMoveend);}else if(this.displayDefaultPopup&&this.protocol.CLASS_NAME=="mapfish.Protocol.TriggerEventDecorator"){this.protocol.events.un({crudfinished:this.displayPopup,scope:this});}}
return deactivated;},handlePoint:function(evt){this.position=evt.xy;this.popupLonLat=this.map.getLonLatFromViewPortPx(this.position);this.triggerSearch();},handleBox:function(position){if(position instanceof OpenLayers.Bounds){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));this.position=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);this.popupLonLat=this.position.getCenterLonLat();}else{this.position=position;this.popupLonLat=this.map.getLonLatFromViewPortPx(this.position);}
this.triggerSearch();},handleMoveend:function(){this.position=this.map.getExtent();this.triggerSearch();},triggerSearch:function(){this.cancelSearch();var filter=this.getFilter();filter=this.isFilter(filter)?{filter:filter}:{params:filter};var options=OpenLayers.Util.extend({searcher:this},filter);this.response=this.protocol.read(options);},cancelSearch:function(evt){this.protocol.abort(this.response);this.response=null;if(this.mode==mapfish.Searcher.Map.HOVER){this.onMouseMove();}},displayPopup:function(response){var features=response.features;if(features&&features.length>0){var k;var html="<table><tr>";for(k in features[0].attributes){html+="<th>"+k+"</th>";}
html+="</tr>";for(var i=0;i<features.length;i++){var attributes=features[i].attributes;html+="<tr>";for(k in attributes){html+="<td>"+attributes[k]+"</td>";}
html+="</tr>";}
html+="</table>";var popup=new OpenLayers.Popup.FramedCloud("mapfish_popup",this.popupLonLat,null,html,null,true);this.map.addPopup(popup,true);}},isFilter:function(obj){return!!obj.CLASS_NAME&&!!obj.CLASS_NAME.match(/^OpenLayers\.Filter/);},getFilter:function(){var filter=null;if(this.mode==mapfish.Searcher.Map.EXTENT&&!this.position){this.position=this.map.getExtent();}
if(this.position){if(this.position instanceof OpenLayers.Bounds){filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.BBOX,value:this.position});}else{var tolerance=this.searchTolerance;if(tolerance&&this.searchToleranceUnits=="pixels"){tolerance*=this.map.getResolution();}
var lonlat=this.map.getLonLatFromViewPortPx(this.position);filter={lon:lonlat.lon,lat:lonlat.lat};if(tolerance){filter.tolerance=tolerance;}}
this.position=null;}
return filter;},CLASS_NAME:"mapfish.Searcher.Map"});mapfish.Searcher.Map.CLICK="CLICK";mapfish.Searcher.Map.HOVER="HOVER";mapfish.Searcher.Map.BOX="BOX";mapfish.Searcher.Map.EXTENT="EXTENT";Ext.namespace('mapfish.widgets');mapfish.widgets.RadioTreeNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{renderElements:function(n,a,targetNode,bulkRender){this.indentMarkup=n.parentNode?n.parentNode.ui.getChildIndent():'';var cb=typeof a.checked=='boolean';var radioGrp=n.attributes.radioGrp||"radioGrp";var href=a.href?a.href:Ext.isGecko?"":"#";var buf=['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ',a.cls,'" unselectable="on">','<span class="x-tree-node-indent">',this.indentMarkup,"</span>",'<img src="',this.emptyIcon,'" class="x-tree-ec-icon x-tree-elbow" />','<img src="',a.icon||this.emptyIcon,'" class="x-tree-node-icon',(a.icon?" x-tree-node-inline-icon":""),(a.iconCls?" "+a.iconCls:""),'" unselectable="on" />',cb?('<input class="x-tree-node-cb" type="radio" id="'+n.id+'" name="'+radioGrp+'" '+(a.checked?'checked="checked" />':'/>')):'','<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',a.hrefTarget?' target="'+a.hrefTarget+'"':"",'><span unselectable="on">',n.text,"</span></a></div>",'<ul class="x-tree-node-ct" style="display:none;"></ul>',"</li>"].join('');var nel;if(bulkRender!==true&&n.nextSibling&&(nel=n.nextSibling.ui.getEl())){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",nel,buf);}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",targetNode,buf);}
this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var cs=this.elNode.childNodes;this.indentNode=cs[0];this.ecNode=cs[1];this.iconNode=cs[2];var index=3;if(cb){this.checkbox=cs[3];index++;}
this.anchor=cs[index];this.textNode=cs[index].firstChild;},_unused_renderElements:function(n,a,targetNode,bulkRender){mapfish.widgets.RadioTreeNodeUI.superclass.renderElements.apply(this,arguments);var cbNode=Ext.DomQuery.selectNode(".x-tree-node-cb",this.elNode);var radioGrp=n.attributes.radioGrp||"radioGrp";cbNode.setAttribute("type","radio");cbNode.setAttribute("id",n.id);cbNode.setAttribute("name",radioGrp);},onRadioChange:function(){var checked=this.checkbox.checked;this.node.attributes.checked=checked;this.fireEvent('radiochange',this.node,checked);}});mapfish.widgets.LayerTreeEventModel=Ext.extend(Ext.tree.TreeEventModel,{delegateClick:function(e,t){if(!this.beforeEvent(e)){return;}
if(e.getTarget('input[type=checkbox]',1)){this.onCheckboxClick(e,this.getNode(e));}
else if(e.getTarget('input[type=radio]',1)){this.onRadioClick(e,this.getNode(e));}
else if(e.getTarget('.x-tree-ec-icon',1)){this.onIconClick(e,this.getNode(e));}
else if(this.getNodeTarget(e)){this.onNodeClick(e,this.getNode(e));}},onRadioClick:function(e,node){if(!node.ui.onRadioChange){OpenLayers.Console.error("Invalid TreeNodeUI Class, no "+"onRadioChange is available");return;}
node.ui.onRadioChange(e);}});mapfish.widgets.LayerTree=function(config){Ext.apply(this,config);mapfish.widgets.LayerTree.superclass.constructor.call(this);};Ext.extend(mapfish.widgets.LayerTree,Ext.tree.TreePanel,{separator:":",model:null,showWmsLegend:false,rootVisible:false,animate:true,autoScroll:true,loader:new Ext.tree.TreeLoader({}),enableDD:false,containerScroll:true,ascending:true,_automaticModel:true,layerNameToLayer:{},baseLayerNames:[],layersWithSublayers:{},layerToNodeIds:{},nodeIdToNode:{},nodeIdToLayers:{},hasCheckbox:function(node){return typeof(node.attributes.checked)=="boolean";},setNodeChecked:function(nodeOrId,checked,fireEvent){var node=(nodeOrId instanceof Ext.data.Node)?nodeOrId:this.getNodeById(nodeOrId);if(!node||!this.hasCheckbox(node)){return;}
if(checked===undefined){checked=!node.attributes.checked;}
node.attributes.checked=checked;if(node.ui&&node.ui.checkbox){node.ui.checkbox.checked=checked;}
if(fireEvent||(fireEvent===undefined)){node.fireEvent('checkchange',node,checked);}},_updateCachedObjects:function(){if(!this.map){OpenLayers.Console.error("map Object needs to be available when "+"calling _updateCachedObjects");return;}
this.layerNameToLayer={};this.baseLayerNames=[];this.layersWithSublayers={};this.layerToNodeIds={};this.nodeIdToNode={};this.nodeIdToLayers={};Ext.each(this.map.layers,function(layer){var name=layer.name;this.layerNameToLayer[name]=layer;if(layer.isBaseLayer)
this.baseLayerNames.push(name);},this);this.getRootNode().cascade(function(node){if(!node.attributes.layerNames)
return true;var layerNames=node.attributes.layerNames;for(var i=0;i<layerNames.length;i++){var name=layerNames[i];if(name.indexOf(this.separator)!=-1){var name=name.split(this.separator)[0];this.layersWithSublayers[name]=true;}
if(!this.nodeIdToLayers[node.id])
this.nodeIdToLayers[node.id]=[];this.nodeIdToLayers[node.id].push(this.layerNameToLayer[name]);}},this);this.getRootNode().cascade(function(node){var checked=node.attributes.checked;var layerNames=node.attributes.layerNames;if(!layerNames)
return;for(var i=0;i<layerNames.length;i++){var layerName=layerNames[i];if(!layerName)
continue;if(!this.layerToNodeIds[layerName])
this.layerToNodeIds[layerName]=[];this.layerToNodeIds[layerName].push(node.id);this.nodeIdToNode[node.id]=node;}},this);},_updateCheckboxAncestors:function(){var unvisitedNodeIds={};var tree=this;function updateNodeCheckbox(node){if(!tree.hasCheckbox(node)){throw new Error(arguments.callee.name+" should only be called on checkbox nodes");}
var checkboxChildren=[];node.eachChild(function(child){if(tree.hasCheckbox(child))
checkboxChildren.push(child);},this);if(checkboxChildren.length==0){return node.attributes.checked;}
var allChecked=true;Ext.each(checkboxChildren,function(child){if(!updateNodeCheckbox(child)){allChecked=false;return false;}},this);tree.setNodeChecked(node,allChecked,false);delete unvisitedNodeIds[node.id];return allChecked;}
var checkboxNodes=[];this.getRootNode().cascade(function(node){if(this.hasCheckbox(node)){checkboxNodes.push(node);unvisitedNodeIds[node.id]=true;}},this);var node;while(node=checkboxNodes.shift()){if(unvisitedNodeIds[node.id])
updateNodeCheckbox(node);}},_handleModelChange:function LT__handleModelChange(clickedNode,checked){if(clickedNode){clickedNode.cascade(function(node){this.setNodeChecked(node,checked,false);},this);}
this._updateCheckboxAncestors();if(!this.map){return;}
this._updateCachedObjects();function getVisibilityFromMap(){var layerVisibility={};Ext.each(this.map.layers,function(layer){var name=layer.name;layerVisibility[name]=layer.visibility;if(!(layer instanceof OpenLayers.Layer.WMS)&&!(layer instanceof OpenLayers.Layer.WMS.Untiled)&&!(layer instanceof OpenLayers.Layer.MapServer))
{return;}
if(!this.layersWithSublayers[layer.name])
return;if(layer.isBaseLayer){OpenLayers.Console.error("Using sublayers on a base layer "+"is not supported (base layer is "+
name+")");}
if(!layer._origLayers){layer._origLayers=layer.params.LAYERS||layer.params.layers;}
var sublayers=layer._origLayers;if(sublayers instanceof Array){for(var j=0;j<sublayers.length;j++){var sublayer=sublayers[j];layerVisibility[name+this.separator+sublayer]=layer.visibility;}}},this);return layerVisibility;}
function updateVisibilityFromTree(layerVisibility){var forcedVisibility={};this.getRootNode().cascade(function(node){var checked=node.attributes.checked;var layerNames=node.attributes.layerNames;var radioGrp=null;if(!layerNames)
return;for(var i=0;i<layerNames.length;i++){var layerName=layerNames[i];if(!layerName)
continue;if(layerVisibility[layerName]==undefined)
OpenLayers.Console.error("Invalid layer: ",layerName);if(node.attributes.radio){radioGrp=node.attributes.radioGrp||"radioGrp";if(!radioButton[radioGrp])
radioButton[radioGrp]={};radioButton[radioGrp][layerName]=checked;}
if(forcedVisibility[layerName])
continue;if(node==clickedNode){if(this.baseLayerNames.indexOf(layerName)!=-1){clickedBaseLayer=layerName;}
if(radioGrp){clickedRadioButton[0]=radioGrp;clickedRadioButton[1]=layerName;}
forcedVisibility[layerName]=true;}
layerVisibility[layerName]=checked;}},this);return layerVisibility;}
function applyBaseLayerRestriction(layerVisibility,clickedBaseLayer,currentBaseLayerName){var numBaseLayer=0;for(var i=0;i<this.baseLayerNames.length;i++){if(layerVisibility[this.baseLayerNames[i]])
numBaseLayer++;}
if(numBaseLayer==1)
return layerVisibility;for(var i=0;i<this.baseLayerNames.length;i++){layerVisibility[this.baseLayerNames[i]]=false;}
if(clickedBaseLayer){layerVisibility[clickedBaseLayer]=true;return layerVisibility;}
if(!currentBaseLayerName)
return layerVisibility;layerVisibility[currentBaseLayerName]=true;return layerVisibility;}
function applyRadioButtonRestriction(layerVisibility,clickedRadioButton,radioButton){for(var radioGrp in radioButton){for(var layerName in radioButton[radioGrp]){if(clickedRadioButton[0]==radioGrp){layerVisibility[layerName]=layerName==clickedRadioButton[1];}else{layerVisibility[layerName]=radioButton[radioGrp][layerName];}}}
return layerVisibility;}
function updateTreeFromVisibility(layerVisibility){for(var layerName in layerVisibility){var nodeIds=this.layerToNodeIds[layerName];if(!nodeIds)
continue;for(var i=0;i<nodeIds.length;i++){var node=this.nodeIdToNode[nodeIds[i]];if(!node)
continue;var layerNames=node.attributes.layerNames;if(!layerNames){OpenLayers.Console.error("unexpected state");continue;}
var allChecked=true;for(var j=0;j<layerNames.length;j++){var layerName=layerNames[j];if(!layerName)
continue;if(!layerVisibility[layerName]){allChecked=false;break;}}
this.setNodeChecked(node,allChecked,false);}}}
function updateMapFromVisibility(layerVisibility){var wmsLayers={};for(var layerName in layerVisibility){var visible=layerVisibility[layerName];var splitName=layerName.split(this.separator);if(splitName.length!=2)
continue;delete layerVisibility[layerName];layerName=splitName[0];var sublayerName=splitName[1];if(!wmsLayers[layerName]){wmsLayers[layerName]=[];}
if(visible){wmsLayers[layerName].push(sublayerName);}}
for(layerName in wmsLayers){if(layerVisibility[layerName]!==undefined)
delete layerVisibility[layerName];}
for(var layerName in layerVisibility){var layer=this.layerNameToLayer[layerName];if(!layer){OpenLayers.Console.error("Non existing layer name",layerName);continue;}
if(this.baseLayerNames.indexOf(layerName)!=-1){if(layerVisibility[layerName]){this.map.setBaseLayer(layer);}}else{layer.setVisibility(layerVisibility[layerName]);}}
for(var layerName in wmsLayers){var layer=this.layerNameToLayer[layerName];var sublayers=wmsLayers[layerName];if(layer.isBaseLayer){OpenLayers.Console.error("base layer for sublayer "+"are not supported");return;}
if(sublayers.length==0){layer.setVisibility(false,true);}else{if(!this.enableDD){if(!layer._origLayers){OpenLayers.Console.error("Assertion failure");}
var origLayers=layer._origLayers;var orderedLayers=[];for(var i=0;i<origLayers.length;i++){var l=origLayers[i];if(sublayers.indexOf(l)!=-1)
orderedLayers.push(l);}
sublayers=orderedLayers;}
var layerParamName=layer.params.LAYERS?"LAYERS":"layers";if(!mapfish.Util.arrayEqual(layer.params[layerParamName],sublayers)){layer.params[layerParamName]=sublayers;layer.redraw();}
layer.setVisibility(true,true);}}}
var currentBaseLayerName;if(this.map.baseLayer)
currentBaseLayerName=this.map.baseLayer.name;var clickedBaseLayer;var radioButton={};var clickedRadioButton=[];var layerVisibility=getVisibilityFromMap.call(this);layerVisibility=updateVisibilityFromTree.call(this,layerVisibility);applyBaseLayerRestriction.call(this,layerVisibility,clickedBaseLayer,currentBaseLayerName);applyRadioButtonRestriction.call(this,layerVisibility,clickedRadioButton,radioButton);updateTreeFromVisibility.call(this,layerVisibility);updateMapFromVisibility.call(this,layerVisibility);},_extractOLModel:function LT__extractOLModel(){var layers=[];var layersArray=this.map.layers.slice();if(!this.ascending){layersArray.reverse();}
for(var i=0;i<layersArray.length;i++){var l=layersArray[i];var wmsChildren=[];if(l instanceof OpenLayers.Layer.WMS||l instanceof OpenLayers.Layer.WMS.Untiled||l instanceof OpenLayers.Layer.MapServer){var sublayers=l.params.LAYERS||l.params.layers;if(sublayers instanceof Array){for(var j=0;j<sublayers.length;j++){var w=sublayers[j];var iconUrl;if(this.showWmsLegend){iconUrl=mapfish.Util.getIconUrl(l.url,{layer:w});}
var wmsChild={text:w,checked:l.getVisibility(),icon:iconUrl,layerName:l.name+this.separator+w,children:[],cls:"cf-wms-node"};if(this.ascending){wmsChildren.push(wmsChild);}else{wmsChildren.unshift(wmsChild);}}}}
var info={text:l.name,checked:l.getVisibility(),layerName:(wmsChildren.length>0?null:l.name),children:wmsChildren};if(!l.displayInLayerSwitcher){info.uiProvider=function(){};info.uiProvider.prototype={render:function(){},renderIndent:function(){}};}
layers.push(info);}
return layers;},_updateOrder:function(){this._updateCachedObjects();function layerIndex(layers,name){for(var i=0;i<layers.length;i++){var l=layers[i];if(l.name==name)
return i;}
return-1;}
var orderedLayers=this.map.layers.slice();var seenLayers={};var nodes=[];this.getRootNode().cascade(function(node){if(this.ascending)
nodes.push(node);else
nodes.unshift(node);},this);Ext.each(nodes,function(node){var layers=this.nodeIdToLayers[node.id];if(!layers)
return;Ext.each(layers,function(layer){var layerName=layer.name;if(seenLayers[layerName])
return;seenLayers[layerName]=true;var index=layerIndex(orderedLayers,layerName);if(index==-1||!this.layerNameToLayer[layerName]){throw new Error("Layer "+layerName+" not available");}
orderedLayers.splice(index,1);orderedLayers.push(this.layerNameToLayer[layerName]);},this);},this);this._updateCheckboxAncestors();this.map.layers=orderedLayers;for(var i=0;i<this.map.layers.length;i++){this.map.setLayerZIndex(this.map.layers[i],i);}},_fixupModel:function(){this.getRootNode().cascade(function(node){var attrs=node.attributes;if(!attrs.layerNames&&attrs.layerName){attrs.layerNames=[attrs.layerName];delete attrs.layerName;}},this);if(this.map)
this._updateCachedObjects();this.getRootNode().cascade(function(node){var layers;if(!node.attributes.radio&&(!this.map||!(layers=this.nodeIdToLayers[node.id])))
return;var isBaseLayer=false;if(layers){isBaseLayer=true;Ext.each(layers,function(layer){if(!layer.isBaseLayer){isBaseLayer=false;return false;}},this);}
if(isBaseLayer||node.attributes.radio){node.attributes.uiProvider=mapfish.widgets.RadioTreeNodeUI;if(node.ui)
node.ui=new mapfish.widgets.RadioTreeNodeUI(node);}},this);},initComponent:function(){this.eventModel=new mapfish.widgets.LayerTreeEventModel(this);mapfish.widgets.LayerTree.superclass.initComponent.call(this);this.addListener("checkchange",function checkChange(node,checked){this._handleModelChange(node,checked);},this);this.addListener("radiochange",function radioChange(node,checked){this._handleModelChange(node,checked);},this);this._automaticModel=!this.model;if(!this.model){this.model=this._extractOLModel();}
var root={text:'Root',draggable:false,id:'source',children:this.model,leaf:false};function buildTree(attributes){var node=new Ext.tree.TreeNode(attributes);var cs=attributes.children;node.leaf=!cs;if(!cs)
return node;for(var i=0;i<cs.length;i++){if(!cs[i]){continue;}
node.appendChild(buildTree(cs[i]));}
return node;}
var rootNode=buildTree(root);this.setRootNode(rootNode);this._fixupModel();this.addListener("dragdrop",function(){this._updateOrder(arguments);},this);if(!this._automaticModel){this._handleModelChange(null,null);if(this.enableDD)
this._updateOrder();}},onRender:function(container,position){if(!this.el){this.el=document.createElement('div');}
mapfish.widgets.LayerTree.superclass.onRender.apply(this,arguments);}});Ext.reg('layertree',mapfish.widgets.LayerTree);mapfish.widgets.LayerTree.getNodeLayers=function(layerTree,node){var olLayers=[];node.cascade(function(subNode){var curLayers=layerTree.nodeIdToLayers[subNode.id];if(curLayers){olLayers=olLayers.concat(curLayers);}});return olLayers;};mapfish.widgets.LayerTree.removeNode=function(layerTree,node){node.cascade(function(subNode){if(subNode.attributes&&subNode.attributes.layerNames){var layerNames=subNode.attributes.layerNames;for(var i=0;i<layerNames.length;++i){var layerName=layerNames[i].split(layerTree.separator);var olLayer=layerTree.layerNameToLayer[layerName[0]];var wmsLayer=layerName[1];var layerList;if(olLayer.params.LAYERS){layerList=olLayer.params.LAYERS=mapfish.Util.fixArray(olLayer.params.LAYERS);}else{layerList=olLayer.params.layers=mapfish.Util.fixArray(olLayer.params.layers);}
if(wmsLayer&&layerList){layerList.remove(wmsLayer);}
if(!wmsLayer||!layerList||layerList.length==0){olLayer.destroy();}else{olLayer.redraw();}}}});var parent=node.parentNode;node.remove();while(parent){if(parent.hasChildNodes()){break;}
var cur=parent;parent=parent.parentNode;cur.remove();}
layerTree._updateCachedObjects();};mapfish.widgets.LayerTree.MenuFeatures={opacitySlide:function(layerTree,node,olLayers){if(olLayers.length==0)return null;return{text:OpenLayers.Lang.translate("mf.layertree.opacity"),menu:{plain:true,items:[mapfish.widgets.LayerTree.MenuFeatures.opacitySlideDirect(layerTree,node,olLayers)]}};},opacitySlideDirect:function(layerTree,node,olLayers){if(olLayers.length==0)return null;var value=0;for(var i=0;i<olLayers.length;++i){value+=olLayers[i].opacity==null?1.0:olLayers[i].opacity;}
value=value/olLayers.length;return new Ext.menu.Adapter(new Ext.Slider({width:200,value:value*100,listeners:{change:function(slider,value){for(var j=0;j<olLayers.length;++j){olLayers[j].setOpacity(value/100.0);}}}}));},remove:function(layerTree,node,olLayers){if(olLayers.length==0)return null;for(var i=0;i<olLayers.length;++i){var layer=olLayers[i];if(layer.isBaseLayer&&layer.getVisibility()){return null;}}
return{text:OpenLayers.Lang.translate('mf.layertree.remove'),handler:function(){mapfish.widgets.LayerTree.removeNode(layerTree,node);}};},zoomToExtent:function(layerTree,node,olLayers){if(olLayers.length==0)return null;var bbox=null;for(var i=0;i<olLayers.length;++i){var layer=olLayers[i];if(bbox){bbox.extend(layer.maxExtent);}else{bbox=layer.maxExtent.clone();}}
return{text:OpenLayers.Lang.translate('mf.layertree.zoomToExtent'),handler:function(){layerTree.map.zoomToExtent(bbox);}};}};mapfish.widgets.LayerTree.createContextualMenuPlugin=function(options){return{init:function(layerTree){function openMenu(node,e){var olLayers=mapfish.widgets.LayerTree.getNodeLayers(layerTree,node);var items=[];for(var j=0;j<options.length;++j){var constructor=mapfish.widgets.LayerTree.MenuFeatures[options[j]];var menuItem=constructor(layerTree,node,olLayers);if(menuItem){items.push(menuItem);}}
if(items.length>0){var menu=new Ext.menu.Menu({ignoreParentClick:true,defaults:{scope:layerTree},items:items});menu.showAt(e.getXY());menu.on('hide',function(){menu.destroy();});}}
if(Ext.isOpera){layerTree.on('click',function(node,e){if(e.hasModifier()){e.stopEvent();openMenu(node,e);}});}else{layerTree.on('contextMenu',function(node,e){e.stopEvent();openMenu(node,e);});}}};};mapfish.widgets.LayerTree.createDisableLayersPlugin=function(serverResolution){return{init:function(layertree){if(!layertree.map){return;}
layertree.map.events.on({zoomend:function(){function checkDisable(node,disable){if(disable){node.disable();}else{var scale=layertree.map.getScale();scale=scale*serverResolution/OpenLayers.DOTS_PER_INCH;if(scale<node.attributes.minScale||scale>node.attributes.maxScale){node.disable();disable=true;}else{node.enable();disable=false;}}
node.eachChild(function(child){checkDisable(child,disable);});}
checkDisable(layertree.root,false);}});}};};
