Ext.namespace('GUI');

var map;
var vectors = null;
var selectedFeature = null;
var toc;
var baseLayerList;
var toolbar1 = new Ext.Toolbar();
var toolbar2 = new Ext.Toolbar();
var username = 'd';

var _active_level = null;

Ext.onReady(function() {

	OpenLayers.IMAGE_RELOAD_ATTEMPTS = 4;
	
	//var toolbar1 = new Ext.Toolbar();
	//var toolbar2 = new Ext.Toolbar();
    var toolbar3 = new Ext.Toolbar();

	var mapOptions = {
        resolutions: [404.98, 176.388793638940000, 70.555517455576100, 35.277758727788100, 17.638879363894000, 7.055551745557610, 3.527775872778810, 1.763887936389400, 0.705555174555761, 0.352777587277881, 0.176388793638940, 0.035277758727788, 0.017638879363894],
		projection: 'EPSG:3301',
        maxExtent: new OpenLayers.Bounds(368020.14,	6376140.65, 740156.25, 6635019.07)
	};

	var layers = [
		new OpenLayers.Layer.WMS(
			"Ortofoto",
			"http://xgis.maaamet.ee/wms-pub/alus?",
			{layers: 'halduspiirid,baaskaart,maanteed,of10000', format: "image/gif"},
			{isBaseLayer: true, visibility: false}
		)
	];
	layers[0].id = 863;

	//Ext.QuickTips.init();   
          
    this.searchMenu = new Ext.menu.Menu({
        id: 'basicMenu'
    });

	this.downloadMenu = new Ext.menu.Menu({
        id: 'downloadMenu'
    });
    
    this.applicationMenu = new Ext.menu.Menu({
        id: 'applicationsMenu'
    });
     
    var tb = new Ext.Toolbar({items:[
        '<img src="/geoweb/media/img/logo_geoweb3.gif" alt="Geoweb"/>',
        '-',
        {text:'Otsing', menu: this.searchMenu}, 
        //{text:'Väljundid', menu: this.downloadMenu}, 
        {text:'Rakendused', menu: this.applicationMenu},
        {text:'Logi välja', handler: function(){window.location='/geoweb/logout/';}},
        {xtype:'tbfill'}
    ]});
    
    this.tb = tb;

	var panel = new Ext.Panel({
		border: false,
		layout: 'fit',
        tbar: tb,
        bodyStyle: "background-color:black"/*,
        bbar: new Ext.StatusBar({
            defaultText: 'OK',
            id: 'statusbar',
            statusAlign: 'right',
            items: ['<span id="coordspan"></span>']
        })*/
	});
	
	var vp = new Ext.Viewport({
		layout: 'fit',
		items: panel
	});

	map = new OpenLayers.Map(panel.body.dom, mapOptions);
	
	if (layers.length > 0)
		map.addLayers(layers);

	var editlayer = new OpenLayers.Layer.Vector('editlayer');
	editlayer.visibleInExtendedToc = false;
	map.addLayer(editlayer);
    
    
    var scalebar = new OpenLayers.Control.ScaleBar({abbreviateLabel: true});
    map.addControl(scalebar);
    
    //editlayer = map.getLayersByName('editlayer')[0]
    //editlayer.events.register('featureselected', null, function(obj){alert(obj);});
    
    sf = new OpenLayers.Control.SelectFeature(editlayer); 
    
    editlayer.events.register('featureadded', null, function(obj){sf.unselectAll(); sf.select(obj.feature);});
    
    /*
    var overviewMapWindow = new Ext.Window({
        title: 'Väikene kaardike',
        autoWidth: true,
        autoHeight: true,
        html: '<div id="overviewmap"></div>'
    });
    overviewMapWindow.show();
    var overviewmap = document.getElementById("overviewmap");

	map.addControl(new OpenLayers.Control.OverviewMap({minRatio: 2, maxRatio: 8, mapOptions: mapOptions, div:overviewmap }));
    */
    
    /*   
    var coordspan = document.getElementById("coordspan");
    map.addControl(new OpenLayers.Control.MousePosition({div: coordspan}));
    */
        
	var toolbarWindow1 = new Ext.Window({
		title: 'Navigeerimine',
		border: false,
		width: 350,
		autoHeight: true,
		items: toolbar1,
		closable: false
	});
	toolbarWindow1.show();
	toolbarWindow1.setPosition(10,45);
	
	var toolbarWindow2 = new Ext.Window({
		title: 'Joonistamine',
		border: false,
		width: 200,
		autoHeight: true,
		items: toolbar2,
		closable: false
	});
	toolbarWindow2.show();
	toolbarWindow2.setPosition(10,435);
    
    var toolbarWindow3 = new Ext.Window({
		title: 'Aluskaart',
		border: false,
		width: 200,
		autoHeight: true,
		items: toolbar3,
		closable: false
	});
	toolbarWindow3.show();
	toolbarWindow3.setPosition(10,370);

	// map action is an extended Ext.Action that can be used as a button or menu item
	toolbar1.add('-');
	toolbar1.add(new WebGIS.MapAction.DragPan({map: map}));
	toolbar1.add(new WebGIS.MapAction.ZoomInBox({map: map}));
	toolbar1.add(new WebGIS.MapAction.ZoomOutBox({map: map}));
	//toolbar1.add(new WebGIS.MapAction.ZoomIn({map: map}));
	//toolbar1.add(new WebGIS.MapAction.ZoomOut({map: map}));
	//toolbar1.add(new WebGIS.MapAction.PreviousExtent({map: map}));
	//toolbar1.add(new WebGIS.MapAction.NextExtent({map: map}));
	//toolbar1.add(new WebGIS.MapAction.FullExtent({map: map}));
	toolbar1.add(new WebGIS.MapAction.MeasureLine({map: map}));
	toolbar1.add(new WebGIS.MapAction.MeasureArea({map: map}));
	toolbar1.add('-');
	//toolbar1.add({xtype: 'webgis-scalelist', map: map});
    
	toolbar2.add(new WebGIS.MapAction.DrawFeature({map: map, layer: editlayer, geometryType: 'OpenLayers.Geometry.Point'}));
	toolbar2.add(new WebGIS.MapAction.DrawFeature({map: map, layer: editlayer, geometryType: 'OpenLayers.Geometry.Curve'}));
	toolbar2.add(new WebGIS.MapAction.DrawFeature({map: map, layer: editlayer, geometryType: 'OpenLayers.Geometry.Polygon'}));
	toolbar2.add('-');
    toolbar2.add(new WebGIS.MapAction.SelectFeature({map: map, layer: editlayer, options: {clickout: true, /*toggle: true,*/ multiple: false, hover: false, multipleKey: "ctrlKey", toggleKey: "ctrlKey"} }));
    
    map.addControl(new OpenLayers.Control.ModifyFeature(editlayer));
    
	//toolbar2.add(new WebGIS.MapAction.ModifyFeature({map: map, layer: editlayer}));
	//toolbar2.add(new WebGIS.MapAction.DragFeature({map: map, layer: editlayer}));
	toolbar2.add(new WebGIS.MapAction.RemoveSelectedFeatures({map: map, layer: editlayer}));
    
    //toolbar3.add({xtype: 'webgis-baselayerlist', map: map});
    
    baseLayerList = new WebGIS.BaseLayerList({map: map})
    toolbar3.add(baseLayerList);

	/*var*/ /*toc = new WebGIS.Toc({map: map, useMetadata: true, autoScroll: true});*/
    toc = new WebGIS.ExtendedToc({map: map, useMetadata: true, autoScroll: true})
	var w = new Ext.Window({
		title: 'Kihid',
		border: false,
		layout: 'fit',
		width: 200,
		height: 250,
		items: toc,
		closable: false
	});
	w.show();
	w.setPosition(10,110);
	
	resultTo = new Ext.Window( {
		title : 'Päringu tulemused',
		closeAction :'hide',
		width :320,
		autoScroll: true,
		constrainHeader: true
    });
	resultTo.on('hide', function(){GUI.removeVectorFeatures();});
	
	toolbar1.add(new WebGIS.MapAction.Identify({map: map, toc: toc, resultTo: resultTo}));
}, GUI);

//Ext.onReady(GUI.Application.init, GUI.Application);

GUI.showElementInfo = function(elementId, editable) {
    
    var windowId = elementId;
    
    elementInfoWindow = Ext.WindowMgr.get(windowId)
    if (elementInfoWindow == null) {
      var elementInfoWindow = new Ext.Window({
          title: 'Info',
          border: false,
          width: 640,
          height: 640,
          //autoWidth: true,
          //autoHeight: true,
          html: '<iframe style="width: 100%; height: 100%; border: none;" src="/geoweb/map/element/' + elementId + '/?_popup=' + windowId + '"></iframe>',
          id: windowId,
          constrainHeader: true
		  //minimizable: true
      });
      elementInfoWindow.on('close', function(){GUI.removeFeature(elementId);})
      elementInfoWindow.show();
    }
}

GUI.addVectorFeature = function(wkt, id) {

    if (vectors == null) {
        vectors = new OpenLayers.Layer.Vector("vectors");
        map.addLayer(vectors);
    }
	
	vectors.destroyFeatures();

    wktFormat = new OpenLayers.Format.WKT();
	var features = wktFormat.read(wkt);
    var bounds;
	if(features) {
		if(features.constructor != Array) {
			features = [features];
		}
		for(var i=0; i<features.length; ++i) {
			features[i].id = id;
			if (!bounds) {
				bounds = features[i].geometry.getBounds();
			} else {
				bounds.extend(features[i].geometry.getBounds());
			}

		}
		vectors.addFeatures(features);
		map.zoomToExtent(bounds);
	}
}

GUI.removeVectorFeature = function(id) {
	var layer = map.getLayersByName('vectors')[0];
	try {
		var feature;
		while (feature = layer.getFeatureById(id)) {
			//var selectFeature = new OpenLayers.Control.SelectFeature(layer); 
			//selectFeature.unselect(feature); 
			layer.destroyFeatures([feature]);
		}
	}
	catch(error) {
		return
	}
}

GUI.removeVectorFeatures = function() {
	var layer = map.getLayersByName('vectors')[0];
	try {
		layer.destroyFeatures();
	}
	catch(error) {
		return
	}
}

GUI.showSearchResults = function(form) {
    var windowId = 'searchResultsWindow';
    var w = Ext.WindowMgr.get(windowId)
    if (w == null) {
      w = new Ext.Window({
          title: 'Otsingutulemused',
          border: false,
          width: 320,
          //autoWidth: true,
          //autoHeight: true,
          id: windowId,
autoScroll: true
      });
    }
    
    Ext.Ajax.request({
      url: '/geoweb/search/results/',
      scope: this,
      form: form,
      method: 'POST',
      success: function(response, options) {
      	var html = response.responseText;
      	w.show();
      	w.body.update(html);
      },
      failure: function(response, options) {
      	var html = response.responseText;
      	w.show();
      	w.body.update(html);
      }
      /*failure: function(response, options) {
      	Ext.MessageBox.show({
      		title: 'Error',
      		msg: 'Could not complete request',
      		buttons: Ext.MessageBox.OK,
      		icon: Ext.MessageBox.ERROR
      	});
      }*/
    });
}

GUI.getSelectedFeaturesWKT = function() {
    var layer = map.getLayersByName('editlayer')[0];
    var wkt = '';
    if (layer.selectedFeatures.length > 0) {
        var wktFormat = new OpenLayers.Format.WKT();
        wkt = wktFormat.write(layer.selectedFeatures);
    }
    return wkt;
}

GUI.addEditableFeature = function(wkt, id) {

    var layer = map.getLayersByName('editlayer')[0];
	
	layer.destroyFeatures();

    var wktFormat = new OpenLayers.Format.WKT();
    var features = wktFormat.read(wkt);
    var bounds;
	if(features) {
		if(features.constructor != Array) {
			features = [features];
		}
		for(var i=0; i<features.length; ++i) {
			features[i].id = id + '_' + i;
			if (!bounds) {
				bounds = features[i].geometry.getBounds();
			} else {
				bounds.extend(features[i].geometry.getBounds());
			}

		}
		layer.addFeatures(features);
		map.zoomToExtent(bounds);
		
		var selectFeature = new OpenLayers.Control.SelectFeature(layer);
		selectFeature.unselectAll();
		for(var i = 0; i < features.length; ++i) {
			selectFeature.select(features[i]);
		}
	}
}

GUI.removeEditableFeature = function(id) {
	var layer = map.getLayersByName('editlayer')[0];
	try {
		var feature;
		var i = 0;
		while (feature = layer.getFeatureById(id + '_' + i)) {
			var selectFeature = new OpenLayers.Control.SelectFeature(layer); 
			selectFeature.unselect(feature); 
			layer.destroyFeatures([feature]);
			i += 1;
		}
	}
	catch(error) {
		return
	}
}

GUI.addFeature = function(wkt, id, editable) {
	if (editable) {
		GUI.addEditableFeature(wkt, id);
	} else {
		GUI.addVectorFeature(wkt, id);
	}
}

GUI.removeFeature = function(id) {
	GUI.removeVectorFeature(id);
	GUI.removeEditableFeature(id);
}

GUI.onElementAdded = function(layer_id, element_id) {
	var layer = map.getLayersByName('editlayer')[0];
	var selectedFeatures = layer.selectedFeatures.slice();
	var selectFeature = new OpenLayers.Control.SelectFeature(layer); 
	selectFeature.unselectAll(); 
	layer.destroyFeatures(selectedFeatures);
	layer = map.getLayer(layer_id);
	layer.redraw(true);
}






