
Ext.namespace("gxp");gxp.util={_uniqueNames:{},getOGCExceptionText:function(report){var msg;if(report&&report.exceptions){msg=[];Ext.each(report.exceptions,function(obj){Ext.each(obj.texts,function(text){msg.push(text);});});msg=msg.join("\n");}else{msg="Unknown error (no exception report).";}
return msg;},dispatch:function(functions,complete,scope){complete=complete||Ext.emptyFn;scope=scope||this;var requests=functions.length;var responses=0;var storage={};function respond(){++responses;if(responses===requests){complete.call(scope,storage);}}
function trigger(index){window.setTimeout(function(){functions[index].apply(scope,[respond,storage]);});}
for(var i=0;i<requests;++i){trigger(i);}},uniqueName:function(name,delimiter){delimiter=delimiter||" ";var regEx=new RegExp(delimiter+"[0-9]*$");var key=name.replace(regEx,"");var regExResult=regEx.exec(name);var count=this._uniqueNames[key]!==undefined?this._uniqueNames[key]:(regExResult instanceof Array?Number(regExResult[0]):undefined);var newName=key;if(count!==undefined){count++;newName+=delimiter+count;}
this._uniqueNames[key]=count||0;return newName;},getAbsoluteUrl:function(url){var a;if(Ext.isIE6||Ext.isIE7||Ext.isIE8){a=document.createElement("<a href='"+url+"'/>");a.style.display="none";document.body.appendChild(a);a.href=a.href;document.body.removeChild(a);}else{a=document.createElement("a");a.href=url;}
return a.href;},md5:(function(){var MD5_T=[0x00000000,0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391];var MD5_round1=[[0,7,1],[1,12,2],[2,17,3],[3,22,4],[4,7,5],[5,12,6],[6,17,7],[7,22,8],[8,7,9],[9,12,10],[10,17,11],[11,22,12],[12,7,13],[13,12,14],[14,17,15],[15,22,16]];var MD5_round2=[[1,5,17],[6,9,18],[11,14,19],[0,20,20],[5,5,21],[10,9,22],[15,14,23],[4,20,24],[9,5,25],[14,9,26],[3,14,27],[8,20,28],[13,5,29],[2,9,30],[7,14,31],[12,20,32]];var MD5_round3=[[5,4,33],[8,11,34],[11,16,35],[14,23,36],[1,4,37],[4,11,38],[7,16,39],[10,23,40],[13,4,41],[0,11,42],[3,16,43],[6,23,44],[9,4,45],[12,11,46],[15,16,47],[2,23,48]];var MD5_round4=[[0,6,49],[7,10,50],[14,15,51],[5,21,52],[12,6,53],[3,10,54],[10,15,55],[1,21,56],[8,6,57],[15,10,58],[6,15,59],[13,21,60],[4,6,61],[11,10,62],[2,15,63],[9,21,64]];function MD5_F(x,y,z){return(x&y)|(~x&z);}
function MD5_G(x,y,z){return(x&z)|(y&~z);}
function MD5_H(x,y,z){return x^y^z;}
function MD5_I(x,y,z){return y^(x|~z);}
var MD5_round=[[MD5_F,MD5_round1],[MD5_G,MD5_round2],[MD5_H,MD5_round3],[MD5_I,MD5_round4]];function MD5_pack(n32){return String.fromCharCode(n32&0xff)+
String.fromCharCode((n32>>>8)&0xff)+
String.fromCharCode((n32>>>16)&0xff)+
String.fromCharCode((n32>>>24)&0xff);}
function MD5_unpack(s4){return s4.charCodeAt(0)|(s4.charCodeAt(1)<<8)|(s4.charCodeAt(2)<<16)|(s4.charCodeAt(3)<<24);}
function MD5_number(n){while(n<0){n+=4294967296;}
while(n>4294967295){n-=4294967296;}
return n;}
function MD5_apply_round(x,s,f,abcd,r){var a,b,c,d;var kk,ss,ii;var t,u;a=abcd[0];b=abcd[1];c=abcd[2];d=abcd[3];kk=r[0];ss=r[1];ii=r[2];u=f(s[b],s[c],s[d]);t=s[a]+u+x[kk]+MD5_T[ii];t=MD5_number(t);t=((t<<ss)|(t>>>(32-ss)));t+=s[b];s[a]=MD5_number(t);}
function MD5_hash(data){var abcd,x,state,s;var len,index,padLen,f,r;var i,j,k;var tmp;state=[0x67452301,0xefcdab89,0x98badcfe,0x10325476];len=data.length;index=len&0x3f;padLen=(index<56)?(56-index):(120-index);if(padLen>0){data+="\x80";for(i=0;i<padLen-1;i++){data+="\x00";}}
data+=MD5_pack(len*8);data+=MD5_pack(0);len+=padLen+8;abcd=[0,1,2,3];x=[16];s=[4];for(k=0;k<len;k+=64){for(i=0,j=k;i<16;i++,j+=4){x[i]=data.charCodeAt(j)|(data.charCodeAt(j+1)<<8)|(data.charCodeAt(j+2)<<16)|(data.charCodeAt(j+3)<<24);}
for(i=0;i<4;i++){s[i]=state[i];}
for(i=0;i<4;i++){f=MD5_round[i][0];r=MD5_round[i][1];for(j=0;j<16;j++){MD5_apply_round(x,s,f,abcd,r[j]);tmp=abcd[0];abcd[0]=abcd[3];abcd[3]=abcd[2];abcd[2]=abcd[1];abcd[1]=tmp;}}
for(i=0;i<4;i++){state[i]+=s[i];state[i]=MD5_number(state[i]);}}
return MD5_pack(state[0])+
MD5_pack(state[1])+
MD5_pack(state[2])+
MD5_pack(state[3]);}
function MD5_hexhash(data){var i,out,c;var bit128;bit128=MD5_hash(data);out="";for(i=0;i<16;i++){c=bit128.charCodeAt(i);out+="0123456789abcdef".charAt((c>>4)&0xf);out+="0123456789abcdef".charAt(c&0xf);}
return out;}
return function(data){return MD5_hexhash(data);};})()};Ext.namespace("gxp.plugins");gxp.plugins.LayerSource=Ext.extend(Ext.util.Observable,{store:null,title:"",constructor:function(config){this.initialConfig=config;Ext.apply(this,config);this.addEvents("ready","failure");gxp.plugins.LayerSource.superclass.constructor.apply(this,arguments);},init:function(target){this.target=target;this.createStore();},getMapProjection:function(){var projConfig=this.target.mapPanel.map.projection;return this.target.mapPanel.map.getProjectionObject()||(projConfig&&new OpenLayers.Projection(projConfig))||new OpenLayers.Projection("EPSG:4326");},getProjection:function(layerRecord){var layer=layerRecord.getLayer();var mapProj=this.getMapProjection();var proj=layer.projection?layer.projection instanceof OpenLayers.Projection?layer.projection:new OpenLayers.Projection(layer.projection):mapProj;return proj.equals(mapProj)?mapProj:null;},createStore:function(){this.fireEvent("ready",this);},createLayerRecord:function(config){},getConfigForRecord:function(record){var layer=record.getLayer();return{source:record.get("source"),name:record.get("name"),title:record.get("title"),visibility:layer.getVisibility(),opacity:layer.opacity||undefined,group:record.get("group"),fixed:record.get("fixed"),selected:record.get("selected")};}});Ext.namespace("gxp");gxp.EmbedMapDialog=Ext.extend(Ext.Container,{url:null,url:null,publishMessage:"Your map is ready to be published to the web! Simply copy the following HTML to embed the map in your website:",heightLabel:'Height',widthLabel:'Width',mapSizeLabel:'Map Size',miniSizeLabel:'Mini',smallSizeLabel:'Small',premiumSizeLabel:'Premium',largeSizeLabel:'Large',snippetArea:null,heightField:null,widthField:null,initComponent:function(){Ext.apply(this,this.getConfig());gxp.EmbedMapDialog.superclass.initComponent.call(this);},getIframeHTML:function(){return this.snippetArea.getValue();},updateSnippet:function(){this.snippetArea.setValue('<iframe style="border: none;" height="'+this.heightField.getValue()+'" width="'+this.widthField.getValue()+'" src="'+
gxp.util.getAbsoluteUrl(this.url)+'"></iframe>');if(this.snippetArea.isVisible()===true){this.snippetArea.focus(true,100);}},getConfig:function(){this.snippetArea=new Ext.form.TextArea({height:70,selectOnFocus:true,readOnly:true});var numFieldListeners={"change":this.updateSnippet,"specialkey":function(f,e){e.getKey()==e.ENTER&&this.updateSnippet();},scope:this};this.heightField=new Ext.form.NumberField({width:50,value:400,listeners:numFieldListeners});this.widthField=new Ext.form.NumberField({width:50,value:600,listeners:numFieldListeners});var adjustments=new Ext.Container({layout:"column",defaults:{border:false,xtype:"box"},items:[{autoEl:{cls:"gxp-field-label",html:this.mapSizeLabel}},new Ext.form.ComboBox({editable:false,width:75,store:new Ext.data.SimpleStore({fields:["name","height","width"],data:[[this.miniSizeLabel,100,100],[this.smallSizeLabel,200,300],[this.largeSizeLabel,400,600],[this.premiumSizeLabel,600,800]]}),triggerAction:'all',displayField:'name',value:this.largeSizeLabel,mode:'local',listeners:{"select":function(combo,record,index){this.widthField.setValue(record.get("width"));this.heightField.setValue(record.get("height"));this.updateSnippet();},scope:this}}),{autoEl:{cls:"gxp-field-label",html:this.heightLabel}},this.heightField,{autoEl:{cls:"gxp-field-label",html:this.widthLabel}},this.widthField]});return{border:false,defaults:{border:false,cls:"gxp-export-section",xtype:"container",layout:"fit"},items:[{items:[adjustments]},{xtype:"box",autoEl:{tag:"p",html:this.publishMessage}},{items:[this.snippetArea]}],listeners:{"afterrender":this.updateSnippet,scope:this}};}});Ext.reg('gxp_embedmapdialog',gxp.EmbedMapDialog);Ext.namespace("gxp.data");gxp.data.WFSFeatureStore=Ext.extend(GeoExt.data.FeatureStore,{setOgcFilter:function(ogcFilter){this.proxy.setFilter(ogcFilter);},constructor:function(config){if(!(config.proxy&&config.proxy instanceof GeoExt.data.ProtocolProxy)){config.proxy=new gxp.data.WFSProtocolProxy(Ext.apply({srsName:config.srsName,url:config.url,featureType:config.featureType,featureNS:config.featureNS,geometryName:config.geometryName,schema:config.schema,filter:config.ogcFilter,maxFeatures:config.maxFeatures,multi:config.multi},config.proxy));}
if(!config.writer){config.writer=new Ext.data.DataWriter({write:Ext.emptyFn});}
gxp.data.WFSFeatureStore.superclass.constructor.apply(this,arguments);this.reader.extractValues=(function(data,items,length){var obj=this.readRecords([data.feature]);return obj.records[0].data;}).createDelegate(this.reader);this.reader.meta.idProperty="id";this.reader.getId=function(data){return data.id;};}});Ext.namespace("gxp.data");gxp.data.WFSProtocolProxy=Ext.extend(GeoExt.data.ProtocolProxy,{setFilter:function(filter){this.protocol.filter=filter;this.protocol.options.filter=filter;},constructor:function(config){Ext.applyIf(config,{version:"1.1.0"});if(!(this.protocol&&this.protocol instanceof OpenLayers.Protocol)){config.protocol=new OpenLayers.Protocol.WFS(Ext.apply({version:config.version,srsName:config.srsName,url:config.url,featureType:config.featureType,featureNS:config.featureNS,geometryName:config.geometryName,schema:config.schema,filter:config.filter,maxFeatures:config.maxFeatures,multi:config.multi},config.protocol));}
gxp.data.WFSProtocolProxy.superclass.constructor.apply(this,arguments);},doRequest:function(action,records,params,reader,callback,scope,arg){delete params.xaction;if(action===Ext.data.Api.actions.read){this.load(params,reader,callback,scope,arg);}else{if(!(records instanceof Array)){records=[records];}
var features=new Array(records.length),feature;Ext.each(records,function(r,i){features[i]=r.getFeature();feature=features[i];feature.modified=Ext.apply(feature.modified||{},{attributes:Ext.apply((feature.modified&&feature.modified.attributes)||{},r.modified)});},this);var o={action:action,records:records,callback:callback,scope:scope};var options={callback:function(response){this.onProtocolCommit(response,o);},scope:this};Ext.applyIf(options,params);this.protocol.commit(features,options);}},onProtocolCommit:function(response,o){if(response.success()){var features=response.reqFeatures;var state,feature;var destroys=[];var insertIds=response.insertIds||[];var i,len,j=0;for(i=0,len=features.length;i<len;++i){feature=features[i];state=feature.state;if(state){if(state==OpenLayers.State.DELETE){destroys.push(feature);}else if(state==OpenLayers.State.INSERT){feature.fid=insertIds[j];++j;}else if(feature.modified){feature.modified={};}
feature.state=null;}}
for(i=0,len=destroys.length;i<len;++i){feature=destroys[i];feature.layer&&feature.layer.destroyFeatures([feature]);}
len=features.length;var data=new Array(len);var f;for(i=0;i<len;++i){f=features[i];data[i]={id:f.id,feature:f,state:null};var fields=o.records[i].fields;for(var a in f.attributes){if(fields.containsKey(a)){data[i][a]=f.attributes[a];}}}
o.callback.call(o.scope,data,response.priv,true);}else{var request=response.priv;if(request.status>=200&&request.status<300){this.fireEvent("exception",this,"remote",o.action,o,response.error,o.records);}else{this.fireEvent("exception",this,"response",o.action,o,request);}
o.callback.call(o.scope,[],request,false);}}});Ext.namespace("gxp.plugins");gxp.plugins.Tool=Ext.extend(Ext.util.Observable,{ptype:"gxp_tool",autoActivate:true,actionTarget:"map.tbar",output:null,constructor:function(config){this.initialConfig=config||{};this.active=false;Ext.apply(this,config);if(!this.id){this.id=Ext.id();}
this.output=[];this.addEvents("activate","deactivate");gxp.plugins.Tool.superclass.constructor.apply(this,arguments);},init:function(target){target.tools[this.id]=this;this.target=target;this.autoActivate&&this.activate();this.target.on("portalready",this.addActions,this);},activate:function(){if(this.active===false){this.active=true;this.fireEvent("activate",this);return true;}},deactivate:function(){if(this.active===true){this.active=false;this.fireEvent("deactivate",this);return true;}},addActions:function(actions){actions=actions||this.actions;if(!actions||this.actionTarget===null){this.addOutput();return;}
var actionTargets=this.actionTarget instanceof Array?this.actionTarget:[this.actionTarget];var a=actions instanceof Array?actions:[actions];var action,actionTarget,i,j,jj,parts,ref,item,ct,meth,index=null;for(i=actionTargets.length-1;i>=0;--i){actionTarget=actionTargets[i];if(actionTarget){if(actionTarget instanceof Object){index=actionTarget.index;actionTarget=actionTarget.target;}
parts=actionTarget.split(".");ref=parts[0];item=parts.length>1&&parts[1];ct=ref?ref=="map"?this.target.mapPanel:(Ext.getCmp(ref)||this.target.portal[ref]):this.target.portal;if(item){meth={"tbar":"getTopToolbar","bbar":"getBottomToolbar","fbar":"getFooterToolbar"}[item];if(meth){ct=ct[meth]();}else{ct=ct[item];}}}
for(j=0,jj=a.length;j<jj;++j){if(!(a[j]instanceof Ext.Action||a[j]instanceof Ext.Component)){if(typeof a[j]!="string"){if(j==this.defaultAction){a[j].pressed=true;}
a[j]=new Ext.Action(a[j]);}}
action=a[j];if(j==this.defaultAction&&action instanceof GeoExt.Action){action.isDisabled()?action.activateOnEnable=true:action.control.activate();}
if(ct){if(ct instanceof Ext.menu.Menu){action=Ext.apply(new Ext.menu.Item(action),{text:action.initialConfig.menuText});}else if(!(ct instanceof Ext.Toolbar)){action=new Ext.Button(action);}
var addedAction=(index===null)?ct.add(action):ct.insert(index,action);action=action instanceof Ext.Button?action:addedAction;if(index!==null){index+=1;}
if(this.outputAction!=null&&j==this.outputAction){var cmp;action.on("click",function(){if(cmp){this.outputTarget?cmp.show():cmp.ownerCt.ownerCt.show();}else{cmp=this.addOutput();}},this);}}}
if(ct){ct.isVisible()?ct.doLayout():ct instanceof Ext.menu.Menu||ct.show();}}
this.actions=a;return this.actions;},addOutput:function(config){if(!config&&!this.outputConfig){return;}
config=config||{};var ref=this.outputTarget;var container;if(ref){if(ref==="map"){container=this.target.mapPanel;}else{container=Ext.getCmp(ref)||this.target.portal[ref];}
Ext.apply(config,this.outputConfig);}else{var outputConfig=this.outputConfig||{};container=new Ext.Window(Ext.apply({hideBorders:true,shadow:false,closeAction:"hide",autoHeight:!outputConfig.height,layout:outputConfig.height?"fit":undefined,items:[{defaults:Ext.applyIf({autoHeight:!outputConfig.height&&!(outputConfig.defaults&&outputConfig.defaults.height)},outputConfig.defaults)}]},outputConfig)).show().items.get(0);}
var component=container.add(config);if(component instanceof Ext.Window){component.show();}else{container.doLayout();}
this.output.push(component);return component;},removeOutput:function(){var cmp;for(var i=this.output.length-1;i>=0;--i){cmp=this.output[i];if(!this.outputTarget){cmp.findParentBy(function(p){return p instanceof Ext.Window;}).close();}else{if(cmp.ownerCt){cmp.ownerCt.remove(cmp);if(cmp.ownerCt instanceof Ext.Window){cmp.ownerCt[cmp.ownerCt.closeAction]();}}else{cmp.remove();}}}
this.output=[];}});Ext.preg(gxp.plugins.Tool.prototype.ptype,gxp.plugins.Tool);Ext.namespace("gxp.plugins");gxp.plugins.FeatureManager=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_featuremanager",maxFeatures:100,paging:true,pagingType:null,autoZoomPage:false,autoSetLayer:true,autoLoadFeatures:false,layerRecord:null,featureStore:null,hitCountProtocol:null,featureLayer:null,schema:null,geometryType:null,toolsShowingLayer:null,style:null,pages:null,page:null,numberOfFeatures:null,numPages:null,pageIndex:null,constructor:function(config){this.addEvents("beforequery","query","beforelayerchange","layerchange","beforesetpage","setpage","beforeclearfeatures","clearfeatures","beforesave","exception");if(config&&!config.pagingType){this.pagingType=gxp.plugins.FeatureManager.QUADTREE_PAGING;}
if(config&&config.layer){this.autoSetLayer=false;}
gxp.plugins.FeatureManager.superclass.constructor.apply(this,arguments);},init:function(target){gxp.plugins.FeatureManager.superclass.init.apply(this,arguments);this.toolsShowingLayer={};this.style={"all":new OpenLayers.Style(null,{rules:[new OpenLayers.Rule({symbolizer:this.initialConfig.symbolizer||{"Point":{pointRadius:4,graphicName:"square",fillColor:"white",fillOpacity:1,strokeWidth:1,strokeOpacity:1,strokeColor:"#333333"},"Line":{strokeWidth:4,strokeOpacity:1,strokeColor:"#ff9933"},"Polygon":{strokeWidth:2,strokeOpacity:1,strokeColor:"#ff6633",fillColor:"white",fillOpacity:0.3}}})]}),"selected":new OpenLayers.Style(null,{rules:[new OpenLayers.Rule({symbolizer:{display:"none"}})]})};this.featureLayer=new OpenLayers.Layer.Vector(this.id,{displayInLayerSwitcher:false,visibility:false,styleMap:new OpenLayers.StyleMap({"select":OpenLayers.Util.extend({display:""},OpenLayers.Feature.Vector.style["select"]),"vertex":this.style["all"]},{extendDefault:false})});this.target.on({ready:function(){this.target.mapPanel.map.addLayer(this.featureLayer);},scope:this});this.on({beforedestroy:function(){this.target.mapPanel.map.removeLayer(this.featureLayer);},scope:this});},activate:function(){if(gxp.plugins.FeatureManager.superclass.activate.apply(this,arguments)){if(this.autoSetLayer){this.target.on("beforelayerselectionchange",this.setLayer,this);}
if(this.layer){this.target.createLayerRecord(this.layer,this.setLayer,this);}
this.on("layerchange",this.setSchema,this);return true;}},deactivate:function(){if(gxp.plugins.FeatureManager.superclass.deactivate.apply(this,arguments)){if(this.autoSetLayer){this.target.un("beforelayerselectionchange",this.setLayer,this);}
this.un("layerchange",this.setSchema,this);this.setLayer();return true;}},getPageExtent:function(){if(this.pagingType===gxp.plugins.FeatureManager.QUADTREE_PAGING){return this.page.extent;}else{return this.featureStore.layer.getDataExtent();}},setLayer:function(layerRecord){var change=this.fireEvent("beforelayerchange",this,layerRecord);if(change!==false){if(layerRecord){this.featureLayer.projection=this.getProjection(layerRecord);}
if(layerRecord!==this.layerRecord){this.clearFeatureStore();this.layerRecord=layerRecord;if(layerRecord){this.autoLoadFeatures===true?this.loadFeatures():this.setFeatureStore();}else{this.fireEvent("layerchange",this,null);}}}
return change;},setSchema:function(mgr,layer,schema){this.schema=schema;},showLayer:function(id,display){this.toolsShowingLayer[id]=display||"all";this.setLayerDisplay();},hideLayer:function(id){delete this.toolsShowingLayer[id];this.setLayerDisplay();},setLayerDisplay:function(){var show=this.visible();var map=this.target.mapPanel.map;if(show){var style=this.style[show];if(style!==this.featureLayer.styleMap.styles["default"]){this.featureLayer.styleMap.styles["default"]=style;this.featureLayer.redraw();}
this.featureLayer.setVisibility(true);map.events.on({addlayer:this.raiseLayer,scope:this});}else if(this.featureLayer.map){this.featureLayer.setVisibility(false);map.events.un({addlayer:this.raiseLayer,scope:this});}},visible:function(){var show=false;for(var i in this.toolsShowingLayer){if(show!="all"){show=this.toolsShowingLayer[i];}}
return show;},raiseLayer:function(){var map=this.featureLayer&&this.featureLayer.map;if(map){map.setLayerIndex(this.featureLayer,map.layers.length);}},loadFeatures:function(filter,callback,scope){if(this.fireEvent("beforequery",this,filter,callback,scope)!==false){this.filter=filter;this.pages=null;if(callback){var me=this;me._activeQuery&&me.un("query",me._activeQuery);this.on("query",me._activeQuery=function(tool,store){delete me._activeQuery;this.un("query",arguments.callee,this);var len=store.getCount();if(store.getCount()==0){callback.call(scope,[]);}else{this.featureLayer.events.register("featuresadded",this,function(evt){this.featureLayer.events.unregister("featuresadded",this,arguments.callee);callback.call(scope,evt.features);});}},this,{single:true});}
if(!this.featureStore){this.paging&&this.on("layerchange",function(tool,rec,schema){if(schema){this.un("layerchange",arguments.callee,this);this.setPage();}},this);this.setFeatureStore(filter,!this.paging);}else{this.featureStore.setOgcFilter(filter);if(this.paging){this.setPage();}else{this.featureStore.load();}}}},clearFeatures:function(){var store=this.featureStore;if(store){if(this.fireEvent("beforeclearfeatures",this)!==false){store.removeAll();this.fireEvent("clearfeatures",this);var proxy=store.proxy;proxy.abortRequest();if(proxy.protocol.response){proxy.protocol.response.abort();}}}},getProjection:function(record){var projection=this.target.mapPanel.map.getProjectionObject();var layerProj=record.getLayer().projection;if(layerProj&&layerProj.equals(projection)){projection=layerProj;}
return layerProj;},setFeatureStore:function(filter,autoLoad){var record=this.layerRecord;var source=this.target.getSource(record);if(source&&source instanceof gxp.plugins.WMSSource){source.getSchema(record,function(schema){if(schema===false){this.clearFeatureStore();}else{var fields=[],geometryName;var geomRegex=/gml:((Multi)?(Point|Line|Polygon|Curve|Surface|Geometry)).*/;var types={"xsd:boolean":"boolean","xsd:int":"int","xsd:integer":"int","xsd:short":"int","xsd:long":"int","xsd:date":"date","xsd:string":"string","xsd:float":"float","xsd:double":"float"};schema.each(function(r){var match=geomRegex.exec(r.get("type"));if(match){geometryName=r.get("name");this.geometryType=match[1];}else{var type=types[r.get("type")];var field={name:r.get("name"),type:types[type]};if(type=="date"){field.dateFormat="Y-m-d\\Z";}
fields.push(field);}},this);var protocolOptions={srsName:this.getProjection(record).getCode(),url:schema.url,featureType:schema.reader.raw.featureTypes[0].typeName,featureNS:schema.reader.raw.targetNamespace,geometryName:geometryName};this.hitCountProtocol=new OpenLayers.Protocol.WFS(Ext.apply({version:"1.1.0",readOptions:{output:"object"},resultType:"hits",filter:filter},protocolOptions));this.featureStore=new gxp.data.WFSFeatureStore(Ext.apply({fields:fields,proxy:{protocol:{outputFormat:this.format,multi:this.multi}},maxFeatures:this.maxFeatures,layer:this.featureLayer,ogcFilter:filter,autoLoad:autoLoad,autoSave:false,listeners:{"beforewrite":function(store,action,rs,options){this.fireEvent("beforesave",this,store,options.params);},"write":function(store,action,result,res,rs){this.redrawMatchingLayers(record);},"load":function(store,rs,options){this.fireEvent("query",this,store,this.filter);},scope:this}},protocolOptions));}
this.fireEvent("layerchange",this,record,schema);},this);}else{this.clearFeatureStore();this.fireEvent("layerchange",this,record,false);}},redrawMatchingLayers:function(record){var name=record.get("name");var source=record.get("source");this.target.mapPanel.layers.each(function(candidate){if(candidate.get("source")===source&&candidate.get("name")===name){candidate.getLayer().redraw(true);}});},clearFeatureStore:function(){if(this.featureStore){this.featureStore.removeAll();this.featureStore.unbind();this.featureStore.destroy();this.featureStore=null;this.geometryType=null;}},processPage:function(page,condition,callback,scope){condition=condition||{};var index=condition.lonLat?null:condition.index;var next=condition.next;var pages=this.pages;var i=this.pages.indexOf(page);this.setPageFilter(page);var nextOk=next?i==(pages.indexOf(next)||pages.length)-1:true;var lonLatOk=condition.lonLat?page.extent.containsLonLat(condition.lonLat):true;if(lonLatOk&&page.numFeatures&&page.numFeatures<=this.maxFeatures){callback.call(this,page);}else if(lonLatOk&&(i==index||nextOk)){this.hitCountProtocol.read({callback:function(response){var i=index,lonLat=condition.lonLat;if(next){i=(pages.indexOf(next)||pages.length)-1;}
if(!i&&lonLat&&page.extent.containsLonLat(lonLat)){i=pages.indexOf(page);}
page.numFeatures=response.numberOfFeatures;if(this.page){return;}
if(page.numFeatures>this.maxFeatures){this.createLeaf(page,Ext.applyIf({index:i,next:next},condition),callback,scope);}else if(page.numFeatures==0&&pages.length>1){pages.remove(page);condition.allowEmpty===false&&this.setPage({index:index%this.pages.length,allowEmpty:false});}else if(this.pages.indexOf(page)==i){callback.call(this,page);}},scope:this});}},createLeaf:function(page,condition,callback,scope){condition=condition||{};var layer=this.layerRecord.getLayer();var pageIndex=this.pages.indexOf(page);this.pages.remove(page);var extent=page.extent;var center=extent.getCenterLonLat();var l=[extent.left,center.lon,extent.left,center.lon];var b=[center.lat,center.lat,extent.bottom,extent.bottom];var r=[center.lon,extent.right,center.lon,extent.right];var t=[extent.top,extent.top,center.lat,center.lat];var i,leaf;for(i=3;i>=0;--i){leaf={extent:new OpenLayers.Bounds(l[i],b[i],r[i],t[i])};this.pages.splice(pageIndex,0,leaf);this.processPage(leaf,condition,callback,scope);}},getPagingExtent:function(meth){var layer=this.layerRecord.getLayer();var filter=this.getSpatialFilter();var extent=filter?filter.value:this.target.mapPanel.map[meth]();if(extent&&layer.maxExtent){if(extent.containsBounds(layer.maxExtent)){extent=layer.maxExtent;}}
return extent;},getSpatialFilter:function(){var filter;if(this.filter instanceof OpenLayers.Filter.Spatial&&this.filter.type===OpenLayers.Filter.Spatial.BBOX){filter=this.filter;}else if(this.filter instanceof OpenLayers.Filter.Logical&&this.filter.type===OpenLayers.Filter.Logical.AND){for(var f,i=this.filter.filters.length-1;i>=0;--i){f=this.filter.filters[i];if(f instanceof OpenLayers.Filter.Spatial&&f.type===OpenLayers.Filter.Spatial.BBOX){filter=f;break;}}}
return filter;},setPageFilter:function(page){var filter;if(page.extent){var bboxFilter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.BBOX,property:this.featureStore.geometryName,value:page.extent});filter=this.filter?new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND,filters:[this.filter,bboxFilter]}):bboxFilter;}else{filter=this.filter;}
this.featureStore.setOgcFilter(filter);this.hitCountProtocol.filter=filter;this.hitCountProtocol.options.filter=filter;return filter;},nextPage:function(callback,scope){var index;if(this.pagingType===gxp.plugins.FeatureManager.QUADTREE_PAGING){var page=this.page;this.page=null;index=(this.pages.indexOf(page)+1)%this.pages.length;}else{index=this.pageIndex+1%this.numPages;}
this.setPage({index:index,allowEmpty:false},callback,scope);},previousPage:function(callback,scope){var index;if(this.pagingType===gxp.plugins.FeatureManager.QUADTREE_PAGING){index=this.pages.indexOf(this.page)-1;if(index<0){index=this.pages.length-1;}}else{index=this.pageIndex-1;if(index<0){index=this.numPages-1;}}
this.setPage({index:index,allowEmpty:false,next:this.page},callback);},setPage:function(condition,callback,scope){if(this.pagingType===gxp.plugins.FeatureManager.QUADTREE_PAGING){if(this.filter instanceof OpenLayers.Filter.FeatureId){this.featureStore.load({callback:function(){callback&&callback.call(scope);}});return;}
if(this.fireEvent("beforesetpage",this,condition,callback,scope)!==false){if(!condition){var extent=this.getPagingExtent("getExtent");var lonLat=new OpenLayers.LonLat(extent.left,extent.top);var maxExtent=this.target.mapPanel.map.getMaxExtent();if(!maxExtent.containsLonLat(lonLat,true)){lonLat=new OpenLayers.LonLat(maxExtent.left,maxExtent.top);}
condition={lonLat:lonLat,allowEmpty:false};}
condition.index=condition.index||0;if(condition.index=="last"){condition.index=this.pages.length-1;condition.next=this.pages[0];}
this.page=null;if(!this.pages){var layer=this.layerRecord.getLayer();var queryExtent=this.getPagingExtent("getMaxExtent");this.pages=[{extent:queryExtent}];condition.index=0;}else if(condition.lonLat){for(var i=this.pages.length-1;i>=0;--i){if(this.pages[i].extent.containsLonLat(condition.lonLat)){condition.index=i;break;}}}
this.processPage(this.pages[condition.index],condition,function(page){var map=this.target.mapPanel.map;this.page=page;this.setPageFilter(page);if(this.autoZoomPage&&!map.getExtent().containsLonLat(page.extent.getCenterLonLat())){map.zoomToExtent(page.extent);}
var pageIndex=this.pages.indexOf(this.page);this.fireEvent("setpage",this,condition,callback,scope,pageIndex,this.pages.length);this.featureStore.load({callback:function(){callback&&callback.call(scope,page);}});},this);}}else{if(this.fireEvent("beforesetpage",this,condition,callback,scope)!==false){if(!condition){this.hitCountProtocol.read({filter:this.filter,callback:function(response){this.numberOfFeatures=response.numberOfFeatures;this.numPages=Math.ceil(this.numberOfFeatures/this.maxFeatures);this.pageIndex=0;this.fireEvent("setpage",this,condition,callback,scope,this.pageIndex,this.numPages);this.featureStore.load({output:"object",callback:function(){callback&&callback.call(scope);}});},scope:this});}else{if(condition.index!=null){if(condition.index==="last"){this.pageIndex=this.numPages-1;}else if(condition.index==="first"){this.pageIndex=0;}else{this.pageIndex=condition.index;}
var startIndex=this.pageIndex*this.maxFeatures;this.fireEvent("setpage",this,condition,callback,scope,this.pageIndex,this.numPages);this.featureStore.load({startIndex:startIndex,callback:function(){callback&&callback.call(scope);}});}}}}}});gxp.plugins.FeatureManager.QUADTREE_PAGING=0;gxp.plugins.FeatureManager.WFS_PAGING=1;Ext.preg(gxp.plugins.FeatureManager.prototype.ptype,gxp.plugins.FeatureManager);Ext.namespace("gxp.plugins");gxp.plugins.ClickableFeatures=Ext.extend(gxp.plugins.Tool,{featureManager:null,toleranceParameters:["BUFFER","RADIUS"],noFeatureClick:function(evt){if(!this.selectControl){this.selectControl=new OpenLayers.Control.SelectFeature(this.target.tools[this.featureManager].featureLayer);}
var evtLL=this.target.mapPanel.map.getLonLatFromPixel(evt.xy);var featureManager=this.target.tools[this.featureManager];var page=featureManager.page;if(featureManager.visible()=="all"&&featureManager.paging&&page&&page.extent.containsLonLat(evtLL)){return;}
var layer=featureManager.layerRecord&&featureManager.layerRecord.getLayer();if(!layer){return;}
var map=this.target.mapPanel.map;var size=map.getSize();var params=Ext.applyIf({REQUEST:"GetFeatureInfo",BBOX:map.getExtent().toBBOX(),WIDTH:size.w,HEIGHT:size.h,X:parseInt(evt.xy.x),Y:parseInt(evt.xy.y),QUERY_LAYERS:layer.params.LAYERS,INFO_FORMAT:"application/vnd.ogc.gml",EXCEPTIONS:"application/vnd.ogc.se_xml",FEATURE_COUNT:1},layer.params);if(typeof this.tolerance==="number"){for(var i=0,ii=this.toleranceParameters.length;i<ii;++i){params[this.toleranceParameters[i]]=this.tolerance;}}
var projection=map.getProjectionObject();var layerProj=layer.projection;if(layerProj&&layerProj.equals(projection)){projection=layerProj;}
if(parseFloat(layer.params.VERSION)>=1.3){params.CRS=projection.getCode();}else{params.SRS=projection.getCode();}
var store=new GeoExt.data.FeatureStore({fields:{},proxy:new GeoExt.data.ProtocolProxy({protocol:new OpenLayers.Protocol.HTTP({url:(typeof layer.url==="string")?layer.url:layer.url[0],params:params,format:new OpenLayers.Format.WMSGetFeatureInfo()})}),autoLoad:true,listeners:{"load":function(store,records){if(records.length>0){var fid=records[0].get("fid");var filter=new OpenLayers.Filter.FeatureId({fids:[fid]});var autoLoad=function(){featureManager.loadFeatures(filter,function(features){if(features.length){this.autoLoadedFeature=features[0];this.select(features[0]);}},this);}.createDelegate(this);var feature=featureManager.featureLayer.getFeatureByFid(fid);if(feature){this.select(feature);}else if(featureManager.paging&&featureManager.pagingType===gxp.plugins.FeatureManager.QUADTREE_PAGING){var lonLat=this.target.mapPanel.map.getLonLatFromPixel(evt.xy);featureManager.setPage({lonLat:lonLat},function(){var feature=featureManager.featureLayer.getFeatureByFid(fid);if(feature){this.select(feature);}else if(this.autoLoadFeatures===true){autoLoad();}},this);}else{autoLoad();}}},scope:this}});},select:function(feature){this.selectControl.unselectAll();this.selectControl.select(feature);}});Ext.namespace("gxp");gxp.FeatureEditPopup=Ext.extend(GeoExt.Popup,{closeMsgTitle:'Save Changes?',closeMsg:'This feature has unsaved changes. Would you like to save your changes?',deleteMsgTitle:'Delete Feature?',deleteMsg:'Are you sure you want to delete this feature?',editButtonText:'Edit',editButtonTooltip:'Make this feature editable',deleteButtonText:'Delete',deleteButtonTooltip:'Delete this feature',cancelButtonText:'Cancel',cancelButtonTooltip:'Stop editing, discard changes',saveButtonText:'Save',saveButtonTooltip:'Save changes',layout:"fit",feature:null,schema:null,readOnly:false,allowDelete:false,editing:false,grid:null,modifyControl:null,geometry:null,attributes:null,cancelButton:null,saveButton:null,editButton:null,deleteButton:null,initComponent:function(){this.addEvents("featuremodified","canceledit","cancelclose");if(!this.dateFormat){this.dateFormat=Ext.form.DateField.prototype.format;}
if(!this.timeFormat){this.timeFormat=Ext.form.TimeField.prototype.format;}
var feature=this.feature;if(feature instanceof GeoExt.data.FeatureRecord){feature=this.feature=feature.getFeature();}
if(!this.location){this.location=feature;}
this.anchored=!this.editing;var customEditors={};var customRenderers={};if(this.schema){var attributes={};if(this.fields){if(!this.excludeFields){this.excludeFields=[];}
for(var i=0,ii=this.fields.length;i<ii;++i){attributes[this.fields[i]]=null;}}
var ucFields=this.fields?this.fields.join(",").toUpperCase().split(","):[];this.schema.each(function(r){var type=r.get("type");if(type.match(/^[^:]*:?((Multi)?(Point|Line|Polygon|Curve|Surface|Geometry))/)){return;}
var name=r.get("name");if(this.fields){if(ucFields.indexOf(name.toUpperCase())==-1){this.excludeFields.push(name);}}
var value=feature.attributes[name];var fieldCfg=GeoExt.form.recordToField(r);var listeners;if(typeof value=="string"){var format;switch(type.split(":").pop()){case"date":format=this.dateFormat;fieldCfg.editable=false;break;case"dateTime":if(!format){format=this.dateFormat+" "+this.timeFormat;fieldCfg.editable=true;}
fieldCfg.format=format;listeners={"startedit":function(el,value){if(!(value instanceof Date)){var date=Date.parseDate(value.replace(/Z$/,""),"c");if(date){this.setValue(date);}}}};customRenderers[name]=(function(){return function(value){var date=value;if(typeof value=="string"){date=Date.parseDate(value.replace(/Z$/,""),"c");}
return date?date.format(format):value;};})();break;case"boolean":listeners={"startedit":function(el,value){this.setValue(Boolean(value));}};break;}}
customEditors[name]=new Ext.grid.GridEditor({field:Ext.create(fieldCfg),listeners:listeners});attributes[name]=value;},this);feature.attributes=attributes;}
if(!this.title&&feature.fid){this.title=feature.fid;}
this.editButton=new Ext.Button({text:this.editButtonText,tooltip:this.editButtonTooltip,iconCls:"edit",handler:this.startEditing,scope:this});this.deleteButton=new Ext.Button({text:this.deleteButtonText,tooltip:this.deleteButtonTooltip,iconCls:"delete",hidden:!this.allowDelete,handler:this.deleteFeature,scope:this});this.cancelButton=new Ext.Button({text:this.cancelButtonText,tooltip:this.cancelButtonTooltip,iconCls:"cancel",hidden:true,handler:function(){this.stopEditing(false);},scope:this});this.saveButton=new Ext.Button({text:this.saveButtonText,tooltip:this.saveButtonTooltip,iconCls:"save",hidden:true,handler:function(){this.stopEditing(true);},scope:this});var ucExcludeFields=this.excludeFields?this.excludeFields.join(",").toUpperCase().split(","):[];this.grid=new Ext.grid.PropertyGrid({border:false,source:feature.attributes,customEditors:customEditors,customRenderers:customRenderers,propertyNames:this.propertyNames,viewConfig:{forceFit:true,getRowClass:function(record){if(ucExcludeFields.indexOf(record.get("name").toUpperCase())!==-1){return"x-hide-nosize";}}},listeners:{"beforeedit":function(){return this.editing;},"propertychange":function(){this.setFeatureState(this.getDirtyState());},scope:this},initComponent:function(){var origSort=Ext.data.Store.prototype.sort;Ext.data.Store.prototype.sort=function(){};Ext.grid.PropertyGrid.prototype.initComponent.apply(this,arguments);Ext.data.Store.prototype.sort=origSort;}});this.grid.propStore.isEditableValue=function(){return true;};this.items=[this.grid];this.bbar=new Ext.Toolbar({hidden:this.readOnly,items:[this.editButton,this.deleteButton,this.saveButton,this.cancelButton]});gxp.FeatureEditPopup.superclass.initComponent.call(this);this.on({"show":function(){if(this.editing){this.editing=null;this.startEditing();}},"beforeclose":function(){if(!this.editing){return;}
if(this.feature.state===this.getDirtyState()){Ext.Msg.show({title:this.closeMsgTitle,msg:this.closeMsg,buttons:Ext.Msg.YESNOCANCEL,fn:function(button){if(button&&button!=="cancel"){this.stopEditing(button==="yes");this.close();}else{this.fireEvent("cancelclose",this);}},scope:this,icon:Ext.MessageBox.QUESTION,animEl:this.getEl()});return false;}else{this.stopEditing(false);}},scope:this});},getDirtyState:function(){return this.feature.state===OpenLayers.State.INSERT?this.feature.state:OpenLayers.State.UPDATE;},startEditing:function(){if(!this.editing){this.editing=true;this.anc&&this.unanchorPopup();this.editButton.hide();this.deleteButton.hide();this.saveButton.show();this.cancelButton.show();this.geometry=this.feature.geometry.clone();this.attributes=Ext.apply({},this.feature.attributes);this.modifyControl=new OpenLayers.Control.ModifyFeature(this.feature.layer,{standalone:true,vertexRenderIntent:this.vertexRenderIntent});this.feature.layer.map.addControl(this.modifyControl);this.modifyControl.activate();this.modifyControl.selectFeature(this.feature);}},stopEditing:function(save){if(this.editing){this.modifyControl.deactivate();this.modifyControl.destroy();var feature=this.feature;if(feature.state===this.getDirtyState()){if(save===true){if(this.schema){var attribute,rec;for(var i in feature.attributes){rec=this.schema.getAt(this.schema.findExact("name",i));attribute=feature.attributes[i];if(attribute instanceof Date){var type=rec.get("type").split(":").pop();feature.attributes[i]=attribute.format(type=="date"?"Y-m-d":"c");}}}
this.fireEvent("featuremodified",this,feature);}else if(feature.state===OpenLayers.State.INSERT){this.editing=false;feature.layer.destroyFeatures([feature]);this.fireEvent("canceledit",this,null);this.close();}else{var layer=feature.layer;layer.drawFeature(feature,{display:"none"});feature.geometry=this.geometry;feature.attributes=this.attributes;this.setFeatureState(null);this.grid.setSource(feature.attributes);layer.drawFeature(feature);this.fireEvent("canceledit",this,feature);}}
if(!this.isDestroyed){this.cancelButton.hide();this.saveButton.hide();this.editButton.show();this.allowDelete&&this.deleteButton.show();}
this.editing=false;}},deleteFeature:function(){Ext.Msg.show({title:this.deleteMsgTitle,msg:this.deleteMsg,buttons:Ext.Msg.YESNO,fn:function(button){if(button==="yes"){this.setFeatureState(OpenLayers.State.DELETE);this.fireEvent("featuremodified",this,this.feature);this.close();}},scope:this,icon:Ext.MessageBox.QUESTION,animEl:this.getEl()});},setFeatureState:function(state){this.feature.state=state;var layer=this.feature.layer;layer&&layer.events.triggerEvent("featuremodified",{feature:this.feature});}});Ext.reg('gxp_featureeditpopup',gxp.FeatureEditPopup);Ext.namespace("gxp.plugins");gxp.plugins.FeatureEditor=Ext.extend(gxp.plugins.ClickableFeatures,{ptype:"gxp_featureeditor",iconClsAdd:"gxp-icon-addfeature",iconClsEdit:"gxp-icon-editfeature",exceptionTitle:"Save Failed",exceptionText:"Trouble saving features",createFeatureActionTip:"Create a new feature",editFeatureActionTip:"Edit existing feature",outputTarget:"map",snappingAgent:null,readOnly:false,modifyOnly:false,autoLoadFeatures:false,showSelectedOnly:true,drawControl:null,popup:null,autoLoadedFeature:null,schema:null,constructor:function(config){this.addEvents("layereditable","featureeditable");gxp.plugins.FeatureEditor.superclass.constructor.apply(this,arguments);},addActions:function(){var popup;var featureManager=this.getFeatureManager();var featureLayer=featureManager.featureLayer;var intercepting=false;function intercept(mgr,fn){var fnArgs=Array.prototype.slice.call(arguments);fnArgs.splice(0,2);if(!intercepting&&popup&&!popup.isDestroyed){if(popup.editing){function doIt(){intercepting=true;unregisterDoIt.call(this);if(fn==="setLayer"){this.target.selectLayer(fnArgs[0]);}else if(fn==="clearFeatures"){window.setTimeout(function(){mgr[fn].call(mgr);});}else{mgr[fn].apply(mgr,fnArgs);}}
function unregisterDoIt(){featureManager.featureStore.un("write",doIt,this);popup.un("canceledit",doIt,this);popup.un("cancelclose",unregisterDoIt,this);}
featureManager.featureStore.on("write",doIt,this);popup.on({canceledit:doIt,cancelclose:unregisterDoIt,scope:this});popup.close();}
return!popup.editing;}
intercepting=false;}
featureManager.on({"beforequery":intercept.createDelegate(this,"loadFeatures",1),"beforelayerchange":intercept.createDelegate(this,"setLayer",1),"beforesetpage":intercept.createDelegate(this,"setPage",1),"beforeclearfeatures":intercept.createDelegate(this,"clearFeatures",1),scope:this});this.drawControl=new OpenLayers.Control.DrawFeature(featureLayer,OpenLayers.Handler.Point,{eventListeners:{featureadded:function(evt){if(this.autoLoadFeatures===true){this.autoLoadedFeature=evt.feature;}},activate:function(){featureManager.showLayer(this.id,this.showSelectedOnly&&"selected");},deactivate:function(){featureManager.hideLayer(this.id);},scope:this}});this.selectControl=new OpenLayers.Control.SelectFeature(featureLayer,{clickout:false,multipleKey:"fakeKey",unselect:function(){if(!featureManager.featureStore.getModifiedRecords().length){OpenLayers.Control.SelectFeature.prototype.unselect.apply(this,arguments);}},eventListeners:{"activate":function(){if(this.autoLoadFeatures===true||featureManager.paging){this.target.mapPanel.map.events.register("click",this,this.noFeatureClick);}
featureManager.showLayer(this.id,this.showSelectedOnly&&"selected");this.selectControl.unselectAll(popup&&popup.editing&&{except:popup.feature});},"deactivate":function(){if(this.autoLoadFeatures===true||featureManager.paging){this.target.mapPanel.map.events.unregister("click",this,this.noFeatureClick);}
if(popup){if(popup.editing){popup.on("cancelclose",function(){this.selectControl.activate();},this,{single:true});}
popup.on("close",function(){featureManager.hideLayer(this.id);},this,{single:true});popup.close();}else{featureManager.hideLayer(this.id);}},scope:this}});featureLayer.events.on({"beforefeatureremoved":function(evt){if(this.popup&&evt.feature===this.popup.feature){this.selectControl.unselect(evt.feature);}},"featureunselected":function(evt){var feature=evt.feature;if(feature){this.fireEvent("featureeditable",this,feature,false);}
if(popup&&!popup.hidden){popup.close();}},"beforefeatureselected":function(evt){if(popup){return!popup.editing;}},"featureselected":function(evt){var feature=evt.feature;if(feature){this.fireEvent("featureeditable",this,feature,true);}
var featureStore=featureManager.featureStore;if(this.selectControl.active&&feature.geometry!==null){if(this.readOnly===false){this.selectControl.deactivate();featureManager.showLayer(this.id,this.showSelectedOnly&&"selected");}
popup=this.addOutput({xtype:"gxp_featureeditpopup",collapsible:true,feature:featureStore.getByFeature(feature),vertexRenderIntent:"vertex",readOnly:this.readOnly,fields:this.fields,excludeFields:this.excludeFields,editing:feature.state===OpenLayers.State.INSERT,schema:this.schema,allowDelete:true,width:200,height:250,listeners:{"close":function(){if(this.readOnly===false){this.selectControl.activate();}
if(feature.layer&&feature.layer.selectedFeatures.indexOf(feature)!==-1){this.selectControl.unselect(feature);}
if(feature===this.autoLoadedFeature){if(feature.layer){feature.layer.removeFeatures([evt.feature]);}
this.autoLoadedFeature=null;}},"featuremodified":function(popup,feature){popup.disable();featureStore.on({write:{fn:function(){if(popup&&popup.isVisible()){popup.enable();}
var layer=featureManager.layerRecord;this.target.fireEvent("featureedit",featureManager,{name:layer.get("name"),source:layer.get("source")});},single:true},exception:{fn:function(proxy,type,action,options,response,records){var msg=this.exceptionText;if(type==="remote"){if(response.exceptionReport){msg=gxp.util.getOGCExceptionText(response.exceptionReport);}}else{msg="Status: "+response.status;}
featureManager.fireEvent("exception",featureManager,response.exceptionReport||{},msg,records);if(featureManager.hasListener("exception")===false&&featureStore.hasListener("exception")===false){Ext.Msg.show({title:this.exceptionTitle,msg:msg,icon:Ext.MessageBox.ERROR,buttons:{ok:true}});}
if(popup&&popup.isVisible()){popup.enable();popup.startEditing();}},single:true},scope:this});if(feature.state===OpenLayers.State.DELETE){featureStore._removing=true;featureStore.remove(featureStore.getRecordFromFeature(feature));delete featureStore._removing;}
featureStore.save();},"canceledit":function(popup,feature){featureStore.commitChanges();},scope:this}});this.popup=popup;}},"sketchcomplete":function(evt){featureManager.featureLayer.events.register("featuresadded",this,function(evt){featureManager.featureLayer.events.unregister("featuresadded",this,arguments.callee);this.drawControl.deactivate();this.selectControl.activate();this.selectControl.select(evt.features[0]);});},scope:this});var toggleGroup=this.toggleGroup||Ext.id();var actions=gxp.plugins.FeatureEditor.superclass.addActions.call(this,[new GeoExt.Action({tooltip:this.createFeatureActionTip,text:this.createFeatureActionText,iconCls:this.iconClsAdd,disabled:true,hidden:this.modifyOnly||this.readOnly,toggleGroup:toggleGroup,enableToggle:true,allowDepress:true,control:this.drawControl,deactivateOnDisable:true,map:this.target.mapPanel.map}),new GeoExt.Action({tooltip:this.editFeatureActionTip,text:this.editFeatureActionText,iconCls:this.iconClsEdit,disabled:true,toggleGroup:toggleGroup,enableToggle:true,allowDepress:true,control:this.selectControl,deactivateOnDisable:true,map:this.target.mapPanel.map})]);featureManager.on("layerchange",this.onLayerChange,this);var snappingAgent=this.getSnappingAgent();if(snappingAgent){snappingAgent.registerEditor(this);}
return actions;},getFeatureManager:function(){var manager=this.target.tools[this.featureManager];if(!manager){throw new Error("Unable to access feature manager by id: "+this.featureManager);}
return manager;},getSnappingAgent:function(){var agent;var snapId=this.snappingAgent;if(snapId){agent=this.target.tools[snapId];if(!agent){throw new Error("Unable to locate snapping agent with id: "+snapId);}}
return agent;},onLayerChange:function(mgr,layer,schema){this.schema=schema;var disable=!schema||!this.target.isAuthorized();this.actions[0].setDisabled(disable);this.actions[1].setDisabled(disable);if(disable){this.fireEvent("layereditable",this,layer,false);return;}
var control=this.drawControl;var button=this.actions[0];var handlers={"Point":OpenLayers.Handler.Point,"Line":OpenLayers.Handler.Path,"Curve":OpenLayers.Handler.Path,"Polygon":OpenLayers.Handler.Polygon,"Surface":OpenLayers.Handler.Polygon};var simpleType=mgr.geometryType.replace("Multi","");var Handler=handlers[simpleType];if(Handler){var active=control.active;if(active){control.deactivate();}
control.handler=new Handler(control,control.callbacks,Ext.apply(control.handlerOptions,{multi:(simpleType!=mgr.geometryType)}));if(active){control.activate();}
button.enable();}else{button.disable();}
this.fireEvent("layereditable",this,layer,true);},select:function(feature){this.selectControl.unselectAll(this.popup&&this.popup.editing&&{except:this.popup.feature});this.selectControl.select(feature);}});Ext.preg(gxp.plugins.FeatureEditor.prototype.ptype,gxp.plugins.FeatureEditor);Ext.namespace("gxp.plugins");gxp.plugins.ArcRestSource=Ext.extend(gxp.plugins.LayerSource,{ptype:"gxp_arcrestsource",constructor:function(config){this.config=config;gxp.plugins.ArcRestSource.superclass.constructor.apply(this,arguments);},createStore:function(){var baseUrl=this.url.split("?")[0];var source=this;var processResult=function(response){var json=Ext.decode(response.responseText);var layerProjection=source.getArcProjection(json.spatialReference.wkid);var layers=[];if(layerProjection!=null){for(var l=0;l<json.layers.length;l++){var layer=json.layers[l];var layerShow="show:"+layer.id;layers.push(new OpenLayers.Layer.ArcGIS93Rest(layer.name,baseUrl+"/export",{layers:layerShow,TRANSPARENT:true},{isBaseLayer:false,displayInLayerSwitcher:true,visibility:true,projection:layerProjection,queryable:json.capabilities&&json.capabilities.contains("Identify")}));}}else{processFailure(response);}
source.title=json.documentInfo.Title;source.store=new GeoExt.data.LayerStore({layers:layers,fields:[{name:"source",type:"string"},{name:"name",type:"string",mapping:"name"},{name:"group",type:"string",defaultValue:this.title},{name:"fixed",type:"boolean",defaultValue:true},{name:"queryable",type:"boolean",defaultValue:true},{name:"selected",type:"boolean"}]});source.fireEvent("ready",source);};var processFailure=function(response){Ext.Msg.alert("No Layers","Could not find any layers in a compatible projection");};Ext.Ajax.request({url:baseUrl,params:{'f':'json','pretty':'false','keepPostParams':'true'},method:'POST',success:processResult,failure:processFailure});},createLayerRecord:function(config){var record;var cmp=function(l){return l.get("name")===config.name;};if(this.target.mapPanel.layers.findBy(cmp)==-1){record=this.store.getAt(this.store.findBy(cmp)).clone();var layer=record.getLayer();if(config.title){layer.setName(config.title);record.set("title",config.title);}
if("visibility"in config){layer.visibility=config.visibility;}
if("opacity"in config){layer.opacity=config.opacity}
record.set("selected",config.selected||false);record.set("queryable",config.queryable||true)
record.set("source",config.source);record.set("name",config.name);record.set("properties","gxp_wmslayerpanel");if("group"in config){record.set("group",config.group);}
record.commit();}
return record;},getArcProjection:function(srs){var projection=this.getMapProjection();var compatibleProjection=projection;var layerSRS="EPSG:"+srs+'';if(layerSRS!==projection.getCode()){compatibleProjection=null;if((p=new OpenLayers.Projection(layerSRS)).equals(projection)){compatibleProjection=p;}}
return compatibleProjection;}});Ext.preg(gxp.plugins.ArcRestSource.prototype.ptype,gxp.plugins.ArcRestSource);(function(){function keepRaw(data){var format=this.meta.format;if(typeof data==="string"||data.nodeType){data=format.read(data);var origRead=format.read;format.read=function(){format.read=origRead;return data;};}
this.raw=data;};Ext.intercept(GeoExt.data.WMSCapabilitiesReader.prototype,"readRecords",keepRaw);GeoExt.data.AttributeReader&&Ext.intercept(GeoExt.data.AttributeReader.prototype,"readRecords",keepRaw);})();Ext.namespace("gxp.plugins");gxp.plugins.WMSSource=Ext.extend(gxp.plugins.LayerSource,{ptype:"gxp_wmssource",baseParams:null,format:null,describeLayerStore:null,describedLayers:null,schemaCache:null,ready:false,isLazy:function(){var lazy=false;var mapConfig=this.target.initialConfig.map;if(mapConfig&&mapConfig.layers){var layerConfig;for(var i=0,ii=mapConfig.layers.length;i<ii;++i){layerConfig=mapConfig.layers[i];if(layerConfig.source===this.id){lazy=this.layerConfigComplete(layerConfig);if(lazy===false){break;}}}}
return lazy;},layerConfigComplete:function(config){return this.forceLazy===true;},createStore:function(){var baseParams=this.baseParams||{SERVICE:"WMS",REQUEST:"GetCapabilities",VERSION:"1.1.1",RANDOMIZE:+"rnd"+Math.floor(Math.random()*10001)};if(this.version){baseParams.VERSION=this.version;}
var lazy=this.isLazy();this.store=new GeoExt.data.WMSCapabilitiesStore({url:this.trimUrl(this.url,baseParams),baseParams:baseParams,format:this.format,autoLoad:!lazy,layerParams:{exceptions:null},listeners:{load:function(){if(!this.store.reader.raw||!this.store.reader.raw.service){this.fireEvent("failure",this,"Invalid capabilities document.");}else{if(!this.title){this.title=this.store.reader.raw.service.title;}
if(!this.ready){this.ready=true;this.fireEvent("ready",this);}}},exception:function(proxy,type,action,options,response,error){delete this.store;var msg,details="";if(type==="response"){if(typeof error=="string"){msg=error;}else{msg="Invalid response from server.";var status=response.status;if(status>=200&&status<300){var report=error&&error.arg&&error.arg.exceptionReport;details=gxp.util.getOGCExceptionText(report);}else{details="Status: "+status;}}}else{msg="Trouble creating layer store from response.";details="Unable to handle response.";}
this.fireEvent("failure",this,msg,details);},scope:this}});if(lazy){window.setTimeout((function(){this.fireEvent("ready",this);}).createDelegate(this),0);}},trimUrl:function(url,params,respectCase){var urlParams=OpenLayers.Util.getParameters(url);params=OpenLayers.Util.upperCaseObject(params);var keys=0;for(var key in urlParams){++keys;if(key.toUpperCase()in params){--keys;delete urlParams[key];}}
return url.split("?").shift()+(keys?"?"+OpenLayers.Util.getParameterString(urlParams):"");},createLazyLayerRecord:function(config){var record=new this.store.recordType(config);record.setLayer(new OpenLayers.Layer.WMS(config.title||config.name,this.url,{layers:config.name}));if(!config.srs){record.set("srs",this.target.map.projection);}
if(!config.bbox){var bbox={};bbox[record.get("srs")]={bbox:this.target.map.maxExtent};record.set("bbox",bbox);}
return record;},createLayerRecord:function(config){var record,original;var index=this.store.findExact("name",config.name);if(index>-1){original=this.store.getAt(index);}else if(this.layerConfigComplete(config)){original=this.createLazyLayerRecord(config);}
if(original){var layer=original.getLayer();var projection=this.getMapProjection();var layerProjection=this.getProjection(original);var projCode=projection.getCode();var nativeExtent=original.get("bbox")[projCode];var swapAxis=layer.params.VERSION>="1.3"&&!!layer.yx[projCode];var maxExtent=(nativeExtent&&OpenLayers.Bounds.fromArray(nativeExtent.bbox,swapAxis))||OpenLayers.Bounds.fromArray(original.get("llbbox")).transform(new OpenLayers.Projection("EPSG:4326"),projection);if(!(1/maxExtent.getHeight()>0)||!(1/maxExtent.getWidth()>0)){maxExtent=undefined;}
var params=Ext.applyIf({STYLES:config.styles,FORMAT:config.format,TRANSPARENT:config.transparent},layer.params);var singleTile=false;if("tiled"in config){singleTile=!config.tiled;}else{if(original.data.dimensions&&original.data.dimensions.time){singleTile=true;}}
layer=new OpenLayers.Layer.WMS(config.title||layer.name,layer.url,params,{attribution:layer.attribution,maxExtent:maxExtent,restrictedExtent:maxExtent,singleTile:singleTile,ratio:config.ratio||1,visibility:("visibility"in config)?config.visibility:true,opacity:("opacity"in config)?config.opacity:1,buffer:("buffer"in config)?config.buffer:1,projection:layerProjection,dimensions:original.data.dimensions});var data=Ext.applyIf({title:layer.name,group:config.group,infoFormat:config.infoFormat,source:config.source,properties:"gxp_wmslayerpanel",fixed:config.fixed,selected:"selected"in config?config.selected:false,restUrl:this.restUrl,layer:layer},original.data);var fields=[{name:"source",type:"string"},{name:"group",type:"string"},{name:"properties",type:"string"},{name:"fixed",type:"boolean"},{name:"selected",type:"boolean"},{name:"restUrl",type:"string"},{name:"infoFormat",type:"string"}];original.fields.each(function(field){fields.push(field);});var Record=GeoExt.data.LayerRecord.create(fields);record=new Record(data,layer.id);}
return record;},getProjection:function(layerRecord){var projection=this.getMapProjection();var compatibleProjection=projection;var availableSRS=layerRecord.get("srs");if(!availableSRS[projection.getCode()]){compatibleProjection=null;var p,srs;for(srs in availableSRS){if((p=new OpenLayers.Projection(srs)).equals(projection)){compatibleProjection=p;break;}}}
return compatibleProjection;},initDescribeLayerStore:function(){var req=this.store.reader.raw.capability.request.describelayer;if(req){var version=this.store.reader.raw.version;if(parseFloat(version)>1.1){version="1.1.1";}
this.describeLayerStore=new GeoExt.data.WMSDescribeLayerStore({url:req.href,baseParams:{VERSION:version,REQUEST:"DescribeLayer"}});}},describeLayer:function(rec,callback,scope){if(!this.describeLayerStore){this.initDescribeLayerStore();}
function delayedCallback(arg){window.setTimeout(function(){callback.call(scope,arg);},0);}
if(!this.describeLayerStore){delayedCallback(false);return;}
if(!this.describedLayers){this.describedLayers={};}
var layerName=rec.getLayer().params.LAYERS;var cb=function(){var recs=Ext.isArray(arguments[1])?arguments[1]:arguments[0];var rec,name;for(var i=recs.length-1;i>=0;i--){rec=recs[i];name=rec.get("layerName");if(name==layerName){this.describeLayerStore.un("load",arguments.callee,this);this.describedLayers[name]=true;callback.call(scope,rec);return;}else if(typeof this.describedLayers[name]=="function"){var fn=this.describedLayers[name];this.describeLayerStore.un("load",fn,this);fn.apply(this,arguments);}}
delete describedLayers[layerName];callback.call(scope,false);};var describedLayers=this.describedLayers;var index;if(!describedLayers[layerName]){describedLayers[layerName]=cb;this.describeLayerStore.load({params:{LAYERS:layerName},add:true,callback:cb,scope:this});}else if((index=this.describeLayerStore.findExact("layerName",layerName))==-1){this.describeLayerStore.on("load",cb,this);}else{delayedCallback(this.describeLayerStore.getAt(index));}},getSchema:function(rec,callback,scope){if(!this.schemaCache){this.schemaCache={};}
this.describeLayer(rec,function(r){if(r&&r.get("owsType")=="WFS"){var typeName=r.get("typeName");var schema=this.schemaCache[typeName];if(schema){if(schema.getCount()==0){schema.on("load",function(){callback.call(scope,schema);},this,{single:true});}else{callback.call(scope,schema);}}else{schema=new GeoExt.data.AttributeStore({url:r.get("owsURL"),baseParams:{SERVICE:"WFS",VERSION:"1.1.0",REQUEST:"DescribeFeatureType",TYPENAME:typeName},autoLoad:true,listeners:{"load":function(){callback.call(scope,schema);},scope:this}});this.schemaCache[typeName]=schema;}}else{callback.call(scope,false);}},this);},getWFSProtocol:function(record,callback,scope){this.getSchema(record,function(schema){var protocol=false;if(schema){var geometryName;var geomRegex=/gml:((Multi)?(Point|Line|Polygon|Curve|Surface|Geometry)).*/;schema.each(function(r){var match=geomRegex.exec(r.get("type"));if(match){geometryName=r.get("name");}},this);protocol=new OpenLayers.Protocol.WFS({version:"1.1.0",srsName:record.getLayer().projection.getCode(),url:schema.url,featureType:schema.reader.raw.featureTypes[0].typeName,featureNS:schema.reader.raw.targetNamespace,geometryName:geometryName});}
callback.call(scope,protocol,schema);},this);},getConfigForRecord:function(record){var config=gxp.plugins.WMSSource.superclass.getConfigForRecord.apply(this,arguments);var layer=record.getLayer();var params=layer.params;return Ext.apply(config,{format:params.FORMAT,styles:params.STYLES,transparent:params.TRANSPARENT});},getStore:function()
{return this.store;}});Ext.preg(gxp.plugins.WMSSource.prototype.ptype,gxp.plugins.WMSSource);Ext.namespace("gxp.plugins");gxp.plugins.WMSCSource=Ext.extend(gxp.plugins.WMSSource,{ptype:"gxp_wmscsource",version:"1.1.1",constructor:function(config){config.baseParams={SERVICE:"WMS",REQUEST:"GetCapabilities",TILED:true};gxp.plugins.WMSCSource.superclass.constructor.apply(this,arguments);this.format=new OpenLayers.Format.WMSCapabilities({profile:'WMSC'});},createLayerRecord:function(config){var record=gxp.plugins.WMSCSource.superclass.createLayerRecord.apply(this,arguments);if(!record){return;}
var caps;if(this.store.reader.raw){caps=this.store.reader.raw.capability;}
var tileSets=(caps&&caps.vendorSpecific&&caps.vendorSpecific)?caps.vendorSpecific.tileSets:null;var layer=record.get("layer");if(tileSets!==null){var mapProjection=this.getMapProjection();for(var i=0,len=tileSets.length;i<len;i++){var tileSet=tileSets[i];if(tileSet.layers===layer.params.LAYERS){var tileProjection;for(var srs in tileSet.srs){tileProjection=new OpenLayers.Projection(srs);break;}
if(mapProjection.equals(tileProjection)){var bbox=tileSet.bbox[srs].bbox;layer.projection=tileProjection;layer.addOptions({resolutions:tileSet.resolutions,tileSize:new OpenLayers.Size(tileSet.width,tileSet.height),tileOrigin:new OpenLayers.LonLat(bbox[0],bbox[1])});layer.params.TILED=(config.cached!==false)&&true;break;}}}}else if(this.forceLazy===true&&config.cached===true){layer.params.TILED=true;}
return record;},getConfigForRecord:function(record){var config=gxp.plugins.WMSCSource.superclass.getConfigForRecord.apply(this,arguments);return Ext.apply(config,{cached:!!record.getLayer().params.TILED});},getStore:function()
{return this.store;}});Ext.preg(gxp.plugins.WMSCSource.prototype.ptype,gxp.plugins.WMSCSource);Ext.namespace("gxp.plugins");gxp.plugins.GoogleSource=Ext.extend(gxp.plugins.LayerSource,{ptype:"gxp_googlesource",timeout:7000,title:"Google Layers",roadmapAbstract:"Show street map",satelliteAbstract:"Show satellite imagery",hybridAbstract:"Show imagery with street names",terrainAbstract:"Show street map with terrain",constructor:function(config){this.config=config;gxp.plugins.GoogleSource.superclass.constructor.apply(this,arguments);},createStore:function(){gxp.plugins.GoogleSource.loader.onLoad({timeout:this.timeout,callback:this.syncCreateStore,errback:function(){delete this.store;this.fireEvent("failure",this,"The Google Maps script failed to load within the provided timeout ("+(this.timeout/1000)+" s).");},scope:this});},syncCreateStore:function(){var mapTypes={"ROADMAP":{"abstract":this.roadmapAbstract,MAX_ZOOM_LEVEL:20},"SATELLITE":{"abstract":this.satelliteAbstract},"HYBRID":{"abstract":this.hybridAbstract},"TERRAIN":{"abstract":this.terrainAbstract,MAX_ZOOM_LEVEL:15}};var layers=[];var name,mapType;for(name in mapTypes){mapType=google.maps.MapTypeId[name];layers.push(new OpenLayers.Layer.Google("Google "+mapType.replace(/\w/,function(c){return c.toUpperCase();}),{type:mapType,typeName:name,MAX_ZOOM_LEVEL:mapTypes[name].MAX_ZOOM_LEVEL,maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),restrictedExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),projection:this.projection}));}
this.store=new GeoExt.data.LayerStore({layers:layers,fields:[{name:"source",type:"string"},{name:"name",type:"string",mapping:"typeName"},{name:"abstract",type:"string"},{name:"group",type:"string",defaultValue:"background"},{name:"fixed",type:"boolean",defaultValue:true},{name:"selected",type:"boolean"}]});this.store.each(function(l){l.set("abstract",mapTypes[l.get("name")]["abstract"]);});this.fireEvent("ready",this);},createLayerRecord:function(config){var record;var cmp=function(l){return l.get("name")===config.name;};if(this.target.mapPanel.layers.findBy(cmp)==-1){record=this.store.getAt(this.store.findBy(cmp)).clone();var layer=record.getLayer();if(config.title){layer.setName(config.title);record.set("title",config.title);}
if("visibility"in config){layer.visibility=config.visibility;}
record.set("selected",config.selected||false);record.set("source",config.source);record.set("name",config.name);if("group"in config){record.set("group",config.group);}
record.commit();}
return record;}});gxp.plugins.GoogleSource.loader=new(Ext.extend(Ext.util.Observable,{ready:!!(window.google&&google.maps),loading:false,constructor:function(){this.addEvents("ready","failure");return Ext.util.Observable.prototype.constructor.apply(this,arguments);},onScriptLoad:function(){var monitor=gxp.plugins.GoogleSource.loader;if(!monitor.ready){monitor.ready=true;monitor.loading=false;monitor.fireEvent("ready");}},onLoad:function(options){if(this.ready){window.setTimeout(function(){options.callback.call(options.scope);},0);}else if(!this.loading){this.loadScript(options);}else{this.on({ready:options.callback,failure:options.errback||Ext.emptyFn,scope:options.scope});}},loadScript:function(options){var params={autoload:Ext.encode({modules:[{name:"maps",version:3.3,nocss:"true",callback:"gxp.plugins.GoogleSource.loader.onScriptLoad",other_params:"sensor=false"}]})};var script=document.createElement("script");script.src="http://www.google.com/jsapi?"+Ext.urlEncode(params);var errback=options.errback||Ext.emptyFn;var timeout=options.timeout||gxp.plugins.GoogleSource.prototype.timeout;window.setTimeout((function(){if(!gxp.plugins.GoogleSource.loader.ready){this.loading=false;this.ready=false;document.getElementsByTagName("head")[0].removeChild(script);errback.call(options.scope);this.fireEvent("failure");this.purgeListeners();}}).createDelegate(this),timeout);this.on({ready:options.callback,scope:options.scope});this.loading=true;document.getElementsByTagName("head")[0].appendChild(script);}}))();Ext.preg(gxp.plugins.GoogleSource.prototype.ptype,gxp.plugins.GoogleSource);Ext.namespace("gxp.plugins");gxp.plugins.OLSource=Ext.extend(gxp.plugins.LayerSource,{ptype:"gxp_olsource",createLayerRecord:function(config){var record;var Class=window;var parts=config.type.split(".");for(var i=0,ii=parts.length;i<ii;++i){Class=Class[parts[i]];if(!Class){break;}}
if(Class&&Class.prototype&&Class.prototype.initialize){var Constructor=function(){Class.prototype.initialize.apply(this,config.args);};Constructor.prototype=Class.prototype;var layer=new Constructor();if("visibility"in config){layer.visibility=config.visibility;}
var Record=GeoExt.data.LayerRecord.create([{name:"name",type:"string"},{name:"source",type:"string"},{name:"group",type:"string"},{name:"fixed",type:"boolean"},{name:"selected",type:"boolean"},{name:"type",type:"string"},{name:"args"}]);var data={layer:layer,title:layer.name,name:config.name||layer.name,source:config.source,group:config.group,fixed:("fixed"in config)?config.fixed:false,selected:("selected"in config)?config.selected:false,type:config.type,args:config.args,properties:("properties"in config)?config.properties:undefined};record=new Record(data,layer.id);}else{throw new Error("Cannot construct OpenLayers layer from given type: "+config.type);}
return record;},getConfigForRecord:function(record){var config=gxp.plugins.OLSource.superclass.getConfigForRecord.apply(this,arguments);var layer=record.getLayer();return Ext.apply(config,{type:record.get("type"),args:record.get("args")});}});Ext.preg(gxp.plugins.OLSource.prototype.ptype,gxp.plugins.OLSource);Ext.namespace("gxp.plugins");gxp.plugins.StyleWriter=Ext.extend(Ext.util.Observable,{deletedStyles:null,constructor:function(config){this.initialConfig=config;Ext.apply(this,config);this.deletedStyles=[];gxp.plugins.StyleWriter.superclass.constructor.apply(this,arguments);},init:function(target){this.target=target;target.stylesStore.on({"remove":function(store,record,index){var styleName=record.get("name");record.get("name")===styleName&&this.deletedStyles.push(styleName);},scope:this});target.on({"beforesaved":this.write,scope:this});},write:function(target,options){target.stylesStore.commitChanges();target.fireEvent("saved",target,target.selectedStyle.get("name"));}});Ext.namespace("gxp.plugins");gxp.plugins.GeoServerStyleWriter=Ext.extend(gxp.plugins.StyleWriter,{baseUrl:"/geoserver/rest",constructor:function(config){this.initialConfig=config;Ext.apply(this,config);gxp.plugins.GeoServerStyleWriter.superclass.constructor.apply(this,arguments);},write:function(options){options=options||{};var dispatchQueue=[];var store=this.target.stylesStore;store.each(function(rec){(rec.phantom||store.modified.indexOf(rec)!==-1)&&this.writeStyle(rec,dispatchQueue);},this);var success=function(){this.deleteStyles();var modified=this.target.stylesStore.getModifiedRecords();for(var i=modified.length-1;i>=0;--i){modified[i].phantom=false;}
var target=this.target;target.stylesStore.commitChanges();options.success&&options.success.call(options.scope);target.fireEvent("saved",target,target.selectedStyle.get("name"));};if(dispatchQueue.length>0){gxp.util.dispatch(dispatchQueue,function(){this.assignStyles(options.defaultStyle,success);},this);}else{this.assignStyles(options.defaultStyle,success);}},writeStyle:function(styleRec,dispatchQueue){var styleName=styleRec.get("userStyle").name;dispatchQueue.push(function(callback,storage){Ext.Ajax.request({method:styleRec.phantom===true?"POST":"PUT",url:this.baseUrl+"/styles"+(styleRec.phantom===true?"":"/"+styleName+".xml"),headers:{"Content-Type":"application/vnd.ogc.sld+xml; charset=UTF-8"},xmlData:this.target.createSLD({userStyles:[styleName]}),success:styleRec.phantom===true?function(){Ext.Ajax.request({method:"POST",url:this.baseUrl+"/layers/"+
this.target.layerRecord.get("name")+"/styles.json",jsonData:{"style":{"name":styleName}},success:callback,scope:this});}:callback,scope:this});});},assignStyles:function(defaultStyle,callback){var styles=[];this.target.stylesStore.each(function(rec){if(!defaultStyle&&rec.get("userStyle").isDefault===true){defaultStyle=rec.get("name");}
if(rec.get("name")!==defaultStyle&&this.deletedStyles.indexOf(rec.id)===-1){styles.push({"name":rec.get("name")});}},this);Ext.Ajax.request({method:"PUT",url:this.baseUrl+"/layers/"+
this.target.layerRecord.get("name")+".json",jsonData:{"layer":{"defaultStyle":{"name":defaultStyle},"styles":styles.length>0?{"style":styles}:{},"enabled":true}},success:callback,scope:this});},deleteStyles:function(){var store=this.target.stylesStore;var deletedStyles=this.deletedStyles;store.each(function(rec){delRec=deletedStyles.indexOf(rec.data.name);if(delRec>-1)
{deletedStyles.splice(delRec,1);}});for(var i=0,len=this.deletedStyles.length;i<len;++i){Ext.Ajax.request({method:"DELETE",url:this.baseUrl+"/styles/"+this.deletedStyles[i]+"?purge=true"});}
this.deletedStyles=[];}});Ext.preg("gxp_geoserverstylewriter",gxp.plugins.GeoServerStyleWriter);Ext.namespace("gxp.plugins");gxp.plugins.WMSGetFeatureInfo=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_wmsgetfeatureinfo",outputTarget:"map",popupCache:null,infoActionTip:"Get Feature Info",popupTitle:"Feature Info",format:"html",addActions:function(){this.popupCache={};var actions=gxp.plugins.WMSGetFeatureInfo.superclass.addActions.call(this,[{tooltip:this.infoActionTip,iconCls:"gxp-icon-getfeatureinfo",toggleGroup:this.toggleGroup,enableToggle:true,allowDepress:true,toggleHandler:function(button,pressed){for(var i=0,len=info.controls.length;i<len;i++){if(pressed){info.controls[i].activate();}else{info.controls[i].deactivate();}}}}]);var infoButton=this.actions[0].items[0];var info={controls:[]};var updateInfo=function(){var queryableLayers=this.target.mapPanel.layers.queryBy(function(x){return x.get("queryable");});var map=this.target.mapPanel.map;var control;for(var i=0,len=info.controls.length;i<len;i++){control=info.controls[i];control.deactivate();control.destroy();}
info.controls=[];queryableLayers.each(function(x){var layer=x.getLayer();var vendorParams=Ext.apply({},this.vendorParams),param;if(this.layerParams){for(var i=this.layerParams.length-1;i>=0;--i){param=this.layerParams[i].toUpperCase();vendorParams[param]=layer.params[param];}}
var infoFormat=x.get("infoFormat");if(infoFormat===undefined){infoFormat=this.format=="html"?"text/html":"application/vnd.ogc.gml";}
var control=new OpenLayers.Control.WMSGetFeatureInfo(Ext.applyIf({url:layer.url,queryVisible:true,layers:[layer],infoFormat:infoFormat,vendorParams:vendorParams,eventListeners:{getfeatureinfo:function(evt){var title=x.get("title")||x.get("name");if(infoFormat=="text/html"){var match=evt.text.match(/<body[^>]*>([\s\S]*)<\/body>/);if(match&&!match[1].match(/^\s*$/)){this.displayPopup(evt,title,match[1]);}}else if(infoFormat=="text/plain"){this.displayPopup(evt,title,'<pre>'+evt.text+'</pre>');}else{this.displayPopup(evt,title);}},scope:this}},this.controlOptions));map.addControl(control);info.controls.push(control);if(infoButton.pressed){control.activate();}},this);};this.target.mapPanel.layers.on("update",updateInfo,this);this.target.mapPanel.layers.on("add",updateInfo,this);this.target.mapPanel.layers.on("remove",updateInfo,this);return actions;},displayPopup:function(evt,title,text){var popup;var popupKey=evt.xy.x+"."+evt.xy.y;if(!(popupKey in this.popupCache)){popup=this.addOutput({xtype:"gx_popup",title:this.popupTitle,layout:"accordion",location:evt.xy,map:this.target.mapPanel,width:250,height:300,defaults:{title:title,layout:"fit",autoScroll:true,autoWidth:true,collapsible:true},listeners:{close:(function(key){return function(panel){delete this.popupCache[key];};})(popupKey),scope:this}});this.popupCache[popupKey]=popup;}else{popup=this.popupCache[popupKey];}
var features=evt.features,config=[];if(!text&&features){var feature;for(var i=0,ii=features.length;i<ii;++i){feature=features[i];config.push({xtype:"propertygrid",title:feature.fid?feature.fid:title,source:feature.attributes});}}else if(text){config.push(Ext.applyIf({html:text},baseConfig));}
popup.add(config);popup.doLayout();}});Ext.preg(gxp.plugins.WMSGetFeatureInfo.prototype.ptype,gxp.plugins.WMSGetFeatureInfo);Ext.namespace("gxp.plugins");gxp.plugins.WMSRasterStylesDialog={isRaster:null,init:function(target){Ext.apply(target,gxp.plugins.WMSRasterStylesDialog);},createRule:function(){var symbolizers=[new OpenLayers.Symbolizer[this.isRaster?"Raster":this.symbolType]];return new OpenLayers.Rule({symbolizers:symbolizers});},addRule:function(){var legend=this.items.get(2).items.get(0);if(this.isRaster){legend.rules.push(this.createPseudoRule());legend.rules.length==1&&legend.rules.push(this.createPseudoRule());this.savePseudoRules();}else{this.selectedStyle.get("userStyle").rules.push(this.createRule());legend.update();this.selectedStyle.store.afterEdit(this.selectedStyle);}
this.updateRuleRemoveButton();},removeRule:function(){if(this.isRaster){var legend=this.items.get(2).items.get(0);var rule=this.selectedRule;legend.unselect();legend.rules.remove(rule);legend.rules.length==1&&legend.rules.remove(legend.rules[0]);this.savePseudoRules();}else{gxp.WMSStylesDialog.prototype.removeRule.apply(this,arguments);}},duplicateRule:function(){var legend=this.items.get(2).items.get(0);if(this.isRaster){legend.rules.push(this.createPseudoRule({quantity:this.selectedRule.name,label:this.selectedRule.title,color:this.selectedRule.symbolizers[0].fillColor,opacity:this.selectedRule.symbolizers[0].fillOpacity}));this.savePseudoRules();}else{var newRule=this.selectedRule.clone();newRule.name=gxp.util.uniqueName((newRule.title||newRule.name)+" (copy)");delete newRule.title;this.selectedStyle.get("userStyle").rules.push(newRule);legend.update();}
this.updateRuleRemoveButton();},editRule:function(){this.isRaster?this.editPseudoRule():gxp.WMSStylesDialog.prototype.editRule.apply(this,arguments);},editPseudoRule:function(){var me=this;var rule=this.selectedRule;var pseudoRuleDlg=new Ext.Window({title:"Color Map Entry: "+rule.name,width:340,autoHeight:true,modal:true,items:[{bodyStyle:"padding-top: 5px",border:false,defaults:{autoHeight:true,hideMode:"offsets"},items:[{xtype:"form",border:false,labelAlign:"top",defaults:{border:false},style:{"padding":"0.3em 0 0 1em"},items:[{layout:"column",defaults:{border:false,style:{"padding-right":"1em"}},items:[{layout:"form",width:70,items:[{xtype:"numberfield",anchor:"95%",value:rule.name,allowBlank:false,fieldLabel:"Quantity",validator:function(value){var rules=me.items.get(2).items.get(0).rules;for(var i=rules.length-1;i>=0;i--){if(rule!==rules[i]&&rules[i].name==value){return"Quantity "+value+" is already defined";}}
return true;},listeners:{valid:function(cmp){this.selectedRule.name=String(cmp.getValue());this.savePseudoRules();},scope:this}}]},{layout:"form",width:130,items:[{xtype:"textfield",fieldLabel:"Label",anchor:"95%",value:rule.title,listeners:{valid:function(cmp){this.selectedRule.title=cmp.getValue();this.savePseudoRules();},scope:this}}]},{layout:"form",width:70,items:[new GeoExt.FeatureRenderer({symbolType:this.symbolType,symbolizers:[rule.symbolizers[0]],isFormField:true,fieldLabel:"Appearance"})]}]}]},{xtype:"gxp_polygonsymbolizer",symbolizer:rule.symbolizers[0],bodyStyle:{"padding":"10px"},border:false,labelWidth:70,defaults:{labelWidth:70},listeners:{change:function(symbolizer){var symbolizerSwatch=pseudoRuleDlg.findByType(GeoExt.FeatureRenderer)[0];symbolizerSwatch.setSymbolizers([symbolizer],{draw:symbolizerSwatch.rendered});this.selectedRule.symbolizers[0]=symbolizer;this.savePseudoRules();},scope:this}}]}]});var strokeSymbolizer=pseudoRuleDlg.findByType("gxp_strokesymbolizer")[0];strokeSymbolizer.ownerCt.remove(strokeSymbolizer);pseudoRuleDlg.show();},savePseudoRules:function(){var style=this.selectedStyle;var legend=this.items.get(2).items.get(0);var userStyle=style.get("userStyle");var pseudoRules=legend.rules;pseudoRules.sort(function(a,b){var left=parseFloat(a.name);var right=parseFloat(b.name);return left===right?0:(left<right?-1:1);});var symbolizer=userStyle.rules[0].symbolizers[0];symbolizer.colorMap=pseudoRules.length>0?new Array(pseudoRules.length):undefined;var pseudoRule;for(var i=0,len=pseudoRules.length;i<len;++i){pseudoRule=pseudoRules[i];symbolizer.colorMap[i]={quantity:parseFloat(pseudoRule.name),label:pseudoRule.title||undefined,color:pseudoRule.symbolizers[0].fillColor||undefined,opacity:pseudoRule.symbolizers[0].fill==false?0:pseudoRule.symbolizers[0].fillOpacity};}
this.afterRuleChange(this.selectedRule);},createLegend:function(rules,options){var R=OpenLayers.Symbolizer.Raster;if(R&&rules[0]&&rules[0].symbolizers[0]instanceof R){this.getComponent("rulesfieldset").setTitle("Color Map Entries");this.isRaster=true;this.addRasterLegend(rules,options);}else{this.isRaster=false;this.addVectorLegend(rules);}},addRasterLegend:function(rules,options){options=options||{};var symbolizer=rules[0].symbolizers[0];var colorMap=symbolizer.colorMap||[];var pseudoRules=[];var colorMapEntry;for(var i=0,len=colorMap.length;i<len;i++){pseudoRules.push(this.createPseudoRule(colorMap[i]));}
this.selectedRule=options.selectedRuleIndex!=null?pseudoRules[options.selectedRuleIndex]:null;return this.addVectorLegend(pseudoRules,{symbolType:"Polygon",enableDD:false});},createPseudoRule:function(colorMapEntry){var quantity=-1;if(!colorMapEntry){var fieldset=this.items.get(2);if(fieldset.items){rules=fieldset.items.get(0).rules;for(var i=rules.length-1;i>=0;i--){quantity=Math.max(quantity,parseFloat(rules[i].name));}}}
colorMapEntry=Ext.applyIf(colorMapEntry||{},{quantity:++quantity,color:"#000000",opacity:1});return new OpenLayers.Rule({title:colorMapEntry.label,name:String(colorMapEntry.quantity),symbolizers:[new OpenLayers.Symbolizer.Polygon({fillColor:colorMapEntry.color,fillOpacity:colorMapEntry.opacity,stroke:false,fill:colorMapEntry.opacity!==0})]});},updateRuleRemoveButton:function(){this.items.get(3).items.get(1).setDisabled(!this.selectedRule||(this.isRaster===false&&this.items.get(2).items.get(0).rules.length<=1));}};Ext.preg("gxp_wmsrasterstylesdialog",gxp.plugins.WMSRasterStylesDialog);Ext.namespace("gxp.plugins");gxp.plugins.ZoomToExtent=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_zoomtoextent",menuText:"Zoom To Max Extent",tooltip:"Zoom To Max Extent",extent:null,closest:true,iconCls:"gxp-icon-zoomtoextent",closest:true,constructor:function(config){gxp.plugins.ZoomToExtent.superclass.constructor.apply(this,arguments);if(this.extent instanceof Array){this.extent=OpenLayers.Bounds.fromArray(this.extent);}},addActions:function(){return gxp.plugins.ZoomToExtent.superclass.addActions.apply(this,[{text:this.buttonText,menuText:this.menuText,iconCls:this.iconCls,tooltip:this.tooltip,handler:function(){var map=this.target.mapPanel.map;var extent=typeof this.extent=="function"?this.extent():this.extent;if(!extent){var layer,extended;for(var i=0,len=map.layers.length;i<len;++i){layer=map.layers[i];if(layer.getVisibility()){extended=layer.restrictedExtent||layer.maxExtent;if(extent){extent.extend(extended);}else if(extended){extent=extended.clone();}}}}
if(extent){var restricted=map.restrictedExtent||map.maxExtent;if(restricted){extent=new OpenLayers.Bounds(Math.max(extent.left,restricted.left),Math.max(extent.bottom,restricted.bottom),Math.min(extent.right,restricted.right),Math.min(extent.top,restricted.top));}
map.zoomToExtent(extent,this.closest);}},scope:this}]);}});Ext.preg(gxp.plugins.ZoomToExtent.prototype.ptype,gxp.plugins.ZoomToExtent);Ext.namespace("gxp.plugins");gxp.plugins.NavigationHistory=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_navigationhistory",previousMenuText:"Zoom To Previous Extent",nextMenuText:"Zoom To Next Extent",previousTooltip:"Zoom To Previous Extent",nextTooltip:"Zoom To Next Extent",constructor:function(config){gxp.plugins.NavigationHistory.superclass.constructor.apply(this,arguments);},addActions:function(){var historyControl=new OpenLayers.Control.NavigationHistory();this.target.mapPanel.map.addControl(historyControl);var actions=[new GeoExt.Action({menuText:this.previousMenuText,iconCls:"gxp-icon-zoom-previous",tooltip:this.previousTooltip,disabled:true,control:historyControl.previous}),new GeoExt.Action({menuText:this.nextMenuText,iconCls:"gxp-icon-zoom-next",tooltip:this.nextTooltip,disabled:true,control:historyControl.next})];return gxp.plugins.NavigationHistory.superclass.addActions.apply(this,[actions]);}});Ext.preg(gxp.plugins.NavigationHistory.prototype.ptype,gxp.plugins.NavigationHistory);Ext.namespace("gxp.plugins");gxp.plugins.Zoom=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_zoom",zoomInMenuText:"Zoom In",zoomOutMenuText:"Zoom Out",zoomInTooltip:"Zoom In",zoomOutTooltip:"Zoom Out",constructor:function(config){gxp.plugins.Zoom.superclass.constructor.apply(this,arguments);},addActions:function(){var actions=[{menuText:this.zoomInMenuText,iconCls:"gxp-icon-zoom-in",tooltip:this.zoomInTooltip,handler:function(){this.target.mapPanel.map.zoomIn();},scope:this},{menuText:this.zoomOutMenuText,iconCls:"gxp-icon-zoom-out",tooltip:this.zoomOutTooltip,handler:function(){this.target.mapPanel.map.zoomOut();},scope:this}];return gxp.plugins.Zoom.superclass.addActions.apply(this,[actions]);}});Ext.preg(gxp.plugins.Zoom.prototype.ptype,gxp.plugins.Zoom);Ext.namespace("gxp");gxp.NewSourceWindow=Ext.extend(Ext.Window,{title:"Add New Server...",cancelText:"Cancel",addServerText:"Add Server",addWMSText:"WMS",addArcText:"ArcGIS REST",invalidURLText:"Enter a valid URL to a WMS endpoint (e.g. http://example.com/geoserver/wms)",contactingServerText:"Contacting Server...",bodyStyle:"padding: 0px",width:300,closeAction:'hide',error:null,initComponent:function(){this.addEvents("server-added");this.urlTextField=new Ext.form.TextField({fieldLabel:"URL",allowBlank:false,width:240,msgTarget:"under",validator:this.urlValidator.createDelegate(this)});this.sourceTypeRadioList=new Ext.form.RadioGroup({fieldLabel:'Type',columns:[50,190],items:[{name:'source_type',inputValue:'gxp_wmscsource',boxLabel:this.addWMSText,checked:true},{name:'source_type',inputValue:'gxp_arcrestsource',boxLabel:this.addArcText}]});this.form=new Ext.form.FormPanel({items:[this.urlTextField,this.sourceTypeRadioList],border:false,labelWidth:30,bodyStyle:"padding: 5px",autoWidth:true,autoHeight:true});this.bbar=[new Ext.Button({text:this.cancelText,handler:function(){this.hide();},scope:this}),new Ext.Toolbar.Fill(),new Ext.Button({text:this.addServerText,iconCls:"add",handler:function(){this.error=null;if(this.urlTextField.validate()){this.fireEvent("server-added",this.urlTextField.getValue(),this.sourceTypeRadioList.getValue().inputValue);}},scope:this})];this.items=this.form;gxp.NewSourceWindow.superclass.initComponent.call(this);this.form.on("render",function(){this.loadMask=new Ext.LoadMask(this.form.getEl(),{msg:this.contactingServerText});},this);this.on("hide",function(){this.error=null;this.urlTextField.validate();this.urlTextField.setValue("");this.loadMask.hide();},this);this.on("server-added",function(url,sourceType){this.setLoading();var success=function(record){this.hide();};var failure=function(){this.setError(this.sourceLoadFailureMessage);};this.addSource(url,sourceType,success,failure,this);},this);},urlRegExp:/^(http(s)?:)?\/\/([\w%]+:[\w%]+@)?([^@\/:]+)(:\d+)?\//i,urlValidator:function(url){var valid;if(!this.urlRegExp.test(url)){valid=this.invalidURLText;}else{valid=!this.error||this.error;}
this.error=null;return valid;},setLoading:function(){this.loadMask.show();},setError:function(error){this.loadMask.hide();this.error=error;this.urlTextField.validate();},addSource:function(url,sourceType,success,failure,scope){}});Ext.namespace("gxp.plugins");gxp.plugins.AddLayers=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_addlayers",addActionMenuText:"Add layers",addActionTip:"Add layers",addServerText:"Add a New Server",addButtonText:"Add layers",untitledText:"Untitled",addLayerSourceErrorText:"Error getting WMS capabilities ({msg}).\nPlease check the url and try again.",availableLayersText:"Available Layers",expanderTemplateText:"<p><b>Abstract:</b> {abstract}</p>",panelTitleText:"Title",layerSelectionText:"View available data from:",doneText:"Done",uploadText:"Upload Data",relativeUploadOnly:true,startSourceId:null,selectedSource:null,constructor:function(config){this.addEvents("sourceselected");gxp.plugins.AddLayers.superclass.constructor.apply(this,arguments);},addActions:function(){var selectedLayer;var actions=gxp.plugins.AddLayers.superclass.addActions.apply(this,[{tooltip:this.addActionTip,text:this.addActionText,menuText:this.addActionMenuText,disabled:true,iconCls:"gxp-icon-addlayers",handler:this.showCapabilitiesGrid,scope:this}]);this.target.on("ready",function(){actions[0].enable();});return actions;},showCapabilitiesGrid:function(){if(!this.capGrid){this.initCapGrid();}
this.capGrid.show();},initCapGrid:function(){var source,data=[];for(var id in this.target.layerSources){source=this.target.layerSources[id];if(source.store){data.push([id,source.title||id]);}}
var sources=new Ext.data.ArrayStore({fields:["id","title"],data:data});var expander=this.createExpander();var addLayers=function(){var key=sourceComboBox.getValue();var layerStore=this.target.mapPanel.layers;var source=this.target.layerSources[key];var records=capGridPanel.getSelectionModel().getSelections();var record;for(var i=0,ii=records.length;i<ii;++i){record=source.createLayerRecord({name:records[i].get("name"),source:key});if(record){if(record.get("group")==="background"){layerStore.insert(0,[record]);}else{layerStore.add([record]);}}}};var idx=0;if(this.startSourceId!==null){sources.each(function(record){if(record.get("id")===this.startSourceId){idx=sources.indexOf(record);}},this);}
var store=this.target.layerSources[data[idx][0]].store;if(store.getCount()===0){store.load();}
var capGridPanel=new Ext.grid.GridPanel({store:store,autoScroll:true,flex:1,autoExpandColumn:"title",plugins:[expander],loadMask:true,colModel:new Ext.grid.ColumnModel([expander,{id:"title",header:this.panelTitleText,dataIndex:"title",sortable:true},{header:"Id",dataIndex:"name",width:150,sortable:true}]),listeners:{rowdblclick:addLayers,scope:this}});var sourceComboBox=new Ext.form.ComboBox({store:sources,valueField:"id",displayField:"title",triggerAction:"all",editable:false,allowBlank:false,forceSelection:true,mode:"local",value:data[idx][0],listeners:{select:function(combo,record,index){var source=this.target.layerSources[record.get("id")];capGridPanel.reconfigure(source.store,capGridPanel.getColumnModel());capGridPanel.getView().focusRow(0);if(source.store.getCount()===0){source.store.load();}
this.setSelectedSource(source);},scope:this}});var capGridToolbar=null;if(this.target.proxy||data.length>1){capGridToolbar=[new Ext.Toolbar.TextItem({text:this.layerSelectionText}),sourceComboBox];}
if(this.target.proxy){capGridToolbar.push("-",new Ext.Button({text:this.addServerText,iconCls:"gxp-icon-addserver",handler:function(){newSourceWindow.show();}}));}
var newSourceWindow=new gxp.NewSourceWindow({modal:true,listeners:{"server-added":function(url,sourceType){newSourceWindow.setLoading();this.target.addLayerSource({config:{url:url,ptype:sourceType},callback:function(id){var record=new sources.recordType({id:id,title:this.target.layerSources[id].title||this.untitledText});sources.insert(0,[record]);sourceComboBox.onSelect(record,0);newSourceWindow.hide();},fallback:function(source,msg){newSourceWindow.setError(new Ext.Template(this.addLayerSourceErrorText).apply({msg:msg}));},scope:this});},scope:this}});var items={xtype:"container",region:"center",layout:"vbox",items:[capGridPanel]};if(this.instructionsText){items.items.push({xtype:"box",autoHeight:true,autoEl:{tag:"p",cls:"x-form-item",style:"padding-left: 5px; padding-right: 5px"},html:this.instructionsText});}
var bbarItems=["->",new Ext.Button({text:this.addButtonText,iconCls:"gxp-icon-addlayers",handler:addLayers,scope:this}),new Ext.Button({text:this.doneText,handler:function(){this.capGrid.hide();},scope:this})];var uploadButton=this.createUploadButton();if(uploadButton){bbarItems.unshift(uploadButton);}
this.capGrid=new Ext.Window(Ext.apply({title:this.availableLayersText,closeAction:"hide",layout:"border",height:300,width:450,modal:true,items:items,tbar:capGridToolbar,bbar:bbarItems,listeners:{hide:function(win){capGridPanel.getSelectionModel().clearSelections();},show:function(win){this.setSelectedSource(this.target.layerSources[data[idx][0]]);},scope:this}},this.initialConfig.outputConfig));},setSelectedSource:function(source){this.selectedSource=source;this.fireEvent("sourceselected",this,source);},createUploadButton:function(){var button;var uploadConfig=this.initialConfig.upload;var url;if(uploadConfig){if(typeof uploadConfig==="boolean"){uploadConfig={};}
button=new Ext.Button({xtype:"button",text:this.uploadText,iconCls:"gxp-icon-filebrowse",hidden:true,handler:function(){var panel=new gxp.LayerUploadPanel(Ext.apply({url:url,width:350,border:false,bodyStyle:"padding: 10px 10px 0 10px;",frame:true,labelWidth:65,defaults:{anchor:"95%",allowBlank:false,msgTarget:"side"},listeners:{uploadcomplete:function(panel,detail){var layers=detail.layers;var names={};for(var i=0,len=layers.length;i<len;++i){names[layers[i].name]=true;}
this.selectedSource.store.load({callback:function(records,options,success){var gridPanel=this.capGrid.items.get(0);var sel=gridPanel.getSelectionModel();sel.clearSelections();var newRecords=[];var last=0;this.selectedSource.store.each(function(record,index){if(record.get("name")in names){last=index;newRecords.push(record);}});sel.selectRecords(newRecords);window.setTimeout(function(){gridPanel.getView().focusRow(last);},100);},scope:this});win.close();},scope:this}},uploadConfig));var win=new Ext.Window({title:this.uploadText,modal:true,resizable:false,items:[panel]});win.show();},scope:this});var urlCache={};function getStatus(url,callback,scope){if(url in urlCache){window.setTimeout(function(){callback.call(scope,urlCache[url]);},0);}else{Ext.Ajax.request({url:url,disableCaching:false,callback:function(options,success,response){var status=response.status;urlCache[url]=status;callback.call(scope,status);}});}}
this.on({sourceselected:function(tool,source){button.hide();var show=false;if(this.isEligibleForUpload(source)){var parts=source.url.split("/");parts.pop();parts.push("rest");url=parts.join("/");if(this.target.isAuthorized()){getStatus(url+"/upload",function(status){button.setVisible(status===405);},this);}}},scope:this});}
return button;},isEligibleForUpload:function(source){return(source.url&&(this.relativeUploadOnly?(source.url.charAt(0)==="/"):true)&&(this.nonUploadSources||[]).indexOf(source.id)===-1);},createExpander:function(){return new Ext.grid.RowExpander({tpl:new Ext.Template(this.expanderTemplateText)});}});Ext.preg(gxp.plugins.AddLayers.prototype.ptype,gxp.plugins.AddLayers);Ext.namespace("gxp.plugins");gxp.plugins.RemoveLayer=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_removelayer",removeMenuText:"Remove layer",removeActionTip:"Remove layer",addActions:function(){var selectedLayer;var actions=gxp.plugins.RemoveLayer.superclass.addActions.apply(this,[{menuText:this.removeMenuText,iconCls:"gxp-icon-removelayers",disabled:true,tooltip:this.removeActionTip,handler:function(){var record=selectedLayer;if(record){this.target.mapPanel.layers.remove(record);}},scope:this}]);var removeLayerAction=actions[0];this.target.on("layerselectionchange",function(record){selectedLayer=record;removeLayerAction.setDisabled(this.target.mapPanel.layers.getCount()<=1||!record);},this);var enforceOne=function(store){removeLayerAction.setDisabled(!selectedLayer||store.getCount()<=1);}
this.target.mapPanel.layers.on({"add":enforceOne,"remove":enforceOne});return actions;}});Ext.preg(gxp.plugins.RemoveLayer.prototype.ptype,gxp.plugins.RemoveLayer);Ext.namespace("gxp.plugins");gxp.plugins.LayerTree=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_layertree",rootNodeText:"Layers",overlayNodeText:"Overlays",baseNodeText:"Base Layers",groups:null,defaultGroup:"default",constructor:function(config){gxp.plugins.LayerTree.superclass.constructor.apply(this,arguments);if(!this.groups){this.groups={"default":this.overlayNodeText,"background":{title:this.baseNodeText,exclusive:true}};}},addOutput:function(config){var target=this.target,me=this;var addListeners=function(node,record){if(record){target.on("layerselectionchange",function(rec){if(!me.selectionChanging&&rec===record){node.select();}});if(record===target.selectedLayer){node.on("rendernode",function(){node.select();});}}};var LayerNodeUI=Ext.extend(GeoExt.tree.LayerNodeUI,new GeoExt.tree.TreeNodeUIEventMixin());var treeRoot=new Ext.tree.TreeNode({text:this.rootNodeText,expanded:true,isTarget:false,allowDrop:false});var groupConfig,defaultGroup=this.defaultGroup;for(var group in this.groups){groupConfig=typeof this.groups[group]=="string"?{title:this.groups[group]}:this.groups[group];treeRoot.appendChild(new GeoExt.tree.LayerContainer({text:groupConfig.title,iconCls:"gxp-folder",expanded:true,group:group==defaultGroup?undefined:group,loader:new GeoExt.tree.LayerLoader({baseAttrs:groupConfig.exclusive?{checkedGroup:group}:undefined,store:this.target.mapPanel.layers,filter:(function(group){return function(record){return(record.get("group")||defaultGroup)==group&&record.getLayer().displayInLayerSwitcher==true;};})(group),createNode:function(attr){attr.uiProvider=LayerNodeUI;var layer=attr.layer;var store=attr.layerStore;if(layer&&store){var record=store.getAt(store.findBy(function(r){return r.getLayer()===layer;}));if(record){if(!record.get("queryable")){attr.iconCls="gxp-tree-rasterlayer-icon";}
if(record.get("fixed")){attr.allowDrag=false;}}}
var node=GeoExt.tree.LayerLoader.prototype.createNode.apply(this,arguments);addListeners(node,record);return node;}}),singleClickExpand:true,allowDrag:false,listeners:{append:function(tree,node){node.expand();}}}));}
config=Ext.apply({xtype:"treepanel",root:treeRoot,rootVisible:false,border:false,enableDD:true,selModel:new Ext.tree.DefaultSelectionModel({listeners:{beforeselect:function(selModel,node){var changed=true;var layer=node&&node.layer;var record;if(layer){var store=node.layerStore;record=store.getAt(store.findBy(function(r){return r.getLayer()===layer;}));}
this.selectionChanging=true;changed=this.target.selectLayer(record);this.selectionChanging=false;return changed;},scope:this}}),listeners:{contextmenu:function(node,e){if(node&&node.layer){node.select();var tree=node.getOwnerTree();if(tree.getSelectionModel().getSelectedNode()===node){var c=tree.contextMenu;c.contextNode=node;c.items.getCount()>0&&c.showAt(e.getXY());}}},beforemovenode:function(tree,node,oldParent,newParent,i){if(oldParent!==newParent){var store=newParent.loader.store;var index=store.findBy(function(r){return r.getLayer()===node.layer;});var record=store.getAt(index);record.set("group",newParent.attributes.group);}},scope:this},contextMenu:new Ext.menu.Menu({items:[]})},config||{});var layerTree=gxp.plugins.LayerTree.superclass.addOutput.call(this,config);return layerTree;}});Ext.preg(gxp.plugins.LayerTree.prototype.ptype,gxp.plugins.LayerTree);Ext.namespace("gxp.plugins");gxp.plugins.ZoomToLayerExtent=Ext.extend(gxp.plugins.ZoomToExtent,{ptype:"gxp_zoomtolayerextent",menuText:"Zoom to layer extent",tooltip:"Zoom to layer extent",iconCls:"gxp-icon-zoom-to",destroy:function(){this.selectedRecord=null;gxp.plugins.ZoomToLayerExtent.superclass.destroy.apply(this,arguments);},extent:function(){var layer=this.selectedRecord.getLayer();var dataExtent=layer instanceof OpenLayers.Layer.Vector&&layer.getDataExtent();return layer.restrictedExtent||dataExtent||layer.maxExtent||map.maxExtent;},addActions:function(){var actions=gxp.plugins.ZoomToLayerExtent.superclass.addActions.apply(this,arguments);actions[0].disable();this.target.on("layerselectionchange",function(record){this.selectedRecord=record;actions[0].setDisabled(!record||!record.get('layer'));},this);return actions;}});Ext.preg(gxp.plugins.ZoomToLayerExtent.prototype.ptype,gxp.plugins.ZoomToLayerExtent);Ext.namespace("gxp.plugins");gxp.plugins.LayerProperties=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_layerproperties",menuText:"Layer Properties",toolTip:"Layer Properties",constructor:function(config){gxp.plugins.LayerProperties.superclass.constructor.apply(this,arguments);if(!this.outputConfig){this.outputConfig={width:265,autoHeight:true};}},addActions:function(){var actions=gxp.plugins.LayerProperties.superclass.addActions.apply(this,[{menuText:this.menuText,iconCls:"gxp-icon-layerproperties",disabled:true,tooltip:this.toolTip,handler:function(){this.removeOutput();this.addOutput();},scope:this}]);var layerPropertiesAction=actions[0];this.target.on("layerselectionchange",function(record){layerPropertiesAction.setDisabled(!record||!record.get("properties"));},this);return actions;},addOutput:function(config){config=config||{};var record=this.target.selectedLayer;var origCfg=this.initialConfig.outputConfig||{};this.outputConfig.title=origCfg.title||this.menuText+": "+record.get("title");var xtype=record.get("properties")||"gxp_layerpanel";var panelConfig=this.layerPanelConfig;if(panelConfig&&panelConfig[xtype]){Ext.apply(config,panelConfig[xtype]);}
return gxp.plugins.LayerProperties.superclass.addOutput.call(this,Ext.apply({xtype:xtype,authorized:this.target.isAuthorized(),layerRecord:record,source:this.target.getSource(record),defaults:{style:"padding: 10px",autoHeight:this.outputConfig.autoHeight},listeners:{added:function(cmp){if(!this.outputTarget){cmp.on("afterrender",function(){cmp.ownerCt.ownerCt.center();},this,{single:true});}},scope:this}},config));}});Ext.preg(gxp.plugins.LayerProperties.prototype.ptype,gxp.plugins.LayerProperties);Ext.namespace("gxp");gxp.WMSStylesDialog=Ext.extend(Ext.Container,{addStyleText:"Add",addStyleTip:"Add a new style",chooseStyleText:"Choose style",deleteStyleText:"Remove",deleteStyleTip:"Delete the selected style",editStyleText:"Edit",editStyleTip:"Edit the selected style",duplicateStyleText:"Duplicate",duplicateStyleTip:"Duplicate the selected style",addRuleText:"Add",addRuleTip:"Add a new rule",newRuleText:"New Rule",deleteRuleText:"Remove",deleteRuleTip:"Delete the selected rule",editRuleText:"Edit",editRuleTip:"Edit the selected rule",duplicateRuleText:"Duplicate",duplicateRuleTip:"Duplicate the selected rule",cancelText:"Cancel",saveText:"Save",styleWindowTitle:"User Style: {0}",ruleWindowTitle:"Style Rule: {0}",stylesFieldsetTitle:"Styles",rulesFieldsetTitle:"Rules",layerRecord:null,layerDescription:null,symbolType:null,fonts:null,stylesStore:null,selectedStyle:null,selectedRule:null,editable:true,modified:false,initComponent:function(){this.addEvents("ready","modified","styleselected","beforesaved","saved");var defConfig={layout:"form",disabled:true,items:[{xtype:"fieldset",title:this.stylesFieldsetTitle,labelWidth:85,style:"margin-bottom: 0;"},{xtype:"toolbar",style:"border-width: 0 1px 1px 1px; margin-bottom: 10px;",items:[{xtype:"button",iconCls:"add",text:this.addStyleText,tooltip:this.addStyleTip,handler:this.addStyle,scope:this},{xtype:"button",iconCls:"delete",text:this.deleteStyleText,tooltip:this.deleteStyleTip,handler:function(){this.stylesStore.remove(this.selectedStyle);},scope:this},{xtype:"button",iconCls:"edit",text:this.editStyleText,tooltip:this.editStyleTip,handler:function(){this.editStyle();},scope:this},{xtype:"button",iconCls:"duplicate",text:this.duplicateStyleText,tooltip:this.duplicateStyleTip,handler:function(){var prevStyle=this.selectedStyle;var newStyle=prevStyle.get("userStyle").clone();newStyle.isDefault=false;newStyle.name=this.newStyleName();var store=this.stylesStore;store.add(new store.recordType({"name":newStyle.name,"title":newStyle.title,"abstract":newStyle.description,"userStyle":newStyle}));this.editStyle(prevStyle);},scope:this}]}]};Ext.applyIf(this,defConfig);this.createStylesStore();this.on({"beforesaved":function(){this._saving=true;},"saved":function(){delete this._saving;},"render":function(){gxp.util.dispatch([this.getStyles],function(){this.enable();},this);},scope:this});gxp.WMSStylesDialog.superclass.initComponent.apply(this,arguments);},addStyle:function(){if(!this._ready){this.on("ready",this.addStyle,this);return;}
var prevStyle=this.selectedStyle;var store=this.stylesStore;var newStyle=new OpenLayers.Style(null,{name:this.newStyleName(),rules:[this.createRule()]});store.add(new store.recordType({"name":newStyle.name,"userStyle":newStyle}));this.editStyle(prevStyle);},editStyle:function(prevStyle){var userStyle=this.selectedStyle.get("userStyle");var buttonCfg={bbar:["->",{text:this.cancelText,iconCls:"cancel",handler:function(){styleProperties.propertiesDialog.userStyle=userStyle;styleProperties.close();if(prevStyle){this._cancelling=true;this.stylesStore.remove(this.selectedStyle);this.changeStyle(prevStyle,{updateCombo:true,markModified:true});delete this._cancelling;}},scope:this},{text:this.saveText,iconCls:"save",handler:function(){styleProperties.close();}}]};var styleProperties=new Ext.Window(Ext.apply(buttonCfg,{title:String.format(this.styleWindowTitle,userStyle.title||userStyle.name),bodyBorder:false,autoHeight:true,width:300,modal:true,items:{border:false,items:{xtype:"gxp_stylepropertiesdialog",ref:"../propertiesDialog",userStyle:userStyle.clone(),nameEditable:false,style:"padding: 10px;"}},listeners:{"close":function(){this.selectedStyle.set("userStyle",styleProperties.propertiesDialog.userStyle);},scope:this}}));styleProperties.show();},createSLD:function(options){options=options||{};var sld={version:"1.0.0",namedLayers:{}};var layerName=this.layerRecord.get("name");sld.namedLayers[layerName]={name:layerName,userStyles:[]};this.stylesStore.each(function(r){if(!options.userStyles||options.userStyles.indexOf(r.get("name"))!==-1){sld.namedLayers[layerName].userStyles.push(r.get("userStyle"));}});return new OpenLayers.Format.SLD({multipleSymbolizers:true}).write(sld);},saveStyles:function(options){this.modified===true&&this.fireEvent("beforesaved",this,options);},updateStyleRemoveButton:function(){var userStyle=this.selectedStyle&&this.selectedStyle.get("userStyle");this.items.get(1).items.get(1).setDisabled(!userStyle||this.stylesStore.getCount()<=1||userStyle.isDefault===true);},updateRuleRemoveButton:function(){this.items.get(3).items.get(1).setDisabled(!this.selectedRule);},createRule:function(){return new OpenLayers.Rule({symbolizers:[new OpenLayers.Symbolizer[this.symbolType]]});},addRulesFieldSet:function(){var rulesFieldSet=new Ext.form.FieldSet({itemId:"rulesfieldset",title:this.rulesFieldsetTitle,autoScroll:true,style:"margin-bottom: 0;",hideMode:"offsets",hidden:true});var rulesToolbar=new Ext.Toolbar({style:"border-width: 0 1px 1px 1px;",hidden:true,items:[{xtype:"button",iconCls:"add",text:this.addRuleText,tooltip:this.addRuleTip,handler:this.addRule,scope:this},{xtype:"button",iconCls:"delete",text:this.deleteRuleText,tooltip:this.deleteRuleTip,handler:this.removeRule,scope:this,disabled:true},{xtype:"button",iconCls:"edit",text:this.editRuleText,toolitp:this.editRuleTip,handler:function(){this.layerDescription?this.editRule():this.describeLayer(this.editRule);},scope:this,disabled:true},{xtype:"button",iconCls:"duplicate",text:this.duplicateRuleText,tip:this.duplicateRuleTip,handler:this.duplicateRule,scope:this,disabled:true}]});this.add(rulesFieldSet,rulesToolbar);this.doLayout();return rulesFieldSet;},addRule:function(){var legend=this.items.get(2).items.get(0);this.selectedStyle.get("userStyle").rules.push(this.createRule());legend.update();this.selectedStyle.store.afterEdit(this.selectedStyle);this.updateRuleRemoveButton();},removeRule:function(){this.selectedStyle.get("userStyle").rules.remove(this.selectedRule);this.afterRuleChange();},duplicateRule:function(){var legend=this.items.get(2).items.get(0);var newRule=this.selectedRule.clone();this.selectedStyle.get("userStyle").rules.push(newRule);legend.update();this.selectedStyle.store.afterEdit(this.selectedStyle);this.updateRuleRemoveButton();},editRule:function(){var rule=this.selectedRule;var origRule=rule.clone();var ruleDlg=new Ext.Window({title:String.format(this.ruleWindowTitle,rule.title||rule.name||this.newRuleText),width:340,autoHeight:true,modal:true,items:[{xtype:"gxp_rulepanel",ref:"rulePanel",symbolType:this.symbolType,rule:rule,fonts:this.fonts,attributes:new GeoExt.data.AttributeStore({url:this.layerDescription.owsURL,baseParams:{"SERVICE":this.layerDescription.owsType,"REQUEST":"DescribeFeatureType","TYPENAME":this.layerDescription.typeName},method:"GET",disableCaching:false}),border:false,defaults:{autoHeight:true,hideMode:"offsets"},listeners:{"change":this.saveRule,"tabchange":function(){ruleDlg.syncShadow();},scope:this}}],bbar:["->",{text:this.cancelText,iconCls:"cancel",handler:function(){this.saveRule(ruleDlg.rulePanel,origRule);ruleDlg.close();},scope:this},{text:this.saveText,iconCls:"save",handler:function(){ruleDlg.close();}}]});ruleDlg.show();},saveRule:function(cmp,rule){var style=this.selectedStyle;var legend=this.items.get(2).items.get(0);var userStyle=style.get("userStyle");var i=userStyle.rules.indexOf(this.selectedRule);userStyle.rules[i]=rule;this.afterRuleChange(rule);},afterRuleChange:function(rule){var legend=this.items.get(2).items.get(0);this.selectedRule=rule;this.selectedStyle.store.afterEdit(this.selectedStyle);},setRulesFieldSetVisible:function(visible){this.items.get(3).setVisible(visible&&this.editable);this.items.get(2).setVisible(visible);this.doLayout();},parseSLD:function(response,options){var data=response.responseXML;if(!data||!data.documentElement){data=new OpenLayers.Format.XML().read(response.responseText);}
var layerParams=this.layerRecord.getLayer().params;var initialStyle=this.initialConfig.styleName||layerParams.STYLES;if(initialStyle){this.selectedStyle=this.stylesStore.getAt(this.stylesStore.findExact("name",initialStyle));}
var format=new OpenLayers.Format.SLD({multipleSymbolizers:true});try{var sld=format.read(data);var userStyles=sld.namedLayers[layerParams.LAYERS].userStyles;var inlineStyles;if(layerParams.SLD_BODY){var sldBody=format.read(layerParams.SLD_BODY);inlineStyles=sldBody.namedLayers[layerParams.LAYERS].userStyles;Array.prototype.push.apply(userStyles,inlineStyles);}
this.stylesStore.removeAll();this.selectedStyle=null;var userStyle,record,index;for(var i=0,len=userStyles.length;i<len;++i){userStyle=userStyles[i];index=this.stylesStore.findExact("name",userStyle.name);index!==-1&&this.stylesStore.removeAt(index);record=new this.stylesStore.recordType({"name":userStyle.name,"title":userStyle.title,"abstract":userStyle.description,"userStyle":userStyle});record.phantom=false;this.stylesStore.add(record);if(!this.selectedStyle&&(initialStyle===userStyle.name||(!initialStyle&&userStyle.isDefault===true))){this.selectedStyle=record;}}
this.addRulesFieldSet();this.createLegend(this.selectedStyle.get("userStyle").rules);this.stylesStoreReady();layerParams.SLD_BODY&&this.markModified();}
catch(e){this.setupNonEditable();}},createLegend:function(rules){var R=OpenLayers.Symbolizer.Raster;if(R&&rules[0]&&rules[0].symbolizers[0]instanceof R){throw("Raster symbolizers are not supported.");}else{this.addVectorLegend(rules);}},setupNonEditable:function(){this.editable=false;this.items.get(1).hide();var rulesFieldSet=this.getComponent("rulesfieldset")||this.addRulesFieldSet();rulesFieldSet.add(this.createLegendImage());this.doLayout();this.items.get(3).hide();this.stylesStoreReady();},stylesStoreReady:function(){this.stylesStore.commitChanges();this.stylesStore.on({"load":function(){this.addStylesCombo();this.updateStyleRemoveButton();},"add":function(store,records,index){this.updateStyleRemoveButton();var combo=this.items.get(0).items.get(0);this.markModified();combo.fireEvent("select",combo,store.getAt(index),index);combo.setValue(this.selectedStyle.get("name"));},"remove":function(store,record,index){if(!this._cancelling){this._removing=true;var newIndex=Math.min(index,store.getCount()-1);this.updateStyleRemoveButton();var combo=this.items.get(0).items.get(0);this.markModified();combo.fireEvent("select",combo,store.getAt(newIndex),newIndex);combo.setValue(this.selectedStyle.get("name"));delete this._removing;}},"update":function(store,record){var userStyle=record.get("userStyle");var data={"name":userStyle.name,"title":userStyle.title||userStyle.name,"abstract":userStyle.description};Ext.apply(record.data,data);this.changeStyle(record,{updateCombo:true,markModified:true});},scope:this});this.stylesStore.fireEvent("load",this.stylesStore,this.stylesStore.getRange());this._ready=true;this.fireEvent("ready");},markModified:function(){if(this.modified===false){this.modified=true;}
if(!this._saving){this.fireEvent("modified",this,this.selectedStyle.get("name"));}},createStylesStore:function(callback){var styles=this.layerRecord.get("styles");this.stylesStore=new Ext.data.JsonStore({data:{styles:styles},idProperty:"name",root:"styles",fields:["name","title","abstract","legend","userStyle"],listeners:{"add":function(store,records){for(var rec,i=records.length-1;i>=0;--i){rec=records[i];store.suspendEvents();rec.get("title")||rec.set("title",rec.get("name"));store.resumeEvents();}}}});},getStyles:function(callback){var layer=this.layerRecord.getLayer();if(this.editable===true){var version=layer.params["VERSION"];if(parseFloat(version)>1.1){version="1.1.1";}
Ext.Ajax.request({url:layer.url,params:{"SERVICE":"WMS","VERSION":version,"REQUEST":"GetStyles","LAYERS":[layer.params["LAYERS"]].join(",")},method:"GET",disableCaching:false,success:this.parseSLD,failure:this.setupNonEditable,callback:callback,scope:this});}else{this.setupNonEditable();}},describeLayer:function(callback){if(this.layerDescription){window.setTimeout(function(){callback.call(this);},0);}else{var layer=this.layerRecord.getLayer();var version=layer.params["VERSION"];if(parseFloat(version)>1.1){version="1.1.1";}
Ext.Ajax.request({url:layer.url,params:{"SERVICE":"WMS","VERSION":version,"REQUEST":"DescribeLayer","LAYERS":[layer.params["LAYERS"]].join(",")},method:"GET",disableCaching:false,success:function(response){var result=new OpenLayers.Format.WMSDescribeLayer().read(response.responseXML&&response.responseXML.documentElement?response.responseXML:response.responseText);this.layerDescription=result[0];},callback:callback,scope:this});}},addStylesCombo:function(){var store=this.stylesStore;var combo=new Ext.form.ComboBox(Ext.apply({fieldLabel:this.chooseStyleText,store:store,editable:false,displayField:"title",valueField:"name",value:this.selectedStyle?this.selectedStyle.get("title"):this.layerRecord.getLayer().params.STYLES||"default",disabled:!store.getCount(),mode:"local",typeAhead:true,triggerAction:"all",forceSelection:true,anchor:"100%",listeners:{"select":function(combo,record){this.changeStyle(record);if(!record.phantom&&!this._removing){this.fireEvent("styleselected",this,record.get("name"));}},scope:this}},this.initialConfig.stylesComboOptions));this.items.get(0).add(combo);this.doLayout();},createLegendImage:function(){var legend=new GeoExt.WMSLegend({showTitle:false,layerRecord:this.layerRecord,autoScroll:true,defaults:{listeners:{"render":function(cmp){cmp.getEl().on({load:function(evt,img){if(img.getAttribute("src")!=cmp.defaultImgSrc){this.setRulesFieldSetVisible(true);if(cmp.getEl().getHeight()>250){legend.setHeight(250);}}},"error":function(){this.setRulesFieldSetVisible(false);},scope:this});},scope:this}}});return legend;},changeStyle:function(record,options){options=options||{};var legend=this.items.get(2).items.get(0);this.selectedStyle=record;this.updateStyleRemoveButton();var styleName=record.get("name");if(this.editable===true){var userStyle=record.get("userStyle");if(userStyle.isDefault===true){styleName="";}
var ruleIdx=legend.rules.indexOf(this.selectedRule);legend.ownerCt.remove(legend);this.createLegend(userStyle.rules,{selectedRuleIndex:ruleIdx});}
if(options.updateCombo===true){this.items.get(0).items.get(0).setValue(userStyle.name);options.markModified===true&&this.markModified();}},addVectorLegend:function(rules,options){options=Ext.applyIf(options||{},{enableDD:true});this.symbolType=options.symbolType;if(!this.symbolType){var typeHierarchy=["Point","Line","Polygon"];highest=0;var symbolizers=rules[0].symbolizers,symbolType;for(var i=symbolizers.length-1;i>=0;i--){symbolType=symbolizers[i].CLASS_NAME.split(".").pop();highest=Math.max(highest,typeHierarchy.indexOf(symbolType));}
this.symbolType=typeHierarchy[highest];}
var legend=this.items.get(2).add({xtype:"gx_vectorlegend",showTitle:false,height:rules.length>10?250:undefined,autoScroll:rules.length>10,rules:rules,symbolType:this.symbolType,selectOnClick:true,enableDD:options.enableDD,listeners:{"ruleselected":function(cmp,rule){this.selectedRule=rule;var tbItems=this.items.get(3).items;this.updateRuleRemoveButton();tbItems.get(2).enable();tbItems.get(3).enable();},"ruleunselected":function(cmp,rule){this.selectedRule=null;var tbItems=this.items.get(3).items;tbItems.get(1).disable();tbItems.get(2).disable();tbItems.get(3).disable();},"rulemoved":function(){this.markModified();},"afterlayout":function(){if(this.selectedRule!==null&&legend.selectedRule===null&&legend.rules.indexOf(this.selectedRule)!==-1){legend.selectRuleEntry(this.selectedRule);}},scope:this}});this.setRulesFieldSetVisible(true);return legend;},newStyleName:function(){var layerName=this.layerRecord.get("name");return layerName.split(":").pop()+"_"+
gxp.util.md5(layerName+new Date()+Math.random()).substr(0,8);}});gxp.WMSStylesDialog.createGeoServerStylerConfig=function(layerRecord,url){var layer=layerRecord.getLayer();if(!url){url=layerRecord.get("restUrl");}
if(!url){url=layer.url.split("?").shift().replace(/\/(wms|ows)\/?$/,"/rest");}
return{xtype:"gxp_wmsstylesdialog",layerRecord:layerRecord,plugins:[{ptype:"gxp_geoserverstylewriter",baseUrl:url}],listeners:{"styleselected":function(cmp,style){layer.mergeNewParams({styles:style});},"modified":function(cmp,style){cmp.saveStyles();},"saved":function(cmp,style){layer.mergeNewParams({_olSalt:Math.random(),styles:style});},scope:this}};};OpenLayers.Renderer.defaultSymbolizer={fillColor:"#808080",fillOpacity:1,strokeColor:"#000000",strokeOpacity:1,strokeWidth:1,strokeDashstyle:"solid",pointRadius:3,graphicName:"square",fontColor:"#000000",fontSize:10,haloColor:"#FFFFFF",haloOpacity:1,haloRadius:1};Ext.reg('gxp_wmsstylesdialog',gxp.WMSStylesDialog);OpenLayers.Format&&OpenLayers.Format.SLD&&OpenLayers.Format.SLD.v1&&(function(){OpenLayers.Format.SLD.v1.prototype.readers.sld["VendorOption"]=function(node,obj){if(!obj.vendorOptions){obj.vendorOptions=[];}
obj.vendorOptions.push({name:node.getAttribute("name"),value:this.getChildValue(node)});};OpenLayers.Format.SLD.v1.prototype.writers.sld["VendorOption"]=function(option){return this.createElementNSPlus("sld:VendorOption",{attributes:{name:option.name},value:option.value});};OpenLayers.Format.SLD.v1.prototype.readers.sld["Priority"]=function(node,obj){obj.priority=this.readOgcExpression(node);};OpenLayers.Format.SLD.v1.prototype.writers.sld["Priority"]=function(priority){var node=this.createElementNSPlus("sld:Priority");this.writeNode("ogc:Literal",priority,node);return node;};var writers=OpenLayers.Format.SLD.v1.prototype.writers.sld;var original;original=writers.TextSymbolizer;writers.TextSymbolizer=(function(original){return function(symbolizer){var node=original.apply(this,arguments);if(symbolizer.externalGraphic||symbolizer.graphicName){this.writeNode("Graphic",symbolizer,node);}
if("priority"in symbolizer){this.writeNode("Priority",symbolizer.priority,node);}
return node;};})(original);var modify=["PointSymbolizer","LineSymbolizer","PolygonSymbolizer","TextSymbolizer"];var name;for(var i=0,ii=modify.length;i<ii;++i){name=modify[i];original=writers[name];writers[name]=(function(original){return function(symbolizer){var node=original.apply(this,arguments);var options=symbolizer.vendorOptions;if(options){for(var i=0,ii=options.length;i<ii;++i){this.writeNode("VendorOption",options[i],node);}}
return node;};})(original);}})();Ext.namespace("gxp.plugins");gxp.plugins.Styler=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_styler",menuText:"Edit Styles",tooltip:"Manage layer styles",sameOriginStyling:true,rasterStyling:false,requireDescribeLayer:true,constructor:function(config){gxp.plugins.Styler.superclass.constructor.apply(this,arguments);if(!this.outputConfig){this.outputConfig={autoHeight:true,width:265};}
Ext.applyIf(this.outputConfig,{closeAction:"close"});},addActions:function(){var layerProperties;var actions=gxp.plugins.Styler.superclass.addActions.apply(this,[{menuText:this.menuText,iconCls:"gxp-icon-palette",disabled:true,tooltip:this.tooltip,handler:function(){this.addOutput();},scope:this}]);this.launchAction=actions[0];this.target.on({layerselectionchange:this.handleLayerChange,scope:this});return actions;},handleLayerChange:function(record){this.launchAction.disable();if(record&&record.get("styles")){var source=this.target.getSource(record);if(source instanceof gxp.plugins.WMSSource){source.describeLayer(record,function(describeRec){this.checkIfStyleable(record,describeRec);},this);}}},checkIfStyleable:function(layerRec,describeRec){if(describeRec){var owsTypes=["WFS"];if(this.rasterStyling===true){owsTypes.push("WCS");}}
if(describeRec?owsTypes.indexOf(describeRec.get("owsType"))!==-1:!this.requireDescribeLayer){var editableStyles=false;var source=this.target.layerSources[layerRec.get("source")];var url;var restUrl=layerRec.get("restUrl");if(restUrl){url=restUrl+"/styles";}else{url=source.url.split("?").shift().replace(/\/(wms|ows)\/?$/,"/rest/styles");}
if(this.sameOriginStyling){editableStyles=url.charAt(0)==="/";}else{editableStyles=true;}
if(editableStyles){if(this.target.isAuthorized()){this.enableActionIfAvailable(url);}}}},enableActionIfAvailable:function(url){Ext.Ajax.request({method:"PUT",url:url,callback:function(options,success,response){this.launchAction.setDisabled(response.status!==405);},scope:this});},addOutput:function(config){config=config||{};var record=this.target.selectedLayer;var origCfg=this.initialConfig.outputConfig||{};this.outputConfig.title=origCfg.title||this.menuText+": "+record.get("title");Ext.apply(config,gxp.WMSStylesDialog.createGeoServerStylerConfig(record));if(this.rasterStyling===true){config.plugins.push({ptype:"gxp_wmsrasterstylesdialog"});}
Ext.applyIf(config,{style:"padding: 10px"});var output=gxp.plugins.Styler.superclass.addOutput.call(this,config);output.stylesStore.on("load",function(){this.outputTarget||output.ownerCt.ownerCt.center();});}});Ext.preg(gxp.plugins.Styler.prototype.ptype,gxp.plugins.Styler);Ext.namespace("gxp.plugins");gxp.plugins.GeoLocator=Ext.extend(gxp.plugins.Tool,{ptype:"gxp_geolocator",maxZoom:21,infoActionTip:"Get My Location",addActions:function(){this.popupCache={};var map=this.target.mapPanel.map;var firstGeolocation=true;var vector=new OpenLayers.Layer.Vector('vector');var style={fillColor:'#000',fillOpacity:0.1,strokeWidth:0};var geolocate=new OpenLayers.Control.Geolocate({bind:false,geolocationOptions:{enableHighAccuracy:true,maximumAge:0,timeout:7000}});var maxZoom=this.maxZoom;var pulsate=function(feature){var point=feature.geometry.getCentroid(),bounds=feature.geometry.getBounds(),radius=Math.abs((bounds.right-bounds.left)/2),count=0,grow='up';var resize=function(){if(count>16){clearInterval(window.resizeInterval);}
var interval=radius*0.03;var ratio=interval/radius;switch(count){case 4:case 12:grow='down';break;case 8:grow='up';break;}
if(grow!=='up'){ratio=-Math.abs(ratio);}
feature.geometry.resize(1+ratio,point);vector.drawFeature(feature);count++;};window.resizeInterval=window.setInterval(resize,50,point,radius);};geolocate.events.register("locationupdated",geolocate,function(e){vector.removeAllFeatures();var circle=new OpenLayers.Feature.Vector(OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(e.point.x,e.point.y),e.position.coords.accuracy/2,40,0),{},style);vector.addFeatures([new OpenLayers.Feature.Vector(e.point,{},{graphicName:'cross',strokeColor:'#f00',strokeWidth:2,fillOpacity:0,pointRadius:10}),circle]);if(firstGeolocation){map.zoomToExtent(vector.getDataExtent());pulsate(circle);if(map.getZoom()>maxZoom){map.zoomTo(maxZoom);}
firstGeolocation=false;this.bind=true;}});geolocate.events.register("locationfailed",this,function(){OpenLayers.Console.log('Location detection failed');});map.addControl(geolocate);var actions=gxp.plugins.GeoLocator.superclass.addActions.call(this,[{tooltip:this.infoActionTip,iconCls:"gxp-icon-geolocate",toggleGroup:this.toggleGroup,enableToggle:true,allowDepress:true,toggleHandler:function(button,pressed){if(pressed){map.addLayer(vector);geolocate.watch=true;firstGeolocation=true;geolocate.activate();}else{vector.removeAllFeatures();geolocate.deactivate();geolocate.watch=false;map.removeLayer(vector);}}}]);}});Ext.preg(gxp.plugins.GeoLocator.prototype.ptype,gxp.plugins.GeoLocator);Ext.namespace("gxp");gxp.WMSLayerPanel=Ext.extend(Ext.TabPanel,{layerRecord:null,source:null,styling:true,sameOriginStyling:true,rasterStyling:false,transparent:null,editableStyles:false,activeTab:0,border:false,imageFormats:/png|gif|jpe?g/i,aboutText:"About",titleText:"Title",nameText:"Name",descriptionText:"Description",displayText:"Display",opacityText:"Opacity",formatText:"Format",infoFormatText:"Info format",infoFormatEmptyText:"Select a format",transparentText:"Transparent",cacheText:"Cache",cacheFieldText:"Use cached version",stylesText:"Styles",initComponent:function(){this.addEvents("change");this.items=[this.createAboutPanel(),this.createDisplayPanel()];if(this.layerRecord.get("layer").params.TILED!=null){this.items.push(this.createCachePanel());}
if(this.styling&&gxp.WMSStylesDialog&&this.layerRecord.get("styles")){var url=this.layerRecord.get("restUrl");if(!url){url=(this.source||this.layerRecord.get("layer")).url.split("?").shift().replace(/\/(wms|ows)\/?$/,"/rest");}
if(this.sameOriginStyling){this.editableStyles=url.charAt(0)==="/";}else{this.editableStyles=true;}
this.items.push(this.createStylesPanel(url));}
gxp.WMSLayerPanel.superclass.initComponent.call(this);},createCachePanel:function(){return{title:this.cacheText,layout:"form",style:"padding: 10px",items:[{xtype:"checkbox",fieldLabel:this.cacheFieldText,checked:(this.layerRecord.get("layer").params.TILED===true),listeners:{check:function(checkbox,checked){var layer=this.layerRecord.get("layer");layer.mergeNewParams({TILED:checked});this.fireEvent("change");},scope:this}}]};},createStylesPanel:function(url){var config=gxp.WMSStylesDialog.createGeoServerStylerConfig(this.layerRecord,url);if(this.rasterStyling===true){config.plugins.push({ptype:"gxp_wmsrasterstylesdialog"});}
return Ext.apply(config,{title:this.stylesText,style:"padding: 10px",editable:false,listeners:Ext.apply(config.listeners,{"beforerender":{fn:function(cmp){var render=!this.editableStyles;if(!render){if(typeof this.authorized=='boolean'){cmp.editable=this.authorized;cmp.ownerCt.doLayout();}else{Ext.Ajax.request({method:"PUT",url:url+"/styles",callback:function(options,success,response){cmp.editable=(response.status==405);cmp.ownerCt.doLayout();}});}}
return render;},scope:this,single:true}})});},createAboutPanel:function(){return{title:this.aboutText,style:{"padding":"10px"},defaults:{border:false},items:[{layout:"form",labelWidth:70,items:[{xtype:"textfield",fieldLabel:this.titleText,anchor:"99%",value:this.layerRecord.get("title"),listeners:{change:function(field){this.layerRecord.set("title",field.getValue());this.layerRecord.commit();this.fireEvent("change");},scope:this}},{xtype:"textfield",fieldLabel:this.nameText,anchor:"99%",value:this.layerRecord.get("name"),readOnly:true}]},{layout:"form",labelAlign:"top",items:[{xtype:"textarea",fieldLabel:this.descriptionText,grow:true,growMax:150,anchor:"99%",value:this.layerRecord.get("abstract"),readOnly:true}]}]};},createDisplayPanel:function(){var record=this.layerRecord;var layer=record.getLayer();var opacity=layer.opacity;if(opacity==null){opacity=1;}
var formats=[];var currentFormat=layer.params["FORMAT"].toLowerCase();Ext.each(record.get("formats"),function(format){if(this.imageFormats.test(format)){formats.push(format.toLowerCase());}},this);if(formats.indexOf(currentFormat)===-1){formats.push(currentFormat);}
var transparent=layer.params["TRANSPARENT"];transparent=(transparent==="true"||transparent===true);var transCheck={xtype:"checkbox",fieldLabel:this.transparentText,checked:transparent,listeners:{check:function(checkbox,checked){layer.mergeNewParams({transparent:checked?"true":"false"});this.fireEvent("change");},scope:this}};return{title:this.displayText,style:{"padding":"10px"},layout:"form",labelWidth:70,items:[{xtype:"slider",name:"opacity",fieldLabel:this.opacityText,value:opacity*100,values:[opacity*100],anchor:"99%",isFormField:true,listeners:{change:function(slider,value){layer.setOpacity(value/100);this.fireEvent("change");},scope:this}},{xtype:"combo",fieldLabel:this.formatText,store:formats,value:currentFormat,mode:"local",triggerAction:"all",editable:false,anchor:"99%",listeners:{select:function(combo){var format=combo.getValue();layer.mergeNewParams({format:format});if(format=="image/jpeg"){this.transparent=Ext.getCmp('transparent').getValue();transCheck.setValue(false);}else if(this.transparent!==null){transCheck.setValue(this.transparent);this.transparent=null;}
transCheck.setDisabled(format=="image/jpeg");this.fireEvent("change");},scope:this}},{xtype:"combo",fieldLabel:this.infoFormatText,emptyText:this.infoFormatEmptyText,store:record.get("infoFormats"),value:record.get("infoFormat"),hidden:(record.get("infoFormats")===undefined),mode:'local',triggerAction:"all",editable:false,anchor:"99%",listeners:{select:function(combo){var infoFormat=combo.getValue();record.set("infoFormat",infoFormat);this.fireEvent("change");}},scope:this},transCheck]};}});Ext.reg('gxp_wmslayerpanel',gxp.WMSLayerPanel);Ext.namespace("gxp");gxp.RulePanel=Ext.extend(Ext.TabPanel,{fonts:undefined,symbolType:"Point",rule:null,attributes:null,nestedFilters:true,minScaleDenominatorLimit:Math.pow(0.5,19)*40075016.68*39.3701*OpenLayers.DOTS_PER_INCH/256,maxScaleDenominatorLimit:40075016.68*39.3701*OpenLayers.DOTS_PER_INCH/256,scaleLevels:20,scaleSliderTemplate:"{scaleType} Scale 1:{scale}",modifyScaleTipContext:Ext.emptyFn,labelFeaturesText:"Label Features",labelsText:"Labels",basicText:"Basic",advancedText:"Advanced",limitByScaleText:"Limit by scale",limitByConditionText:"Limit by condition",symbolText:"Symbol",nameText:"Name",initComponent:function(){var defConfig={plain:true,border:false};Ext.applyIf(this,defConfig);if(!this.rule){this.rule=new OpenLayers.Rule({name:this.uniqueRuleName()});}else{if(!this.initialConfig.symbolType){this.symbolType=this.getSymbolTypeFromRule(this.rule)||this.symbolType;}}
this.activeTab=0;this.textSymbolizer=new gxp.TextSymbolizer({symbolizer:this.getTextSymbolizer(),attributes:this.attributes,fonts:this.fonts,listeners:{change:function(symbolizer){this.fireEvent("change",this,this.rule);},scope:this}});this.scaleLimitPanel=new gxp.ScaleLimitPanel({maxScaleDenominator:this.rule.maxScaleDenominator||undefined,limitMaxScaleDenominator:!!this.rule.maxScaleDenominator,maxScaleDenominatorLimit:this.maxScaleDenominatorLimit,minScaleDenominator:this.rule.minScaleDenominator||undefined,limitMinScaleDenominator:!!this.rule.minScaleDenominator,minScaleDenominatorLimit:this.minScaleDenominatorLimit,scaleLevels:this.scaleLevels,scaleSliderTemplate:this.scaleSliderTemplate,modifyScaleTipContext:this.modifyScaleTipContext,listeners:{change:function(comp,min,max){this.rule.minScaleDenominator=min;this.rule.maxScaleDenominator=max;this.fireEvent("change",this,this.rule);},scope:this}});this.filterBuilder=new gxp.FilterBuilder({allowGroups:this.nestedFilters,filter:this.rule&&this.rule.filter&&this.rule.filter.clone(),attributes:this.attributes,listeners:{change:function(builder){var filter=builder.getFilter();this.rule.filter=filter;this.fireEvent("change",this,this.rule);},scope:this}});this.items=[{title:this.labelsText,autoScroll:true,bodyStyle:{"padding":"10px"},items:[{xtype:"fieldset",title:this.labelFeaturesText,autoHeight:true,checkboxToggle:true,collapsed:!this.hasTextSymbolizer(),items:[this.textSymbolizer],listeners:{collapse:function(){OpenLayers.Util.removeItem(this.rule.symbolizers,this.getTextSymbolizer());this.fireEvent("change",this,this.rule);},expand:function(){this.setTextSymbolizer(this.textSymbolizer.symbolizer);this.fireEvent("change",this,this.rule);},scope:this}}]}];if(this.getSymbolTypeFromRule(this.rule)||this.symbolType){this.items=[{title:this.basicText,autoScroll:true,items:[this.createHeaderPanel(),this.createSymbolizerPanel()]},this.items[0],{title:this.advancedText,defaults:{style:{margin:"7px"}},autoScroll:true,items:[{xtype:"fieldset",title:this.limitByScaleText,checkboxToggle:true,collapsed:!(this.rule&&(this.rule.minScaleDenominator||this.rule.maxScaleDenominator)),autoHeight:true,items:[this.scaleLimitPanel],listeners:{collapse:function(){delete this.rule.minScaleDenominator;delete this.rule.maxScaleDenominator;this.fireEvent("change",this,this.rule);},expand:function(){var tab=this.getActiveTab();this.activeTab=null;this.setActiveTab(tab);var changed=false;if(this.scaleLimitPanel.limitMinScaleDenominator){this.rule.minScaleDenominator=this.scaleLimitPanel.minScaleDenominator;changed=true;}
if(this.scaleLimitPanel.limitMaxScaleDenominator){this.rule.maxScaleDenominator=this.scaleLimitPanel.maxScaleDenominator;changed=true;}
if(changed){this.fireEvent("change",this,this.rule);}},scope:this}},{xtype:"fieldset",title:this.limitByConditionText,checkboxToggle:true,collapsed:!(this.rule&&this.rule.filter),autoHeight:true,items:[this.filterBuilder],listeners:{collapse:function(){delete this.rule.filter;this.fireEvent("change",this,this.rule);},expand:function(){var changed=false;this.rule.filter=this.filterBuilder.getFilter();this.fireEvent("change",this,this.rule);},scope:this}}]}];};this.items[0].autoHeight=true;this.addEvents("change");this.on({tabchange:function(panel,tab){tab.doLayout();},scope:this});gxp.RulePanel.superclass.initComponent.call(this);},hasTextSymbolizer:function(){var candidate,symbolizer;for(var i=0,ii=this.rule.symbolizers.length;i<ii;++i){candidate=this.rule.symbolizers[i];if(candidate instanceof OpenLayers.Symbolizer.Text){symbolizer=candidate;break;}}
return symbolizer;},getTextSymbolizer:function(){var symbolizer=this.hasTextSymbolizer();if(!symbolizer){symbolizer=new OpenLayers.Symbolizer.Text();if(this.fonts){symbolizer.fontFamily=this.fonts[0];}}
return symbolizer;},setTextSymbolizer:function(symbolizer){var found;for(var i=0,ii=this.rule.symbolizers.length;i<ii;++i){candidate=this.rule.symbolizers[i];if(this.rule.symbolizers[i]instanceof OpenLayers.Symbolizer.Text){this.rule.symbolizers[i]=symbolizer;found=true;break;}}
if(!found){this.rule.symbolizers.push(symbolizer);}},uniqueRuleName:function(){return OpenLayers.Util.createUniqueID("rule_");},createHeaderPanel:function(){this.symbolizerSwatch=new GeoExt.FeatureRenderer({symbolType:this.symbolType,isFormField:true,fieldLabel:this.symbolText});return{xtype:"form",border:false,labelAlign:"top",defaults:{border:false},style:{"padding":"0.3em 0 0 1em"},items:[{layout:"column",defaults:{border:false,style:{"padding-right":"1em"}},items:[{layout:"form",width:150,items:[{xtype:"textfield",fieldLabel:this.nameText,anchor:"95%",value:this.rule&&(this.rule.title||this.rule.name||""),listeners:{change:function(el,value){this.rule.title=value;this.fireEvent("change",this,this.rule);},scope:this}}]},{layout:"form",width:70,items:[this.symbolizerSwatch]}]}]};},createSymbolizerPanel:function(){var candidate,symbolizer;var Type=OpenLayers.Symbolizer[this.symbolType];var existing=false;if(Type){for(var i=0,ii=this.rule.symbolizers.length;i<ii;++i){candidate=this.rule.symbolizers[i];if(candidate instanceof Type){existing=true;symbolizer=candidate;break;}}
if(!symbolizer){symbolizer=new Type({fill:false,stroke:false});}}else{throw new Error("Appropriate symbolizer type not included in build: "+this.symbolType);}
this.symbolizerSwatch.setSymbolizers([symbolizer],{draw:this.symbolizerSwatch.rendered});var cfg={xtype:"gxp_"+this.symbolType.toLowerCase()+"symbolizer",symbolizer:symbolizer,bodyStyle:{padding:"10px"},border:false,labelWidth:70,defaults:{labelWidth:70},listeners:{change:function(symbolizer){this.symbolizerSwatch.setSymbolizers([symbolizer],{draw:this.symbolizerSwatch.rendered});if(!existing){this.rule.symbolizers.push(symbolizer);existing=true;}
this.fireEvent("change",this,this.rule);},scope:this}};if(this.symbolType==="Point"&&this.pointGraphics){cfg.pointGraphics=this.pointGraphics;}
return cfg;},getSymbolTypeFromRule:function(rule){var candidate,type;for(var i=0,ii=rule.symbolizers.length;i<ii;++i){candidate=rule.symbolizers[i];if(!(candidate instanceof OpenLayers.Symbolizer.Text)){type=candidate.CLASS_NAME.split(".").pop();break;}}
return type;}});Ext.reg('gxp_rulepanel',gxp.RulePanel);Ext.namespace("gxp");gxp.ScaleLimitPanel=Ext.extend(Ext.Panel,{maxScaleDenominatorLimit:40075016.68*39.3701*OpenLayers.DOTS_PER_INCH/256,limitMaxScaleDenominator:true,maxScaleDenominator:undefined,minScaleDenominatorLimit:Math.pow(0.5,19)*40075016.68*39.3701*OpenLayers.DOTS_PER_INCH/256,limitMinScaleDenominator:true,minScaleDenominator:undefined,scaleLevels:20,scaleSliderTemplate:"{scaleType} Scale 1:{scale}",modifyScaleTipContext:Ext.emptyFn,scaleFactor:null,changing:false,border:false,maxScaleLimitText:"Max scale limit",minScaleLimitText:"Min scale limit",initComponent:function(){this.layout="column";this.defaults={border:false,bodyStyle:"margin: 0 5px;"};this.bodyStyle={padding:"5px"};this.scaleSliderTemplate=new Ext.Template(this.scaleSliderTemplate);Ext.applyIf(this,{minScaleDenominator:this.minScaleDenominatorLimit,maxScaleDenominator:this.maxScaleDenominatorLimit});this.scaleFactor=Math.pow(this.maxScaleDenominatorLimit/this.minScaleDenominatorLimit,1/(this.scaleLevels-1));this.scaleSlider=new Ext.Slider({vertical:true,height:100,values:[0,100],listeners:{changecomplete:function(slider,value){this.updateScaleValues(slider);},render:function(slider){slider.thumbs[0].el.setVisible(this.limitMaxScaleDenominator);slider.thumbs[1].el.setVisible(this.limitMinScaleDenominator);slider.setDisabled(!this.limitMinScaleDenominator&&!this.limitMaxScaleDenominator);},scope:this},plugins:[new gxp.slider.Tip({getText:(function(thumb){var index=thumb.slider.thumbs.indexOf(thumb);var value=thumb.value;var scales=this.sliderValuesToScale([thumb.value]);var data={scale:String(scales[0]),zoom:(thumb.value*(this.scaleLevels/100)).toFixed(1),type:(index===0)?"Max":"Min",scaleType:(index===0)?"Min":"Max"};this.modifyScaleTipContext(this,data);return this.scaleSliderTemplate.apply(data);}).createDelegate(this)})]});this.maxScaleDenominatorInput=new Ext.form.NumberField({allowNegative:false,width:100,fieldLabel:"1",value:Math.round(this.maxScaleDenominator),disabled:!this.limitMaxScaleDenominator,validator:(function(value){return!this.limitMinScaleDenominator||(value>this.minScaleDenominator);}).createDelegate(this),listeners:{valid:function(field){var value=Number(field.getValue());var limit=Math.round(this.maxScaleDenominatorLimit);if(value<limit&&value>this.minScaleDenominator){this.maxScaleDenominator=value;this.updateSliderValues();}},change:function(field){var value=Number(field.getValue());var limit=Math.round(this.maxScaleDenominatorLimit);if(value>limit){field.setValue(limit);}else if(value<this.minScaleDenominator){field.setValue(this.minScaleDenominator);}else{this.maxScaleDenominator=value;this.updateSliderValues();}},scope:this}});this.minScaleDenominatorInput=new Ext.form.NumberField({allowNegative:false,width:100,fieldLabel:"1",value:Math.round(this.minScaleDenominator),disabled:!this.limitMinScaleDenominator,validator:(function(value){return!this.limitMaxScaleDenominator||(value<this.maxScaleDenominator);}).createDelegate(this),listeners:{valid:function(field){var value=Number(field.getValue());var limit=Math.round(this.minScaleDenominatorLimit);if(value>limit&&value<this.maxScaleDenominator){this.minScaleDenominator=value;this.updateSliderValues();}},change:function(field){var value=Number(field.getValue());var limit=Math.round(this.minScaleDenominatorLimit);if(value<limit){field.setValue(limit);}else if(value>this.maxScaleDenominator){field.setValue(this.maxScaleDenominator);}else{this.minScaleDenominator=value;this.updateSliderValues();}},scope:this}});this.items=[this.scaleSlider,{xtype:"panel",layout:"form",defaults:{border:false},items:[{labelWidth:90,layout:"form",width:150,items:[{xtype:"checkbox",checked:!!this.limitMinScaleDenominator,fieldLabel:this.maxScaleLimitText,listeners:{check:function(box,checked){this.limitMinScaleDenominator=checked;var slider=this.scaleSlider;slider.setValue(1,100);slider.thumbs[1].el.setVisible(checked);this.minScaleDenominatorInput.setDisabled(!checked);this.updateScaleValues(slider);slider.setDisabled(!this.limitMinScaleDenominator&&!this.limitMaxScaleDenominator);},scope:this}}]},{labelWidth:10,layout:"form",items:[this.minScaleDenominatorInput]},{labelWidth:90,layout:"form",items:[{xtype:"checkbox",checked:!!this.limitMaxScaleDenominator,fieldLabel:this.minScaleLimitText,listeners:{check:function(box,checked){this.limitMaxScaleDenominator=checked;var slider=this.scaleSlider;slider.setValue(0,0);slider.thumbs[0].el.setVisible(checked);this.maxScaleDenominatorInput.setDisabled(!checked);this.updateScaleValues(slider);slider.setDisabled(!this.limitMinScaleDenominator&&!this.limitMaxScaleDenominator);},scope:this}}]},{labelWidth:10,layout:"form",items:[this.maxScaleDenominatorInput]}]}];this.addEvents("change");gxp.ScaleLimitPanel.superclass.initComponent.call(this);},updateScaleValues:function(slider){if(!this.changing){var values=slider.getValues();var resetSlider=false;if(!this.limitMaxScaleDenominator){if(values[0]>0){values[0]=0;resetSlider=true;}}
if(!this.limitMinScaleDenominator){if(values[1]<100){values[1]=100;resetSlider=true;}}
if(resetSlider){slider.setValue(0,values[0]);slider.setValue(1,values[1]);}else{var scales=this.sliderValuesToScale(values);var max=scales[0];var min=scales[1];this.changing=true;this.minScaleDenominatorInput.setValue(min);this.maxScaleDenominatorInput.setValue(max);this.changing=false;this.fireEvent("change",this,(this.limitMinScaleDenominator)?min:undefined,(this.limitMaxScaleDenominator)?max:undefined);}}},updateSliderValues:function(){if(!this.changing){var min=this.minScaleDenominator;var max=this.maxScaleDenominator;var values=this.scaleToSliderValues([max,min]);this.changing=true;this.scaleSlider.setValue(0,values[0]);this.scaleSlider.setValue(1,values[1]);this.changing=false;this.fireEvent("change",this,(this.limitMinScaleDenominator)?min:undefined,(this.limitMaxScaleDenominator)?max:undefined);}},sliderValuesToScale:function(values){var interval=100/(this.scaleLevels-1);return[Math.round(Math.pow(this.scaleFactor,(100-values[0])/interval)*this.minScaleDenominatorLimit),Math.round(Math.pow(this.scaleFactor,(100-values[1])/interval)*this.minScaleDenominatorLimit)];},scaleToSliderValues:function(scales){var interval=100/(this.scaleLevels-1);return[100-(interval*Math.log(scales[0]/this.minScaleDenominatorLimit)/Math.log(this.scaleFactor)),100-(interval*Math.log(scales[1]/this.minScaleDenominatorLimit)/Math.log(this.scaleFactor))];}});Ext.reg('gxp_scalelimitpanel',gxp.ScaleLimitPanel);Ext.namespace("gxp.slider");gxp.slider.Tip=Ext.extend(Ext.slider.Tip,{hover:true,dragging:false,init:function(slider){if(this.hover){slider.on("render",this.registerThumbListeners,this);}
this.slider=slider;gxp.slider.Tip.superclass.init.apply(this,arguments);},registerThumbListeners:function(){for(var i=0,len=this.slider.thumbs.length;i<len;++i){this.slider.thumbs[i].el.on({"mouseover":this.createHoverListener(i),"mouseout":function(){if(!this.dragging){this.hide.apply(this,arguments);}},scope:this});}},createHoverListener:function(index){return(function(){this.onSlide(this.slider,{},this.slider.thumbs[index]);this.dragging=false;}).createDelegate(this);},onSlide:function(slider,e,thumb){this.dragging=true;gxp.slider.Tip.superclass.onSlide.apply(this,arguments);}});Ext.namespace("gxp");gxp.TextSymbolizer=Ext.extend(Ext.Panel,{fonts:undefined,symbolizer:null,defaultSymbolizer:null,attributes:null,colorManager:null,haloCache:null,border:false,layout:"form",labelValuesText:"Label values",haloText:"Halo",sizeText:"Size",initComponent:function(){if(!this.symbolizer){this.symbolizer={};}
Ext.applyIf(this.symbolizer,this.defaultSymbolizer);this.haloCache={};var defAttributesComboConfig={xtype:"combo",fieldLabel:this.labelValuesText,store:this.attributes,editable:false,triggerAction:"all",allowBlank:false,displayField:"name",valueField:"name",value:this.symbolizer.label&&this.symbolizer.label.replace(/^\${(.*)}$/,"$1"),listeners:{select:function(combo,record){this.symbolizer.label="${"+record.get("name")+"}";this.fireEvent("change",this.symbolizer);},scope:this},width:120};this.attributesComboConfig=this.attributesComboConfig||{};Ext.applyIf(this.attributesComboConfig,defAttributesComboConfig);this.labelWidth=80;this.items=[this.attributesComboConfig,{cls:"x-html-editor-tb",style:"background: transparent; border: none; padding: 0 0em 0.5em;",xtype:"toolbar",items:[{xtype:"gxp_fontcombo",fonts:this.fonts||undefined,width:110,value:this.symbolizer.fontFamily,listeners:{select:function(combo,record){this.symbolizer.fontFamily=record.get("field1");this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"tbtext",text:this.sizeText+": "},{xtype:"numberfield",allowNegative:false,emptyText:OpenLayers.Renderer.defaultSymbolizer.fontSize,value:this.symbolizer.fontSize,width:30,listeners:{change:function(field,value){value=parseFloat(value);if(isNaN(value)){delete this.symbolizer.fontSize;}else{this.symbolizer.fontSize=value;}
this.fireEvent("change",this.symbolizer);},scope:this}},{enableToggle:true,cls:"x-btn-icon",iconCls:"x-edit-bold",pressed:this.symbolizer.fontWeight==="bold",listeners:{toggle:function(button,pressed){this.symbolizer.fontWeight=pressed?"bold":"normal";this.fireEvent("change",this.symbolizer);},scope:this}},{enableToggle:true,cls:"x-btn-icon",iconCls:"x-edit-italic",pressed:this.symbolizer.fontStyle==="italic",listeners:{toggle:function(button,pressed){this.symbolizer.fontStyle=pressed?"italic":"normal";this.fireEvent("change",this.symbolizer);},scope:this}}]},{xtype:"gxp_fillsymbolizer",symbolizer:this.symbolizer,defaultColor:OpenLayers.Renderer.defaultSymbolizer.fontColor,checkboxToggle:false,autoHeight:true,width:213,labelWidth:70,plugins:this.colorManager&&[new this.colorManager()],listeners:{change:function(symbolizer){this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"fieldset",title:this.haloText,checkboxToggle:true,collapsed:!(this.symbolizer.haloRadius||this.symbolizer.haloColor||this.symbolizer.haloOpacity),autoHeight:true,labelWidth:50,items:[{xtype:"numberfield",fieldLabel:this.sizeText,anchor:"89%",allowNegative:false,emptyText:OpenLayers.Renderer.defaultSymbolizer.haloRadius,value:this.symbolizer.haloRadius,listeners:{change:function(field,value){value=parseFloat(value);if(isNaN(value)){delete this.symbolizer.haloRadius;}else{this.symbolizer.haloRadius=value;}
this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"gxp_fillsymbolizer",symbolizer:{fillColor:("haloColor"in this.symbolizer)?this.symbolizer.haloColor:OpenLayers.Renderer.defaultSymbolizer.haloColor,fillOpacity:("haloOpacity"in this.symbolizer)?this.symbolizer.haloOpacity:OpenLayers.Renderer.defaultSymbolizer.haloOpacity},defaultColor:OpenLayers.Renderer.defaultSymbolizer.haloColor,checkboxToggle:false,width:190,labelWidth:60,plugins:this.colorManager&&[new this.colorManager()],listeners:{change:function(symbolizer){this.symbolizer.haloColor=symbolizer.fillColor;this.symbolizer.haloOpacity=symbolizer.fillOpacity;this.fireEvent("change",this.symbolizer);},scope:this}}],listeners:{collapse:function(){this.haloCache={haloRadius:this.symbolizer.haloRadius,haloColor:this.symbolizer.haloColor,haloOpacity:this.symbolizer.haloOpacity};delete this.symbolizer.haloRadius;delete this.symbolizer.haloColor;delete this.symbolizer.haloOpacity;this.fireEvent("change",this.symbolizer)},expand:function(){Ext.apply(this.symbolizer,this.haloCache);this.doLayout();this.fireEvent("change",this.symbolizer);},scope:this}}];this.addEvents("change");gxp.TextSymbolizer.superclass.initComponent.call(this);}});Ext.reg('gxp_textsymbolizer',gxp.TextSymbolizer);Ext.namespace("gxp");gxp.FillSymbolizer=Ext.extend(Ext.FormPanel,{symbolizer:null,colorManager:null,checkboxToggle:true,defaultColor:null,border:false,fillText:"Fill",colorText:"Color",opacityText:"Opacity",initComponent:function(){if(!this.symbolizer){this.symbolizer={};}
var colorFieldPlugins;if(this.colorManager){colorFieldPlugins=[new this.colorManager()];}
this.items=[{xtype:"fieldset",title:this.fillText,autoHeight:true,checkboxToggle:this.checkboxToggle,collapsed:this.checkboxToggle===true&&this.symbolizer.fill===false,hideMode:"offsets",defaults:{width:100},items:[{xtype:"gxp_colorfield",fieldLabel:this.colorText,name:"color",emptyText:OpenLayers.Renderer.defaultSymbolizer.fillColor,value:this.symbolizer.fillColor,defaultBackground:this.defaultColor||OpenLayers.Renderer.defaultSymbolizer.fillColor,plugins:colorFieldPlugins,listeners:{valid:function(field){var newValue=field.getValue();var modified=this.symbolizer.fillColor!=newValue;this.symbolizer.fillColor=newValue;modified&&this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"slider",fieldLabel:this.opacityText,name:"opacity",values:[(("fillOpacity"in this.symbolizer)?this.symbolizer.fillOpacity:OpenLayers.Renderer.defaultSymbolizer.fillOpacity)*100],isFormField:true,listeners:{changecomplete:function(slider,value){this.symbolizer.fillOpacity=value/100;this.fireEvent("change",this.symbolizer);},scope:this},plugins:[new GeoExt.SliderTip({getText:function(thumb){return thumb.value+"%";}})]}],listeners:{"collapse":function(){if(this.symbolizer.fill!==false){this.symbolizer.fill=false;this.fireEvent("change",this.symbolizer);}},"expand":function(){this.symbolizer.fill=true;this.fireEvent("change",this.symbolizer);},scope:this}}];this.addEvents("change");gxp.FillSymbolizer.superclass.initComponent.call(this);}});Ext.reg('gxp_fillsymbolizer',gxp.FillSymbolizer);Ext.namespace("gxp.form");gxp.form.ColorField=Ext.extend(Ext.form.TextField,{cssColors:{aqua:"#00FFFF",black:"#000000",blue:"#0000FF",fuchsia:"#FF00FF",gray:"#808080",green:"#008000",lime:"#00FF00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#FF0000",silver:"#C0C0C0",teal:"#008080",white:"#FFFFFF",yellow:"#FFFF00"},defaultBackground:"#ffffff",initComponent:function(){if(this.value){this.value=this.hexToColor(this.value);}
gxp.form.ColorField.superclass.initComponent.call(this);this.on({render:this.colorField,valid:this.colorField,scope:this});},isDark:function(hex){var dark=false;if(hex){var r=parseInt(hex.substring(1,3),16)/255;var g=parseInt(hex.substring(3,5),16)/255;var b=parseInt(hex.substring(5,7),16)/255;var brightness=(r*0.299)+(g*0.587)+(b*0.144);dark=brightness<0.5;}
return dark;},colorField:function(){var color=this.colorToHex(this.getValue())||this.defaultBackground;this.getEl().setStyle({"background":color,"color":this.isDark(color)?"#ffffff":"#000000"});},getHexValue:function(){return this.colorToHex(gxp.form.ColorField.superclass.getValue.apply(this,arguments));},getValue:function(){var v=this.getHexValue();var o=this.initialConfig.value;if(v===this.hexToColor(o)){v=o;}
return v;},setValue:function(value){gxp.form.ColorField.superclass.setValue.apply(this,[this.hexToColor(value)]);},colorToHex:function(color){if(!color){return color;}
var hex;if(color.match(/^#[0-9a-f]{6}$/i)){hex=color;}else{hex=this.cssColors[color.toLowerCase()]||null;}
return hex;},hexToColor:function(hex){if(!hex){return hex;}
var color=hex;for(var c in this.cssColors){if(this.cssColors[c]==color.toUpperCase()){color=c;break;}}
return color;}});Ext.reg("gxp_colorfield",gxp.form.ColorField);Ext.namespace("gxp.form");gxp.form.FontComboBox=Ext.extend(Ext.form.ComboBox,{fonts:["Serif","SansSerif","Arial","Courier New","Tahoma","Times New Roman","Verdana"],defaultFont:"Serif",allowBlank:false,mode:"local",triggerAction:"all",editable:false,initComponent:function(){var fonts=this.fonts||gxp.form.FontComboBox.prototype.fonts;var defaultFont=this.defaultFont;if(fonts.indexOf(this.defaultFont)===-1){defaultFont=fonts[0];}
var defConfig={displayField:"field1",valueField:"field1",store:fonts,value:defaultFont,tpl:new Ext.XTemplate('<tpl for=".">'+'<div class="x-combo-list-item">'+'<span style="font-family: {field1};">{field1}</span>'+'</div></tpl>')};Ext.applyIf(this,defConfig);gxp.form.FontComboBox.superclass.initComponent.call(this);}});Ext.reg("gxp_fontcombo",gxp.form.FontComboBox);Ext.namespace("gxp");gxp.PolygonSymbolizer=Ext.extend(Ext.Panel,{symbolizer:null,initComponent:function(){this.items=[{xtype:"gxp_fillsymbolizer",symbolizer:this.symbolizer,listeners:{change:function(symbolizer){this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"gxp_strokesymbolizer",symbolizer:this.symbolizer,listeners:{change:function(symbolizer){this.fireEvent("change",this.symbolizer);},scope:this}}];this.addEvents("change");gxp.PolygonSymbolizer.superclass.initComponent.call(this);}});Ext.reg('gxp_polygonsymbolizer',gxp.PolygonSymbolizer);Ext.namespace("gxp");gxp.StrokeSymbolizer=Ext.extend(Ext.FormPanel,{solidStrokeName:"solid",dashStrokeName:"dash",dotStrokeName:"dot",titleText:"Stroke",styleText:"Style",colorText:"Color",widthText:"Width",opacityText:"Opacity",symbolizer:null,colorManager:null,checkboxToggle:true,defaultColor:null,dashStyles:null,border:false,initComponent:function(){this.dashStyles=this.dashStyles||[["solid",this.solidStrokeName],["4 4",this.dashStrokeName],["2 4",this.dotStrokeName]];if(!this.symbolizer){this.symbolizer={};}
var colorFieldPlugins;if(this.colorManager){colorFieldPlugins=[new this.colorManager];}
this.items=[{xtype:"fieldset",title:this.titleText,autoHeight:true,checkboxToggle:this.checkboxToggle,collapsed:this.checkboxToggle===true&&this.symbolizer.stroke===false,hideMode:"offsets",defaults:{width:100},items:[{xtype:"combo",name:"style",fieldLabel:this.styleText,store:new Ext.data.SimpleStore({data:this.dashStyles,fields:["value","display"]}),displayField:"display",valueField:"value",value:this.getDashArray(this.symbolizer.strokeDashstyle)||OpenLayers.Renderer.defaultSymbolizer.strokeDashstyle,mode:"local",allowBlank:true,triggerAction:"all",editable:false,listeners:{select:function(combo,record){this.symbolizer.strokeDashstyle=record.get("value");this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"gxp_colorfield",name:"color",fieldLabel:this.colorText,emptyText:OpenLayers.Renderer.defaultSymbolizer.strokeColor,value:this.symbolizer.strokeColor,defaultBackground:this.defaultColor||OpenLayers.Renderer.defaultSymbolizer.strokeColor,plugins:colorFieldPlugins,listeners:{valid:function(field){var newValue=field.getValue();var modified=this.symbolizer.strokeColor!=newValue;this.symbolizer.strokeColor=newValue;modified&&this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"numberfield",name:"width",fieldLabel:this.widthText,allowNegative:false,emptyText:OpenLayers.Renderer.defaultSymbolizer.strokeWidth,value:this.symbolizer.strokeWidth,listeners:{change:function(field,value){value=parseFloat(value);if(isNaN(value)){delete this.symbolizer.strokeWidth;}else{this.symbolizer.strokeWidth=value;}
this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"slider",name:"opacity",fieldLabel:this.opacityText,values:[(("strokeOpacity"in this.symbolizer)?this.symbolizer.strokeOpacity:OpenLayers.Renderer.defaultSymbolizer.strokeOpacity)*100],isFormField:true,listeners:{changecomplete:function(slider,value){this.symbolizer.strokeOpacity=value/100;this.fireEvent("change",this.symbolizer);},scope:this},plugins:[new GeoExt.SliderTip({getText:function(thumb){return thumb.value+"%";}})]}],listeners:{"collapse":function(){if(this.symbolizer.stroke!==false){this.symbolizer.stroke=false;this.fireEvent("change",this.symbolizer);}},"expand":function(){this.symbolizer.stroke=true;this.fireEvent("change",this.symbolizer);},scope:this}}];this.addEvents("change");gxp.StrokeSymbolizer.superclass.initComponent.call(this);},getDashArray:function(style){var array;if(style){var parts=style.split(/\s+/);var ratio=parts[0]/parts[1];var array;if(!isNaN(ratio)){array=ratio>=1?"4 4":"2 4";}}
return array;}});Ext.reg('gxp_strokesymbolizer',gxp.StrokeSymbolizer);Ext.namespace("gxp");gxp.LineSymbolizer=Ext.extend(Ext.Panel,{symbolizer:null,initComponent:function(){this.items=[{xtype:"gxp_strokesymbolizer",symbolizer:this.symbolizer,listeners:{change:function(symbolizer){this.fireEvent("change",this.symbolizer);},scope:this}}];this.addEvents("change");gxp.LineSymbolizer.superclass.initComponent.call(this);}});Ext.reg('gxp_linesymbolizer',gxp.LineSymbolizer);Ext.namespace("gxp");gxp.PointSymbolizer=Ext.extend(Ext.Panel,{symbolizer:null,graphicCircleText:"circle",graphicSquareText:"square",graphicTriangleText:"triangle",graphicStarText:"star",graphicCrossText:"cross",graphicXText:"x",graphicExternalText:"external",urlText:"URL",opacityText:"opacity",symbolText:"Symbol",sizeText:"Size",rotationText:"Rotation",pointGraphics:null,colorManager:null,external:null,layout:"form",initComponent:function(){if(!this.symbolizer){this.symbolizer={};}
if(!this.pointGraphics){this.pointGraphics=[{display:this.graphicCircleText,value:"circle",mark:true},{display:this.graphicSquareText,value:"square",mark:true},{display:this.graphicTriangleText,value:"triangle",mark:true},{display:this.graphicStarText,value:"star",mark:true},{display:this.graphicCrossText,value:"cross",mark:true},{display:this.graphicXText,value:"x",mark:true},{display:this.graphicExternalText}];}
this.external=!!this.symbolizer["externalGraphic"];this.markPanel=new Ext.Panel({border:false,collapsed:this.external,layout:"form",items:[{xtype:"gxp_fillsymbolizer",symbolizer:this.symbolizer,labelWidth:this.labelWidth,labelAlign:this.labelAlign,colorManager:this.colorManager,listeners:{change:function(symbolizer){this.fireEvent("change",this.symbolizer);},scope:this}},{xtype:"gxp_strokesymbolizer",symbolizer:this.symbolizer,labelWidth:this.labelWidth,labelAlign:this.labelAlign,colorManager:this.colorManager,listeners:{change:function(symbolizer){this.fireEvent("change",this.symbolizer);},scope:this}}]});this.urlField=new Ext.form.TextField({name:"url",fieldLabel:this.urlText,value:this.symbolizer["externalGraphic"],hidden:true,listeners:{change:function(field,value){this.symbolizer["externalGraphic"]=value;this.fireEvent("change",this.symbolizer);},scope:this},width:100});this.graphicPanel=new Ext.Panel({border:false,collapsed:!this.external,layout:"form",items:[this.urlField,{xtype:"slider",name:"opacity",fieldLabel:this.opacityText,value:[(this.symbolizer["graphicOpacity"]==null)?100:this.symbolizer["graphicOpacity"]*100],isFormField:true,listeners:{changecomplete:function(slider,value){this.symbolizer["graphicOpacity"]=value/100;this.fireEvent("change",this.symbolizer);},scope:this},plugins:[new GeoExt.SliderTip({getText:function(thumb){return thumb.value+"%";}})],width:100}]});this.items=[{xtype:"combo",name:"mark",fieldLabel:this.symbolText,store:new Ext.data.JsonStore({data:{root:this.pointGraphics},root:"root",fields:["value","display","preview",{name:"mark",type:"boolean"}]}),value:this.external?0:this.symbolizer["graphicName"],displayField:"display",valueField:"value",tpl:new Ext.XTemplate('<tpl for=".">'+'<div class="x-combo-list-item gx-pointsymbolizer-mark-item">'+'<tpl if="preview">'+'<img src="{preview}" alt="{display}"/>'+'</tpl>'+'<span>{display}</span>'+'</div></tpl>'),mode:"local",allowBlank:false,triggerAction:"all",editable:false,listeners:{select:function(combo,record){var mark=record.get("mark");var value=record.get("value");if(!mark){if(value){this.urlField.hide();this.urlField.getEl().up('.x-form-item').setDisplayed(false);this.symbolizer["externalGraphic"]=value;}else{this.urlField.show();this.urlField.getEl().up('.x-form-item').setDisplayed(true);}
if(!this.external){this.external=true;this.updateGraphicDisplay();}}else{if(this.external){this.external=false;delete this.symbolizer["externalGraphic"];this.updateGraphicDisplay();}
this.symbolizer["graphicName"]=value;}
this.fireEvent("change",this.symbolizer);},scope:this},width:100},{xtype:"textfield",name:"size",fieldLabel:this.sizeText,value:this.symbolizer["pointRadius"]&&this.symbolizer["pointRadius"]*2,listeners:{change:function(field,value){this.symbolizer["pointRadius"]=value/2;this.fireEvent("change",this.symbolizer);},scope:this},width:100},{xtype:"textfield",name:"rotation",fieldLabel:this.rotationText,value:this.symbolizer["rotation"],listeners:{change:function(field,value){this.symbolizer["rotation"]=value;this.fireEvent("change",this.symbolizer);},scope:this},width:100},this.markPanel,this.graphicPanel];this.addEvents("change");gxp.PointSymbolizer.superclass.initComponent.call(this);},updateGraphicDisplay:function(){if(this.external){this.markPanel.collapse();this.graphicPanel.expand();}else{this.graphicPanel.collapse();this.markPanel.expand();}}});Ext.reg('gxp_pointsymbolizer',gxp.PointSymbolizer);Ext.namespace("gxp");gxp.FilterBuilder=Ext.extend(Ext.Container,{builderTypeNames:["any","all","none","not all"],allowedBuilderTypes:null,allowBlank:false,preComboText:"Match",postComboText:"of the following:",cls:"gxp-filterbuilder",builderType:null,childFilterContainer:null,customizeFilterOnInit:true,addConditionText:"add condition",addGroupText:"add group",removeConditionText:"remove condition",allowGroups:true,initComponent:function(){var defConfig={defaultBuilderType:gxp.FilterBuilder.ANY_OF};Ext.applyIf(this,defConfig);if(this.customizeFilterOnInit){this.filter=this.customizeFilter(this.filter);}
this.builderType=this.getBuilderType();this.items=[{xtype:"container",layout:"form",defaults:{anchor:"100%"},hideLabels:true,items:[{xtype:"compositefield",style:"padding-left: 2px",items:[{xtype:"label",style:"padding-top: 0.3em",text:this.preComboText},this.createBuilderTypeCombo(),{xtype:"label",style:"padding-top: 0.3em",text:this.postComboText}]},this.createChildFiltersPanel(),{xtype:"toolbar",items:this.createToolBar()}]}];this.addEvents("change");gxp.FilterBuilder.superclass.initComponent.call(this);},createToolBar:function(){var bar=[{text:this.addConditionText,iconCls:"add",handler:function(){this.addCondition();},scope:this}];if(this.allowGroups){bar.push({text:this.addGroupText,iconCls:"add",handler:function(){this.addCondition(true);},scope:this});}
return bar;},getFilter:function(){var filter;if(this.filter){filter=this.filter.clone();if(filter instanceof OpenLayers.Filter.Logical){filter=this.cleanFilter(filter);}}
return filter;},cleanFilter:function(filter){if(filter instanceof OpenLayers.Filter.Logical){if(filter.type!==OpenLayers.Filter.Logical.NOT&&filter.filters.length===1){filter=this.cleanFilter(filter.filters[0]);}else{var child;for(var i=0,len=filter.filters.length;i<len;++i){child=filter.filters[i];if(child instanceof OpenLayers.Filter.Logical){child=this.cleanFilter(child);if(child){filter.filters[i]=child;}else{filter=child;break;}}else if(!child||child.type===null||child.property===null||child[filter.type===OpenLayers.Filter.Comparison.BETWEEN?"lowerBoundary":"value"]===null){filter=false;break;}}}}else{if(!filter||filter.type===null||filter.property===null||filter[filter.type===OpenLayers.Filter.Comparison.BETWEEN?"lowerBoundary":"value"]===null){filter=false;}}
return filter;},customizeFilter:function(filter){if(!filter){filter=this.wrapFilter(this.createDefaultFilter());}else{filter=this.cleanFilter(filter);var child,i,len;switch(filter.type){case OpenLayers.Filter.Logical.AND:case OpenLayers.Filter.Logical.OR:if(!filter.filters||filter.filters.length===0){filter.filters=[this.createDefaultFilter()];}else{for(i=0,len=filter.filters.length;i<len;++i){child=filter.filters[i];if(child instanceof OpenLayers.Filter.Logical){filter.filters[i]=this.customizeFilter(child);}}}
filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.OR,filters:[filter]});break;case OpenLayers.Filter.Logical.NOT:if(!filter.filters||filter.filters.length===0){filter.filters=[new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.OR,filters:[this.createDefaultFilter()]})];}else{child=filter.filters[0];if(child instanceof OpenLayers.Filter.Logical){if(child.type!==OpenLayers.Filter.Logical.NOT){var grandchild;for(i=0,len=child.filters.length;i<len;++i){grandchild=child.filters[i];if(grandchild instanceof OpenLayers.Filter.Logical){child.filters[i]=this.customizeFilter(grandchild);}}}else{if(child.filters&&child.filters.length>0){filter=this.customizeFilter(child.filters[0]);}else{filter=this.wrapFilter(this.createDefaultFilter());}}}else{var type;if(this.defaultBuilderType===gxp.FilterBuilder.NOT_ALL_OF){type=OpenLayers.Filter.Logical.AND;}else{type=OpenLayers.Filter.Logical.OR;}
filter.filters=[new OpenLayers.Filter.Logical({type:type,filters:[child]})];}}
break;default:filter=this.wrapFilter(filter);break;}}
return filter;},createDefaultFilter:function(){return new OpenLayers.Filter.Comparison();},wrapFilter:function(filter){var type;if(this.defaultBuilderType===gxp.FilterBuilder.ALL_OF){type=OpenLayers.Filter.Logical.AND;}else{type=OpenLayers.Filter.Logical.OR;}
return new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.OR,filters:[new OpenLayers.Filter.Logical({type:type,filters:[filter]})]});},addCondition:function(group){var filter,type;if(group){type="gxp_filterbuilder";filter=this.wrapFilter(this.createDefaultFilter());}else{type="gxp_filterfield";filter=this.createDefaultFilter();}
var newChild=this.newRow({xtype:type,filter:filter,columnWidth:1,attributes:this.attributes,allowBlank:group?undefined:this.allowBlank,customizeFilterOnInit:group&&false,listeners:{change:function(){this.fireEvent("change",this);},scope:this}});this.childFilterContainer.add(newChild);this.filter.filters[0].filters.push(filter);this.childFilterContainer.doLayout();},removeCondition:function(item,filter){var parent=this.filter.filters[0].filters;if(parent.length>1){parent.remove(filter);this.childFilterContainer.remove(item,true);}
this.fireEvent("change",this);},createBuilderTypeCombo:function(){var types=this.allowedBuilderTypes||[gxp.FilterBuilder.ANY_OF,gxp.FilterBuilder.ALL_OF,gxp.FilterBuilder.NONE_OF];var numTypes=types.length;var data=new Array(numTypes);var type;for(var i=0;i<numTypes;++i){type=types[i];data[i]=[type,this.builderTypeNames[type]];}
return{xtype:"combo",store:new Ext.data.SimpleStore({data:data,fields:["value","name"]}),value:this.builderType,displayField:"name",valueField:"value",triggerAction:"all",mode:"local",listeners:{select:function(combo,record){this.changeBuilderType(record.get("value"));this.fireEvent("change",this);},scope:this},width:60};},changeBuilderType:function(type){if(type!==this.builderType){this.builderType=type;var child=this.filter.filters[0];switch(type){case gxp.FilterBuilder.ANY_OF:this.filter.type=OpenLayers.Filter.Logical.OR;child.type=OpenLayers.Filter.Logical.OR;break;case gxp.FilterBuilder.ALL_OF:this.filter.type=OpenLayers.Filter.Logical.OR;child.type=OpenLayers.Filter.Logical.AND;break;case gxp.FilterBuilder.NONE_OF:this.filter.type=OpenLayers.Filter.Logical.NOT;child.type=OpenLayers.Filter.Logical.OR;break;case gxp.FilterBuilder.NOT_ALL_OF:this.filter.type=OpenLayers.Filter.Logical.NOT;child.type=OpenLayers.Filter.Logical.AND;break;}}},createChildFiltersPanel:function(){this.childFilterContainer=new Ext.Container();var grandchildren=this.filter.filters[0].filters;var grandchild;for(var i=0,len=grandchildren.length;i<len;++i){grandchild=grandchildren[i];var fieldCfg={xtype:"gxp_filterfield",allowBlank:this.allowBlank,columnWidth:1,filter:grandchild,attributes:this.attributes,listeners:{change:function(){this.fireEvent("change",this);},scope:this}};var containerCfg=Ext.applyIf(grandchild instanceof OpenLayers.Filter.Logical?{xtype:"gxp_filterbuilder"}:{xtype:"container",layout:"form",hideLabels:true,items:fieldCfg},fieldCfg);this.childFilterContainer.add(this.newRow(containerCfg));}
return this.childFilterContainer;},newRow:function(filterContainer){var ct=new Ext.Container({layout:"column",items:[{xtype:"container",width:28,height:26,style:"padding-left: 2px",items:{xtype:"button",tooltip:this.removeConditionText,iconCls:"delete",handler:function(btn){this.removeCondition(ct,filterContainer.filter);},scope:this}},filterContainer]});return ct;},getBuilderType:function(){var type=this.defaultBuilderType;if(this.filter){var child=this.filter.filters[0];if(this.filter.type===OpenLayers.Filter.Logical.NOT){switch(child.type){case OpenLayers.Filter.Logical.OR:type=gxp.FilterBuilder.NONE_OF;break;case OpenLayers.Filter.Logical.AND:type=gxp.FilterBuilder.NOT_ALL_OF;break;}}else{switch(child.type){case OpenLayers.Filter.Logical.OR:type=gxp.FilterBuilder.ANY_OF;break;case OpenLayers.Filter.Logical.AND:type=gxp.FilterBuilder.ALL_OF;break;}}}
return type;}});gxp.FilterBuilder.ANY_OF=0;gxp.FilterBuilder.ALL_OF=1;gxp.FilterBuilder.NONE_OF=2;gxp.FilterBuilder.NOT_ALL_OF=3;Ext.reg('gxp_filterbuilder',gxp.FilterBuilder);Ext.namespace("gxp.form");gxp.form.FilterField=Ext.extend(Ext.form.CompositeField,{lowerBoundaryTip:"lower boundary",upperBoundaryTip:"upper boundary",filter:null,attributes:null,attributesComboConfig:null,initComponent:function(){if(!this.filter){this.filter=this.createDefaultFilter();}
var mode="remote",attributes=new GeoExt.data.AttributeStore();if(this.attributes){if(this.attributes.getCount()!=0){mode="local";this.attributes.each(function(r){var match=/gml:((Multi)?(Point|Line|Polygon|Curve|Surface|Geometry)).*/.exec(r.get("type"));match||attributes.add([r]);});}else{attributes=this.attributes;}}
var defAttributesComboConfig={xtype:"combo",store:attributes,editable:mode=="local",typeAhead:true,forceSelection:true,mode:mode,triggerAction:"all",allowBlank:this.allowBlank,displayField:"name",valueField:"name",value:this.filter.property,listeners:{select:function(combo,record){this.items.get(1).enable();this.filter.property=record.get("name");this.fireEvent("change",this.filter);},"blur":function(combo){var index=combo.store.findExact("name",combo.getValue());if(index!=-1){combo.fireEvent("select",combo,combo.store.getAt(index));}else if(combo.startValue!=null){combo.setValue(combo.startValue);}},scope:this},width:120};this.attributesComboConfig=this.attributesComboConfig||{};Ext.applyIf(this.attributesComboConfig,defAttributesComboConfig);this.items=this.createFilterItems();this.addEvents("change");gxp.form.FilterField.superclass.initComponent.call(this);},createDefaultFilter:function(){return new OpenLayers.Filter.Comparison();},createFilterItems:function(){var isBetween=this.filter.type===OpenLayers.Filter.Comparison.BETWEEN;return[this.attributesComboConfig,{xtype:"gxp_comparisoncombo",disabled:this.filter.property==null,allowBlank:this.allowBlank,value:this.filter.type,listeners:{select:function(combo,record){this.items.get(2).enable();this.items.get(3).enable();this.items.get(4).enable();this.setFilterType(record.get("value"));this.fireEvent("change",this.filter);},scope:this}},{xtype:"textfield",disabled:this.filter.type==null,hidden:isBetween,value:this.filter.value,width:50,grow:true,growMin:50,anchor:"100%",allowBlank:this.allowBlank,listeners:{"change":function(field,value){this.filter.value=value;this.fireEvent("change",this.filter);},scope:this}},{xtype:"textfield",disabled:this.filter.type==null,hidden:!isBetween,value:this.filter.lowerBoundary,tooltip:this.lowerBoundaryTip,grow:true,growMin:30,anchor:"100%",allowBlank:this.allowBlank,listeners:{"change":function(field,value){this.filter.lowerBoundary=value;this.fireEvent("change",this.filter);},"render":function(c){Ext.QuickTips.register({target:c.getEl(),text:this.lowerBoundaryTip});},"autosize":function(field,width){field.setWidth(width);field.ownerCt.doLayout();},scope:this}},{xtype:"textfield",disabled:this.filter.type==null,hidden:!isBetween,grow:true,growMin:30,value:this.filter.upperBoundary,allowBlank:this.allowBlank,listeners:{"change":function(field,value){this.filter.upperBoundary=value;this.fireEvent("change",this.filter);},"render":function(c){Ext.QuickTips.register({target:c.getEl(),text:this.upperBoundaryTip});},scope:this}}];},setFilterType:function(type){this.filter.type=type;if(type===OpenLayers.Filter.Comparison.BETWEEN){this.items.get(2).hide();this.items.get(3).show();this.items.get(4).show();}else{this.items.get(2).show();this.items.get(3).hide();this.items.get(4).hide();}
this.doLayout();}});Ext.reg('gxp_filterfield',gxp.form.FilterField);Ext.namespace("gxp.form");gxp.form.ComparisonComboBox=Ext.extend(Ext.form.ComboBox,{allowedTypes:[[OpenLayers.Filter.Comparison.EQUAL_TO,"="],[OpenLayers.Filter.Comparison.NOT_EQUAL_TO,"<>"],[OpenLayers.Filter.Comparison.LESS_THAN,"<"],[OpenLayers.Filter.Comparison.GREATER_THAN,">"],[OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO,"<="],[OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO,">="],[OpenLayers.Filter.Comparison.LIKE,"like"],[OpenLayers.Filter.Comparison.BETWEEN,"between"]],allowBlank:false,mode:"local",typeAhead:true,forceSelection:true,triggerAction:"all",width:50,editable:true,initComponent:function(){var defConfig={displayField:"name",valueField:"value",store:new Ext.data.SimpleStore({data:this.allowedTypes,fields:["value","name"]}),value:(this.value===undefined)?this.allowedTypes[0][0]:this.value,listeners:{"blur":function(){var index=this.store.findExact("value",this.getValue());if(index!=-1){this.fireEvent("select",this,this.store.getAt(index));}else if(this.startValue!=null){this.setValue(this.startValue);}}}};Ext.applyIf(this,defConfig);gxp.form.ComparisonComboBox.superclass.initComponent.call(this);}});Ext.reg("gxp_comparisoncombo",gxp.form.ComparisonComboBox);Ext.namespace("gxp");gxp.StylePropertiesDialog=Ext.extend(Ext.Container,{titleText:"General",nameFieldText:"Name",titleFieldText:"Title",abstractFieldText:"Abstract",userStyle:null,initComponent:function(){var listeners={"change":function(field,value){this.userStyle[field.name]=value;this.fireEvent("change",this,this.userStyle);},scope:this};var defConfig={layout:"form",items:[{xtype:"fieldset",title:this.titleText,labelWidth:75,defaults:{xtype:"textfield",anchor:"100%",listeners:listeners},items:[{xtype:this.initialConfig.nameEditable?"textfield":"displayfield",fieldLabel:this.nameFieldText,name:"name",value:this.userStyle.name,maskRe:/[A-Za-z0-9_]/},{fieldLabel:this.titleFieldText,name:"title",value:this.userStyle.title},{xtype:"textarea",fieldLabel:this.abstractFieldText,name:"description",value:this.userStyle.description}]}]};Ext.applyIf(this,defConfig);this.addEvents("change");gxp.StylePropertiesDialog.superclass.initComponent.apply(this,arguments);}});Ext.reg('gxp_stylepropertiesdialog',gxp.StylePropertiesDialog);Ext.namespace("gxp");gxp.GoogleEarthPanel=Ext.extend(Ext.Panel,{HORIZONTAL_FIELD_OF_VIEW:(30*Math.PI)/180,map:null,mapPanel:null,layers:null,earth:null,projection:null,layerCache:null,initComponent:function(){this.addEvents("beforeadd","pluginfailure");gxp.GoogleEarthPanel.superclass.initComponent.call(this);var mapPanel=this.mapPanel;if(mapPanel&&!(mapPanel instanceof GeoExt.MapPanel)){mapPanel=Ext.getCmp(mapPanel);}
if(!mapPanel){throw new Error("Could not get map panel from config: "+this.mapPanel);}
this.map=mapPanel.map;this.layers=mapPanel.layers;this.projection=new OpenLayers.Projection("EPSG:4326");function render(){if(this.rendered){this.layerCache={};google.earth.createInstance(this.body.dom,this.onEarthReady.createDelegate(this),(function(code){this.fireEvent("pluginfailure",this,code);}).createDelegate(this));}};this.on("show",render,this);this.on("hide",function(){if(this.earth!=null){this.updateMap();}
this.body.dom.innerHTML="";this.earth=null;},this);},onEarthReady:function(object){this.earth=object;this.earth.getOptions().setFlyToSpeed(this.earth.SPEED_TELEPORT);this.resetCamera();this.setExtent(this.map.getExtent());this.earth.getNavigationControl().setVisibility(this.earth.VISIBILITY_SHOW);var screenXY=this.earth.getNavigationControl().getScreenXY();screenXY.setXUnits(this.earth.UNITS_PIXELS);screenXY.setYUnits(this.earth.UNITS_INSET_PIXELS);this.earth.getWindow().setVisibility(true);this.layers.each(function(record){this.addLayer(record);},this);this.layers.on("remove",this.updateLayers,this);this.layers.on("update",this.updateLayers,this);this.layers.on("add",this.updateLayers,this);},updateLayers:function(){if(!this.earth)return;var features=this.earth.getFeatures();var f=features.getFirstChild();while(f!=null){features.removeChild(f);f=features.getFirstChild();}
this.layers.each(function(record){this.addLayer(record);},this);},addLayer:function(layer,order){var lyr=layer.getLayer();var ows=(lyr&&lyr.url);if(this.earth&&lyr instanceof OpenLayers.Layer.WMS&&typeof ows=="string"){var add=this.fireEvent("beforeadd",layer);if(add!==false){var name=lyr.id;var networkLink;if(this.layerCache[name]){networkLink=this.layerCache[name];}else{var link=this.earth.createLink('kl_'+name);ows=ows.replace(/\?.*/,'');var params=lyr.params;var kmlPath='/kml?mode=refresh&layers='+params.LAYERS+"&styles="+params.STYLES;link.setHref(ows+kmlPath);networkLink=this.earth.createNetworkLink('nl_'+name);networkLink.setName(name);networkLink.set(link,false,false);this.layerCache[name]=networkLink;}
networkLink.setVisibility(lyr.getVisibility());if(order!==undefined&&order<this.earth.getFeatures().getChildNodes().getLength()){this.earth.getFeatures().insertBefore(this.earth.getFeatures().getChildNodes().item(order));}else{this.earth.getFeatures().appendChild(networkLink);}}}},setExtent:function(extent){extent=extent.transform(this.map.getProjectionObject(),this.projection);var center=extent.getCenterLonLat();var width=this.getExtentWidth(extent);var height=width/(2*Math.tan(this.HORIZONTAL_FIELD_OF_VIEW));var lookAt=this.earth.getView().copyAsLookAt(this.earth.ALTITUDE_RELATIVE_TO_GROUND);lookAt.setLatitude(center.lat);lookAt.setLongitude(center.lon);lookAt.setRange(height);this.earth.getView().setAbstractView(lookAt);},resetCamera:function(){var camera=this.earth.getView().copyAsCamera(this.earth.ALTITUDE_RELATIVE_TO_GROUND);camera.setRoll(0);camera.setHeading(0);camera.setTilt(0);this.earth.getView().setAbstractView(camera);},getExtent:function(){var geBounds=this.earth.getView().getViewportGlobeBounds();var olBounds=new OpenLayers.Bounds(geBounds.getWest(),geBounds.getSouth(),geBounds.getEast(),geBounds.getNorth());return olBounds;},updateMap:function(){var lookAt=this.earth.getView().copyAsLookAt(this.earth.ALTITUDE_RELATIVE_TO_GROUND);var center=this.reprojectToMap(new OpenLayers.LonLat(lookAt.getLongitude(),lookAt.getLatitude()));var geExtent=this.reprojectToMap(this.getExtent());this.map.zoomToExtent(geExtent,true);this.map.setCenter(center);var height=lookAt.getRange();var width=2*height*Math.tan(this.HORIZONTAL_FIELD_OF_VIEW);var nextResolution=this.map.getResolutionForZoom(this.map.getZoom()+1);var currentExtent=this.map.getExtent();var nextExtent=new OpenLayers.Bounds(center.lon-(this.map.getSize().w/2*nextResolution),center.lat+(this.map.getSize().h/2*nextResolution),center.lon+(this.map.getSize().w/2*nextResolution),center.lat-(this.map.getSize().h/2*nextResolution));var currentWidthDiff=Math.abs(this.getExtentWidth(currentExtent)-width);var nextWidthDiff=Math.abs(this.getExtentWidth(nextExtent)-width);if(nextWidthDiff<currentWidthDiff){this.map.zoomTo(this.map.getZoom()+1);}},getExtentWidth:function(extent){var center=extent.getCenterLonLat();var middleLeft=new OpenLayers.LonLat(extent.left,center.lat);var middleRight=new OpenLayers.LonLat(extent.right,center.lat);return OpenLayers.Util.distVincenty(middleLeft,middleRight)*1000;},reprojectToGE:function(data){return data.clone().transform(this.map.getProjectionObject(),this.projection);},reprojectToMap:function(data){return data.clone().transform(this.projection,this.map.getProjectionObject());}});Ext.reg("gxp_googleearthpanel",gxp.GoogleEarthPanel);Ext.namespace("gxp");gxp.GoogleStreetViewPanel=Ext.extend(Ext.Panel,{panorama:null,heading:0,pitch:0,zoom:0,location:null,initComponent:function(){var defConfig={plain:true,border:false};Ext.applyIf(this,defConfig);return gxp.GoogleStreetViewPanel.superclass.initComponent.call(this);},afterRender:function(){var owner=this.ownerCt;if(owner){var size=owner.getSize();Ext.applyIf(this,size);if(!this.location){if(GeoExt.Popup){this.bubble(function(cmp){if(cmp instanceof GeoExt.Popup){this.location=cmp.location.clone().transform(cmp.map.getProjectionObject(),new OpenLayers.Projection("EPSG:4326"));return false;}},this);}}}
gxp.GoogleStreetViewPanel.superclass.afterRender.call(this);var options={position:new google.maps.LatLng(this.location.lat,this.location.lon),pov:{heading:this.heading,pitch:this.pitch,zoom:this.zoom}};this.panorama=new google.maps.StreetViewPanorama(this.body.dom,options);},beforeDestroy:function(){delete this.panorama;gxp.GoogleStreetViewPanel.superclass.beforeDestroy.apply(this,arguments);},onResize:function(w,h){gxp.GoogleStreetViewPanel.superclass.onResize.apply(this,arguments);if(this.panorama){if(typeof this.panorama=="object"){google.maps.event.trigger(this.panorama,"resize")}}},setSize:function(width,height,animate){gxp.GoogleStreetViewPanel.superclass.setSize.apply(this,arguments);if(this.panorama){if(typeof this.panorama=="object"){google.maps.event.trigger(this.panorama,"resize")}}}});Ext.reg("gxp_googlestreetviewpanel",gxp.GoogleStreetViewPanel);Ext.namespace("gxp");gxp.Viewer=Ext.extend(Ext.util.Observable,{defaultToolType:"gxp_tool",tools:null,selectedLayer:null,constructor:function(config){this.addEvents("ready","portalready","beforelayerselectionchange","layerselectionchange","featureedit");Ext.apply(this,{layerSources:{},portalItems:[]});this.createLayerRecordQueue=[];(config.loadConfig||this.loadConfig).call(this,config,this.applyConfig);gxp.Viewer.superclass.constructor.apply(this,arguments);},selectLayer:function(record){record=record||null;var changed=false;var allow=this.fireEvent("beforelayerselectionchange",record);if(allow!==false){changed=true;if(this.selectedLayer){this.selectedLayer.set("selected",false);}
this.selectedLayer=record;if(this.selectedLayer){this.selectedLayer.set("selected",true);}
this.fireEvent("layerselectionchange",record);}
return changed;},loadConfig:function(config){this.applyConfig(config);},applyConfig:function(config){this.initialConfig=Ext.apply({},config);Ext.apply(this,this.initialConfig);this.load();},load:function(){if(this.proxy){OpenLayers.ProxyHost=this.proxy;}
this.initMapPanel();this.initTools();var config,queue=[];for(var key in this.sources){queue.push(this.createSourceLoader(key));}
queue.push(function(done){Ext.onReady(function(){this.initPortal();done();},this);});gxp.util.dispatch(queue,this.activate,this);},createSourceLoader:function(key){return function(done){var config=this.sources[key];config.projection=this.initialConfig.map.projection;this.addLayerSource({id:key,config:config,callback:done,fallback:function(source,msg,details){done();},scope:this});};},addLayerSource:function(options){var id=options.id||Ext.id(null,"gxp-source-");var source;var config=options.config;config.id=id;try{source=Ext.ComponentMgr.createPlugin(options.config,(options.config.ptype?options.config.ptype:this.defaultSourceType));}catch(err){throw new Error("Could not create new source plugin with ptype: "+options.config.ptype);}
source.on({ready:{fn:function(){var callback=options.callback||Ext.emptyFn;callback.call(options.scope||this,id);},scope:this,single:true},failure:{fn:function(){var fallback=options.fallback||Ext.emptyFn;delete this.layerSources[id];fallback.apply(options.scope||this,arguments);},scope:this,single:true}});this.layerSources[id]=source;source.init(this);return source;},initMapPanel:function(){var config=Ext.apply({},this.initialConfig.map);var mapConfig={};if(this.initialConfig.map){var props="theme,controls,resolutions,projection,units,maxExtent,restrictedExtent,maxResolution,numZoomLevels,panMethod".split(",");var prop;for(var i=props.length-1;i>=0;--i){prop=props[i];if(prop in config){mapConfig[prop]=config[prop];delete config[prop];}}}
this.mapPanel=Ext.ComponentMgr.create(Ext.applyIf({xtype:config.xtype||"gx_mappanel",map:Ext.applyIf({theme:mapConfig.theme||null,controls:mapConfig.controls||[new OpenLayers.Control.Navigation({zoomWheelOptions:{interval:250}}),new OpenLayers.Control.PanPanel(),new OpenLayers.Control.ZoomPanel(),new OpenLayers.Control.Attribution()],maxExtent:mapConfig.maxExtent&&OpenLayers.Bounds.fromArray(mapConfig.maxExtent),restrictedExtent:mapConfig.restrictedExtent&&OpenLayers.Bounds.fromArray(mapConfig.restrictedExtent),numZoomLevels:21},mapConfig),center:config.center&&new OpenLayers.LonLat(config.center[0],config.center[1]),resolutions:config.resolutions,forceInitialExtent:true,layers:null,items:this.mapItems,plugins:this.mapPlugins,tbar:config.tbar||{hidden:true}},config));this.mapPanel.layers.on({"add":function(store,records){var record;for(var i=records.length-1;i>=0;i--){record=records[i];if(record.get("selected")===true){this.selectLayer(record);}}},"remove":function(store,record){if(record.get("selected")===true){this.selectLayer();}},scope:this});},initTools:function(){this.tools={};if(this.initialConfig.tools&&this.initialConfig.tools.length>0){var tool;for(var i=0,len=this.initialConfig.tools.length;i<len;i++){try{tool=Ext.ComponentMgr.createPlugin(this.initialConfig.tools[i],this.defaultToolType);}catch(err){throw new Error("Could not create tool plugin with ptype: "+this.initialConfig.tools[i].ptype);}
tool.init(this);}}},initPortal:function(){var config=this.portalConfig||{};if(this.portalItems.length===0){this.mapPanel.region="center";this.portalItems.push(this.mapPanel);}
this.portal=Ext.ComponentMgr.create(Ext.applyIf(config,{layout:"fit",hideBorders:true,items:{layout:"border",deferredRender:false,items:this.portalItems}}),config.renderTo?"panel":"viewport");this.fireEvent("portalready");},activate:function(){Ext.QuickTips.init();this.addLayers();this.checkLayerRecordQueue();this.fireEvent("ready");},addLayers:function(){var mapConfig=this.initialConfig.map;var selectedBackground=0;if(mapConfig&&mapConfig.layers){var conf,source,record,baseRecords=[],overlayRecords=[];for(var i=0;i<mapConfig.layers.length;++i){conf=mapConfig.layers[i];source=this.layerSources[conf.source];if(source){record=source.createLayerRecord(conf);if(record){if(record.get("group")==="background"){if(i>0&&record.get("layer").visibility===true)
{selectedBackground=i;}
if(i==0){record.get("layer").visibility=true;}else
record.get("layer").visibility=false;baseRecords.push(record);}else{overlayRecords.push(record);}}}}
var panel=this.mapPanel;var map=panel.map;var records=baseRecords.concat(overlayRecords);if(records.length){panel.layers.add(records);}
if(selectedBackground>0)
{map.layers[selectedBackground].setVisibility(true);map.layers[0].setVisibility(false);}}},getLayerRecordFromMap:function(config){var record=null;if(this.mapPanel){this.mapPanel.layers.each(function(rec){if(rec.get("source")==config.source&&rec.get("name")==config.name){record=rec;return false;}});}
return record;},createLayerRecord:function(config,callback,scope){this.createLayerRecordQueue.push({config:config,callback:callback,scope:scope});this.checkLayerRecordQueue();},checkLayerRecordQueue:function(){var request,source,record,called;var remaining=[];for(var i=0,ii=this.createLayerRecordQueue.length;i<ii;++i){called=false;request=this.createLayerRecordQueue[i];source=request.config.source;if(source in this.layerSources){record=this.layerSources[source].createLayerRecord(request.config);if(record){(function(req,rec){window.setTimeout(function(){req.callback.call(req.scope,rec);},0);})(request,record);called=true;}}
if(!called){remaining.push(request);}}
this.createLayerRecordQueue=remaining;},getSource:function(layerRec){return layerRec&&this.layerSources[layerRec.get("source")];},getState:function(){var state=Ext.apply({},this.initialConfig);var center=this.mapPanel.map.getCenter();Ext.apply(state.map,{center:[center.lon,center.lat],zoom:this.mapPanel.map.zoom,layers:[]});this.mapPanel.layers.each(function(record){var layer=record.getLayer();if(layer.displayInLayerSwitcher){var id=record.get("source");var source=this.layerSources[id];if(!source){throw new Error("Could not find source for layer '"+record.get("name")+"'");}
state.map.layers.push(source.getConfigForRecord(record));if(!state.sources[id]){state.sources[id]=Ext.apply({},source.initialConfig);}}},this);return state;},isAuthorized:function(role){return!this.authorizedRoles||(this.authorizedRoles.indexOf(role||"ROLE_ADMINISTRATOR")!==-1);},isAuthenticated:function(role){return!this.authorizedRoles||this.authorizedRoles.length>0;},destroy:function(){this.mapPanel.destroy();this.portal&&this.portal.destroy();}});(function(){OpenLayers.DOTS_PER_INCH=25.4/0.28;})();Ext.namespace("gxp");gxp.LinkEmbedMapDialog=Ext.extend(gxp.EmbedMapDialog,{linkMessage:'Paste link in email or IM',linkUrl:'',linkBox:null,initComponent:function(){Ext.apply(this,this.getConfig());gxp.LinkEmbedMapDialog.superclass.initComponent.call(this);},updateSnippetAndLink:function(){this.snippetArea.setValue('<iframe height="'+this.heightField.getValue()+'" width="'+this.widthField.getValue()+'" src="'+
gxp.util.getAbsoluteUrl(this.url)+'"></iframe>');this.linkBox.focus(true,100);},getConfig:function(){var absoluteUrl=gxp.util.getAbsoluteUrl(this.linkUrl);this.snippetArea=new Ext.form.TextArea({height:70,selectOnFocus:true,readOnly:true});var numFieldListeners={"change":this.updateSnippet,"specialkey":function(f,e){e.getKey()==e.ENTER&&this.updateSnippet();},scope:this};this.heightField=new Ext.form.NumberField({width:50,value:400,listeners:numFieldListeners});this.widthField=new Ext.form.NumberField({width:50,value:600,listeners:numFieldListeners});this.linkBox=new Ext.form.TextField({value:absoluteUrl,listeners:{"focus":function(){this.selectText();}}});var adjustments=new Ext.Container({layout:"column",defaults:{border:false,xtype:"box"},items:[{autoEl:{cls:"gx-field-label",html:this.mapSizeLabel}},new Ext.form.ComboBox({editable:false,width:75,store:new Ext.data.SimpleStore({fields:["name","height","width"],data:[[this.miniSizeLabel,100,100],[this.smallSizeLabel,200,300],[this.largeSizeLabel,400,600],[this.premiumSizeLabel,600,800]]}),triggerAction:'all',displayField:'name',value:this.largeSizeLabel,mode:'local',listeners:{"select":function(combo,record,index){this.widthField.setValue(record.get("width"));this.heightField.setValue(record.get("height"));this.updateSnippet();},scope:this}}),{autoEl:{cls:"gx-field-label",html:this.heightLabel}},this.heightField,{autoEl:{cls:"gx-field-label",html:this.widthLabel}},this.widthField]});return{border:false,defaults:{border:false,cls:"gx-export-section",xtype:"container",layout:"fit"},items:[{xtype:"box",autoEl:{tag:"div",html:this.linkMessage}},{items:[this.linkBox]},{xtype:"box",autoEl:{tag:"div",html:this.publishMessage}},{items:[this.snippetArea]},{items:[adjustments]}],listeners:{"afterrender":this.updateSnippetAndLink,scope:this}}}});Ext.reg('gx_linkembedmapdialog',gxp.LinkEmbedMapDialog);Ext.namespace("gxp.menu");gxp.menu.LayerMenu=Ext.extend(Ext.menu.Menu,{layerText:"Layer",layers:null,initComponent:function(){gxp.menu.LayerMenu.superclass.initComponent.apply(this,arguments);this.layers.on("add",this.onLayerAdd,this);this.onLayerAdd();},onRender:function(ct,position){gxp.menu.LayerMenu.superclass.onRender.apply(this,arguments);},beforeDestroy:function(){if(this.layers&&this.layers.on){this.layers.un("add",this.onLayerAdd,this);}
delete this.layers;gxp.menu.LayerMenu.superclass.beforeDestroy.apply(this,arguments);},onLayerAdd:function(){this.removeAll();this.add({iconCls:"gxp-layer-visibility",text:this.layerText,canActivate:false},"-");this.layers.each(function(record){var layer=record.getLayer();if(layer.displayInLayerSwitcher){var item=new Ext.menu.CheckItem({text:record.get("title"),checked:record.getLayer().getVisibility(),group:record.get("group"),listeners:{checkchange:function(item,checked){record.getLayer().setVisibility(checked);}}});if(this.items.getCount()>2){this.insert(2,item);}else{this.add(item);}}},this);}});Ext.reg('gxp_layermenu',gxp.menu.LayerMenu);GeoExt.Lang.add("es",{"gxp.menu.LayerMenu.prototype":{layerText:"Capa"},"gxp.plugins.AddLayers.prototype":{addActionMenuText:"Añadir Capas",addActionTip:"Añadir Capas",addServerText:"Añadir servidor",addButtonText:"Añadir Capas",untitledText:"Sin Título",addLayerSourceErrorText:"Error obteniendo capabilities de WMS ({msg}).\nPor favor, compruebe la URL y vuelva a intentarlo.",availableLayersText:"Capas disponibles",expanderTemplateText:"<p><b>Resumen:</b> {abstract}</p>",panelTitleText:"Título",layerSelectionText:"Ver datos disponibles de:",doneText:"Hecho",uploadText:"Subir Datos"},"gxp.plugins.BingSource.prototype":{title:"Capas Bing",roadTitle:"Bing Carreteras",aerialTitle:"Bing Foto Aérea",labeledAerialTitle:"Bing Híbrido"},"gxp.plugins.FeatureEditor.prototype":{createFeatureActionTip:"Crear nuevo elemento",editFeatureActionTip:"Editar elemento existente"},"gxp.plugins.FeatureGrid.prototype":{displayFeatureText:"Mostrar en el mapa",firstPageTip:"Primera página",previousPageTip:"Página anterior",zoomPageExtentTip:"Zoom a la extensión de la página",nextPageTip:"Página siguiente",nextPageTip:"Última página",totalMsg:"Total: {0} records"},"gxp.plugins.GoogleEarth.prototype":{apiKeyPrompt:"Please enter the Google API key for ",menuText:"Vista 3D",tooltip:"Vista 3D"},"gxp.plugins.GoogleSource.prototype":{title:"Capas Google",roadmapAbstract:"Mostrar Callejero",satelliteAbstract:"Mostrar imágenes aéreas",hybridAbstract:"Mostrar imágenes con nombres de calle",terrainAbstract:"Mostrar callejero con terreno"},"gxp.plugins.LayerProperties.prototype":{menuText:"Propiedades de la capa",toolTip:"Propiedades de la capa"},"gxp.plugins.LayerTree.prototype":{rootNodeText:"Capas",overlayNodeText:"Capas superpuestas",baseNodeText:"Capa base"},"gxp.plugins.Legend.prototype":{menuText:"Leyenda",tooltip:"Leyenda"},"gxp.plugins.LoadingIndicator.prototype":{loadingMapMessage:"Loading Map..."},"gxp.plugins.MapBoxSource.prototype":{title:"MapBox Layers",blueMarbleTopoBathyJanTitle:"Blue Marble Topography & Bathymetry (January)",blueMarbleTopoBathyJulTitle:"Blue Marble Topography & Bathymetry (July)",blueMarbleTopoJanTitle:"Blue Marble Topography (January)",blueMarbleTopoJulTitle:"Blue Marble Topography (July)",controlRoomTitle:"Control Room",geographyClassTitle:"Geography Class",naturalEarthHypsoTitle:"Natural Earth Hypsometric",naturalEarthHypsoBathyTitle:"Natural Earth Hypsometric & Bathymetry",naturalEarth1Title:"Natural Earth I",naturalEarth2Title:"Natural Earth II",worldDarkTitle:"World Dark",worldLightTitle:"World Light",worldPrintTitle:"World Print"},"gxp.plugins.Measure.prototype":{lengthMenuText:"Longitud",areaMenuText:"Área",lengthTooltip:"Medir Longitud",areaTooltip:"Medir Área",measureTooltip:"Medir"},"gxp.plugins.Navigation.prototype":{menuText:"Desplazar mapa",tooltip:"Desplazar mapa"},"gxp.plugins.NavigationHistory.prototype":{previousMenuText:"Vista anterior",nextMenuText:"Vista siguiente",previousTooltip:"Vista anterior",nextTooltip:"Vista siguiente"},"gxp.plugins.OSMSource.prototype":{title:"Capas OpenStreetMap",mapnikAttribution:"Datos CC-By-SA de <a href='http://openstreetmap.org/'>OpenStreetMap</a>",osmarenderAttribution:"Datos CC-By-SA de <a href='http://openstreetmap.org/'>OpenStreetMap</a>"},"gxp.plugins.Print.prototype":{menuText:"Imprimir mapa",tooltip:"Imprimir mapa",previewText:"Vista previa",notAllNotPrintableText:"No se pueden imprimir todas las capas",nonePrintableText:"No se puede imprimir ninguna de las capas del mapa"},"gxp.plugins.MapQuestSource.prototype":{title:"Capas MapQuest",osmAttribution:"Teselas cortesía de <a href='http://open.mapquest.co.uk/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>",osmTitle:"MapQuest OpenStreetMap",naipAttribution:"Teselas cortesía de <a href='http://open.mapquest.co.uk/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>",naipTitle:"MapQuest Imágenes"},"gxp.plugins.QueryForm.prototype":{queryActionText:"Consultar",queryMenuText:"Consultar capa",queryActionTip:"Consultar la capa seleccionada",queryByLocationText:"Consultar por localización",currentTextText:"Extensión actual",queryByAttributesText:"Consultar por atributos",queryMsg:"Consultando...",cancelButtonText:"Cancelar",noFeaturesTitle:"Sin coincidencias",noFeaturesMessage:"Su consulta no produjo resultados."},"gxp.plugins.RemoveLayer.prototype":{removeMenuText:"Eliminar Capa",removeActionTip:"Eliminar Capa"},"gxp.plugins.Styler.prototype":{menuText:"Editar estilos",tooltip:"Gestionar estilos de capa"},"gxp.plugins.WMSGetFeatureInfo.prototype":{infoActionTip:"Consultar elementos",popupTitle:"Información de elementos"},"gxp.plugins.Zoom.prototype":{zoomInMenuText:"Acercar",zoomOutMenuText:"Alejar",zoomInTooltip:"Acercar",zoomOutTooltip:"Alejar"},"gxp.plugins.ZoomToExtent.prototype":{menuText:"Ver extensión total",tooltip:"Ver extensión total"},"gxp.plugins.ZoomToDataExtent.prototype":{menuText:"Ver toda la capa",tooltip:"Ver toda la capa"},"gxp.plugins.ZoomToLayerExtent.prototype":{menuText:"Ver toda la la capa",tooltip:"Ver toda la capa"},"gxp.plugins.ZoomToSelectedFeatures.prototype":{menuText:"Ver los elementos seleccionados",tooltip:"Ver los elementos seleccionados"},"gxp.FeatureEditPopup.prototype":{closeMsgTitle:"¿Desea guardar los cambios?",closeMsg:"Los cambios en este elemento no se han guardado. ¿Desea guardar los cambios?",deleteMsgTitle:"¿Desea borrar el elemento?",deleteMsg:"¿Está seguro de querer borrar este elemento?",editButtonText:"Editar",editButtonTooltip:"Hacer editable este elemento",deleteButtonText:"Borrar",deleteButtonTooltip:"Borrar este elemento",cancelButtonText:"Cancelar",cancelButtonTooltip:"Dejar de editar, descartar cambios",saveButtonText:"Guardar",saveButtonTooltip:"Guardar cambios"},"gxp.FillSymbolizer.prototype":{fillText:"Relleno",colorText:"Color",opacityText:"Opacidad"},"gxp.FilterBuilder.prototype":{builderTypeNames:["cualquiera de","todas","ninguna de","no todas"],preComboText:"Cumplir",postComboText:"las condiciones siguientes:",addConditionText:"añadir condición",addGroupText:"añadir grupo",removeConditionText:"eliminar condición"},"gxp.grid.CapabilitiesGrid.prototype":{nameHeaderText:"Nombre",titleHeaderText:"Título",queryableHeaderText:"Consultable",layerSelectionLabel:"Ver datos disponibles de:",layerAdditionLabel:"o añadir otro servidor.",expanderTemplateText:"<p><b>Resumen:</b> {abstract}</p>"},"gxp.PointSymbolizer.prototype":{graphicCircleText:"círculo",graphicSquareText:"cuadrado",graphicTriangleText:"triángulo",graphicStarText:"estrella",graphicCrossText:"cruz",graphicXText:"x",graphicExternalText:"externo",urlText:"URL",opacityText:"opacidad",symbolText:"Símbolo",sizeText:"Tamaño",rotationText:"Giro"},"gxp.QueryPanel.prototype":{queryByLocationText:"Consultar por localización",currentTextText:"Extensión actual",queryByAttributesText:"Consultar por atributo",layerText:"Capa"},"gxp.RulePanel.prototype":{scaleSliderTemplate:"{scaleType} Escala 1:{scale}",labelFeaturesText:"Etiquetado de elementos",labelsText:"Etiquetas",basicText:"Básico",advancedText:"Advanzado",limitByScaleText:"Limitar por escala",limitByConditionText:"Limitar por condición",symbolText:"Símbolo",nameText:"Nombre"},"gxp.ScaleLimitPanel.prototype":{scaleSliderTemplate:"{scaleType} Escala 1:{scale}",minScaleLimitText:"Escala mínima",maxScaleLimitText:"Escala máxima"},"gxp.StrokeSymbolizer.prototype":{solidStrokeName:"continuo",dashStrokeName:"guiones",dotStrokeName:"puntos",titleText:"Trazo",styleText:"Estilo",colorText:"Color",widthText:"Ancho",opacityText:"Opacidad"},"gxp.StylePropertiesDialog.prototype":{titleText:"General",nameFieldText:"Nombre",titleFieldText:"Título",abstractFieldText:"Resumen"},"gxp.TextSymbolizer.prototype":{labelValuesText:"Etiquetado",haloText:"Halo",sizeText:"Tamaño"},"gxp.WMSLayerPanel.prototype":{aboutText:"Acerca de",titleText:"Título",nameText:"Nombre",descriptionText:"Descripción",displayText:"Mostrar",opacityText:"Opacidad",formatText:"Formato",transparentText:"Transparente",cacheText:"Caché",cacheFieldText:"Usar la versión en caché",stylesText:"Estilos",infoFormatText:"Info format",infoFormatEmptyText:"Select a format"},"gxp.EmbedMapDialog.prototype":{publishMessage:"¡Ya puede publicar su mapa en otras webs! Simplemente copie el siguiente código HTML en el lugar donde desee incrustarlo:",heightLabel:'Alto',widthLabel:'Ancho',mapSizeLabel:'Tamaño',miniSizeLabel:'Mínimo',smallSizeLabel:'Pequeño',premiumSizeLabel:'Premium',largeSizeLabel:'Grande'},"gxp.WMSStylesDialog.prototype":{addStyleText:"Añadir",addStyleTip:"Añadir un estilo",chooseStyleText:"Escoger estilo",deleteStyleText:"Quitar",deleteStyleTip:"Borrar el estilo seleccionado",editStyleText:"Cambiar",editStyleTip:"Editar el estilo seleccionado",duplicateStyleText:"Clonar",duplicateStyleTip:"Duplicar el estilo seleccionado",addRuleText:"Añadir",addRuleTip:"Añadir una regla",newRuleText:"Nueva regla",deleteRuleText:"Quitar",deleteRuleTip:"Borrar la regla seleccionada",editRuleText:"Cambiar",editRuleTip:"Editar la regla seleccionada",duplicateRuleText:"Duplicar",duplicateRuleTip:"Duplicar la regla seleccionada",cancelText:"Cancelar",saveText:"Guardar",styleWindowTitle:"Estilo: {0}",ruleWindowTitle:"Regla: {0}",stylesFieldsetTitle:"Estilos",rulesFieldsetTitle:"Reglas"},"gxp.LayerUploadPanel.prototype":{titleLabel:"Título",titleEmptyText:"Título de la capa",abstractLabel:"Descripción",abstractEmptyText:"Descripción de la capa",fileLabel:"Datos",fieldEmptyText:"Navegue por los datos...",uploadText:"Subir",waitMsgText:"Suba sus datos data...",invalidFileExtensionText:"El fichero debe tener alguna de estas extensiones: ",optionsText:"Opciones",workspaceLabel:"Espacio de trabajo",workspaceEmptyText:"Espacio de trabajo por defecto",dataStoreLabel:"Almacén de datos",dataStoreEmptyText:"Almacén de datos por defecto"},"gxp.NewSourceWindow.prototype":{title:"Añadir Servidor...",cancelText:"Cancelar",addServerText:"Añadir Servidor",invalidURLText:"Enter a valid URL to a WMS endpoint (e.g. http://example.com/geoserver/wms)",contactingServerText:"Conectando con el Servidor..."},"gxp.ScaleOverlay.prototype":{zoomLevelText:"Escala"}});GeoExt.Lang.add("fr",{"gxp.plugins.AddLayers.prototype":{addActionMenuText:"Ajouter des calques",addActionTip:"Ajouter des calques",addServerText:"Ajouter un nouveau serveur",untitledText:"Sans titre",addLayerSourceErrorText:"Erreur capacités WMS obtenir ({msg}).\nVeuillez vérifier URL et essayez à nouveau.",availableLayersText:"Layers disponible",doneText:"Terminé",uploadText:"Upload Data"},"gxp.plugins.BingSource.prototype":{title:"Calques Bing",roadTitle:"Bing routes",aerialTitle:"Bing aérienne",labeledAerialTitle:"Bing aérienne avec des étiquettes"},"gxp.plugins.FeatureEditor.prototype":{createFeatureActionTip:"Créer une nouvelle fonctionnalité",editFeatureActionTip:"Modifier les existants fonction"},"gxp.plugins.FeatureGrid.prototype":{displayFeatureText:"Afficher sur la carte",firstPageTip:"Première page",previousPageTip:"Page précédente",zoomPageExtentTip:"Zoom sur la page",nextPageTip:"Page suivante",nextPageTip:"Dernière page",totalMsg:"Total: {0} records"},"gxp.plugins.GoogleEarth.prototype":{apiKeyPrompt:"Please enter the Google API key for ",menuText:"Passer à la visionneuse 3D",tooltip:"Passer à la visionneuse 3D"},"gxp.plugins.GoogleSource.prototype":{title:"Calques Google",roadmapAbstract:"Voir carte de rue",satelliteAbstract:"Voir les images satellite",hybridAbstract:"Afficher des images avec des noms de rue",terrainAbstract:"Voir carte de rue avec le terrain"},"gxp.plugins.LayerProperties.prototype":{menuText:"Propriétés de la couche",toolTip:"Propriétés de la couche"},"gxp.plugins.LayerTree.prototype":{rootNodeText:"Layers",overlayNodeText:"Surimpressions",baseNodeText:"Couches"},"gxp.plugins.Legend.prototype":{menuText:"Légende",tooltip:"Légende"},"gxp.plugins.Measure.prototype":{lengthMenuText:"Longueur",areaMenuText:"Zone",lengthTooltip:"Mesure Longueur",areaTooltip:"Mesure Zone",measureTooltip:"Mesure"},"gxp.plugins.Navigation.prototype":{menuText:"Plan Pan",tooltip:"Plan Pan"},"gxp.plugins.NavigationHistory.prototype":{previousMenuText:"Zoom précédent Un",nextMenuText:"Zoom sure une Next",previousTooltip:"Zoom précédent Un",nextTooltip:"Zoom sur une Next"},"gxp.plugins.LoadingIndicator.prototype":{loadingMapMessage:"Loading Map..."},"gxp.plugins.MapBoxSource.prototype":{title:"MapBox Layers",blueMarbleTopoBathyJanTitle:"Blue Marble Topography & Bathymetry (January)",blueMarbleTopoBathyJulTitle:"Blue Marble Topography & Bathymetry (July)",blueMarbleTopoJanTitle:"Blue Marble Topography (January)",blueMarbleTopoJulTitle:"Blue Marble Topography (July)",controlRoomTitle:"Control Room",geographyClassTitle:"Geography Class",naturalEarthHypsoTitle:"Natural Earth Hypsometric",naturalEarthHypsoBathyTitle:"Natural Earth Hypsometric & Bathymetry",naturalEarth1Title:"Natural Earth I",naturalEarth2Title:"Natural Earth II",worldDarkTitle:"World Dark",worldLightTitle:"World Light",worldPrintTitle:"World Print"},"gxp.plugins.OSMSource.prototype":{title:"Calques OpenStreetMap",mapnikAttribution:"Les données CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>",osmarenderAttribution:"Les données CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>"},"gxp.plugins.Print.prototype":{menuText:"Imprimer carte",tooltip:"Imprimer carte",previewText:"Aperçu avant impression",notAllNotPrintableText:"Non Tous les couches peuvent être imprimés",nonePrintableText:"Aucune de vos couches de carte peut être imprimée"},"gxp.plugins.MapQuestSource.prototype":{title:"MapQuest Layers",osmAttribution:"Avec la permission de tuiles <a href='http://open.mapquest.co.uk/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>",osmTitle:"MapQuest OpenStreetMap",naipAttribution:"Avec la permission de tuiles <a href='http://open.mapquest.co.uk/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>",naipTitle:"MapQuest Imagery"},"gxp.plugins.QueryForm.prototype":{queryActionText:"Query",queryMenuText:"Couche de requêtes",queryActionTip:"Interroger la couche sélectionnée",queryByLocationText:"Query selon le lieu",currentTextText:"Mesure actuelle",queryByAttributesText:"Requête par attributs"},"gxp.plugins.RemoveLayer.prototype":{removeMenuText:"Enlever la couche",removeActionTip:"Enlever la couche"},"gxp.plugins.WMSGetFeatureInfo.prototype":{infoActionTip:"Get Feature Info",popupTitle:"entité Info"},"gxp.plugins.Zoom.prototype":{zoomInMenuText:"Zoom In",zoomOutMenuText:"Zoom arrière",zoomInTooltip:"Zoom In",zoomOutTooltip:"Zoom arrière"},"gxp.plugins.ZoomToExtent.prototype":{menuText:"Zoom sur la carte Max",tooltip:"Zoom sur la carte Max"},"gxp.plugins.ZoomToDataExtent.prototype":{menuText:"Zoom sur la couche",tooltip:"Zoom sur la couche"},"gxp.plugins.ZoomToLayerExtent.prototype":{menuText:"Zoom à la couche",tooltip:"Zoom à la couche"},"gxp.plugins.ZoomToSelectedFeatures.prototype":{menuText:"Zoom sur les fonctions sélectionnées",tooltip:"Zoom sur les caractéristiques sélectionnées"},"gxp.FeatureEditPopup.prototype":{closeMsgTitle:"Enregistrer les modifications?",closeMsg:"Cette fonction a des modifications non enregistrées. Voulez-vous enregistrer vos modifications?",deleteMsgTitle:"Supprimer entité?",deleteMsg:"Etes-vous sûr de vouloir supprimer cette fonctionnalité?",editButtonText:"Modifier",editButtonTooltip:"Faire de cette fonctionnalité modifiable",deleteButtonText:"Supprimer",deleteButtonTooltip:"Supprimer cette fonction",cancelButtonText:"Annuler",cancelButtonTooltip:"Arrêter de modifier, annuler les modifications",saveButtonText:"Enregistrer",saveButtonTooltip:"Enregistrer les modifications"},"gxp.FillSymbolizer.prototype":{fillText:"Remplir",colorText:"Couleur",opacityText:"Opacité"},"gxp.FilterBuilder.prototype":{builderTypeNames:["Tout","tous","aucun","pas tout"],preComboText:"Match",postComboText:"de ce qui suit:",addConditionText:"Ajouter la condition",addGroupText:"Ajouter un groupe",removeConditionText:"Supprimer la condition"},"gxp.grid.CapabilitiesGrid.prototype":{nameHeaderText:"Nom",titleHeaderText:"Titre",queryableHeaderText:"Queryable",layerSelectionLabel:"Voir les données disponibles à partir de:",layerAdditionLabel:"ou ajouter un nouveau serveur.",expanderTemplateText:"<p><b>Résumé:</b> {abstract}</p>"},"gxp.PointSymbolizer.prototype":{graphicCircleText:"Cercle",graphicSquareText:"Carré",graphicTriangleText:"Triangle",graphicStarText:"Étoile",graphicCrossText:"Croix",graphicXText:"x",graphicExternalText:"Externe",urlText:"URL",opacityText:"Opacité",symbolText:"Symbole",sizeText:"Taille",rotationText:"Rotation"},"gxp.QueryPanel.prototype":{queryByLocationText:"Query selon le lieu",currentTextText:"Mesure actuelle",queryByAttributesText:"Requête par attributs",layerText:"Calque"},"gxp.RulePanel.prototype":{scaleSliderTemplate:"{scaleType} échelle 1:{scale}",labelFeaturesText:"Label Caractéristiques",advancedText:"Avancé",limitByScaleText:"Limiter par l'échelle",limitByConditionText:"Limiter par condition",symbolText:"Symbole",nameText:"Nom"},"gxp.ScaleLimitPanel.prototype":{scaleSliderTemplate:"{scaleType} échelle 1:{scale}",maxScaleLimitText:"Max limite d'échelle"},"gxp.TextSymbolizer.prototype":{labelValuesText:"Label valeurs",haloText:"Halo",sizeText:"Taille"},"gxp.WMSLayerPanel.prototype":{aboutText:"A propos",titleText:"Titre",nameText:"Nom",descriptionText:"Description",displayText:"Affichage",opacityText:"Opacité",formatText:"Format",transparentText:"Transparent",cacheText:"Cache",cacheFieldText:"Utiliser la version mise en cache",infoFormatText:"Info format",infoFormatEmptyText:"Select a format"},"gxp.EmbedMapDialog.prototype":{publishMessage:"Votre carte est prête à être publiée sur le web Il suffit de copier le code HTML suivant pour intégrer la carte dans votre site Web:",heightLabel:'Hauteur',widthLabel:'Largeur',mapSizeLabel:'Taille de la carte',miniSizeLabel:'Mini',smallSizeLabel:'Petit',premiumSizeLabel:'Premium',largeSizeLabel:'Large'},"gxp.LayerUploadPanel.prototype":{titleLabel:"Titre",titleEmptyText:"Titre de la couche",abstractLabel:"Description",abstractEmptyText:"Description couche",fileLabel:"Données",fieldEmptyText:"Parcourir pour ...",uploadText:"Upload",waitMsgText:"Transfert de vos données ...",invalidFileExtensionText:"Extension de fichier doit être: ",optionsText:"Options",workspaceLabel:"Espace de travail",workspaceEmptyText:"Espace de travail par défaut",dataStoreLabel:"Magasin de données",dataStoreEmptyText:"Magasin de données par défaut"},"gxp.NewSourceWindow.prototype":{title:"Add New Server...",cancelText:"Cancel",addServerText:"Add Server",invalidURLText:"Enter a valid URL to a WMS endpoint (e.g. http://example.com/geoserver/wms)",contactingServerText:"Contacting Server..."},"gxp.ScaleOverlay.prototype":{zoomLevelText:"Niveau de zoom"}});
