Ext.ns('App');
/**
* The model for the geonames records used in the search
*/
Ext.regModel('Geonames', {
fields: ['countryName', 'toponymName', 'name', 'lat', 'lng']
});
/**
* Custom class for the Search
*/
App.SearchFormPopupPanel = Ext.extend(Ext.Panel, {
map: null,
floating: true,
modal: true,
centered: true,
hideOnMaskTap: true,
width: Ext.is.Phone ? undefined : 400,
height: Ext.is.Phone ? undefined : 400,
scroll: false,
layout: 'fit',
fullscreen: Ext.is.Phone ? true : undefined,
url: 'http://ws.geonames.org/searchJSON?',
errorText: 'Sorry, we had problems communicating with geonames.org. Please try again.',
errorTitle: 'Communication error',
maxResults: 6,
featureClass: "P",
createStore: function(){
this.store = new Ext.data.Store({
model: 'Geonames',
proxy: {
type: 'scripttag',
timeout: 5000,
listeners: {
exception: function(){
this.hide();
Ext.Msg.alert(this.errorTitle, this.errorText, Ext.emptyFn);
},
scope: this
},
url: this.url,
reader: {
type: 'json',
root: 'geonames'
}
}
});
},
doSearch: function(searchfield, evt){
var q = searchfield.getValue();
this.store.load({
params: {
featureClass: this.featureClass,
maxRows: this.maxResults,
name_startsWith: encodeURIComponent(q)
}
});
},
onItemTap: function(dataView, index, item, event){
var record = this.store.getAt(index);
var lon = record.get('lng');
var lat = record.get('lat');
var lonlat = new OpenLayers.LonLat(lon, lat);
map.setCenter(lonlat.transform(gg, sm), 12);
this.hide("pop");
},
initComponent: function(){
this.createStore();
this.resultList = new Ext.List({
scroll: 'vertical',
cls: 'searchList',
loadingText: "Searching ...",
store: this.store,
itemTpl: '
{name} ({countryName})
',
listeners: {
itemtap: this.onItemTap,
scope: this
}
});
this.formContainer = new Ext.form.FormPanel({
scroll: false,
items: [{
xtype: 'button',
cls: 'close-btn',
ui: 'decline-small',
text: 'Close',
handler: function(){
this.hide();
},
scope: this
}, {
xtype: 'fieldset',
scroll: false,
title: 'Search for a place',
items: [{
xtype: 'searchfield',
label: 'Search',
placeHolder: 'placename',
listeners: {
action: this.doSearch,
scope: this
}
},
this.resultList
]
}]
});
this.items = [{
xtype: 'panel',
layout: 'fit',
items: [this.formContainer]
}];
App.SearchFormPopupPanel.superclass.initComponent.call(this);
}
});
App.LayerList = Ext.extend(Ext.List, {
map: null,
createStore: function(){
Ext.regModel('Layer', {
fields: ['id', 'name', 'visibility', 'zindex']
});
var data = [];
Ext.each(this.map.layers, function(layer){
if (layer.displayInLayerSwitcher === true) {
var visibility = layer.isBaseLayer ? (this.map.baseLayer == layer) : layer.getVisibility();
data.push({
id: layer.id,
name: layer.name,
visibility: visibility,
zindex: layer.getZIndex()
});
}
});
return new Ext.data.Store({
model: 'Layer',
sorters: 'zindex',
data: data
});
},
initComponent: function(){
this.store = this.createStore();
this.itemTpl = new Ext.XTemplate(
'',
'',
'',
'',
'',
'',
'{name}'
);
this.listeners = {
itemtap: function(dataview, index, item, e){
var record = dataview.getStore().getAt(index);
var layer = this.map.getLayersBy("id", record.get("id"))[0];
if (layer.isBaseLayer) {
this.map.setBaseLayer(layer);
}
else {
layer.setVisibility(!layer.getVisibility());
}
record.set("visibility", layer.getVisibility());
}
};
this.map.events.on({
"changelayer": this.onChangeLayer,
scope: this
});
App.LayerList.superclass.initComponent.call(this);
},
findLayerRecord: function(layer){
var found;
this.store.each(function(record){
if (record.get("id") === layer.id) {
found = record;
}
}, this);
return found;
},
onChangeLayer: function(evt){
if (evt.property == "visibility") {
var record = this.findLayerRecord(evt.layer);
record.set("visibility", evt.layer.getVisibility());
}
}
});
Ext.reg('app_layerlist', App.LayerList);