Ext.ux.TabCloseMenu = function(){
    var tabs, menu, ctxItem;
    this.init = function(tp){
        tabs = tp;
        tabs.on('contextmenu', onContextMenu);
    }

    function onContextMenu(ts, item, e){
        if(!menu){ // create context menu on first right click
            menu = new Ext.menu.Menu([{
                id: tabs.id + '-close',
                text: 'Sulge Tab',
                handler : function(){
                    tabs.remove(ctxItem);
                }
            },{
                id: tabs.id + '-close-others',
                text: 'Sulge teised Tabid',
                handler : function(){
                    tabs.items.each(function(item){
                        if(item.closable && item != ctxItem){
                            tabs.remove(item);
                        }
                    });
                }
            }]);
        }
        ctxItem = item;
        var items = menu.items;
        items.get(tabs.id + '-close').setDisabled(!item.closable);
        var disableOthers = true;
        tabs.items.each(function(){
            if(this != item && this.closable){
                disableOthers = false;
                return false;
            }
        });
        items.get(tabs.id + '-close-others').setDisabled(disableOthers);
        menu.showAt(e.getPoint());
    }
};

this.GUI.changefield = function(id){
    
    //Find the helper field for specific form input and change its value
    //var helper_field = $j('#'+id);
    var helper_field = Ext.Element.get(id);
    var helper_field_value = helper_field.getValue();
    if (helper_field_value == 0 || helper_field_value == null)
    {
        helper_field.set({value:1});
    }
    else
    {
        helper_field.set({value:0});
    }
    
    //Initialize new object that will contain POST data
    var senddata = {};
    //Get form's unique identifier
    var token = id.split('-')[0].split('_')[3];
    
    //Get application and model names
    //This is quite nasty
    var app = Ext.DomQuery.selectNode('div[id*='+token+']').id.split('_')[0];
    var model = Ext.DomQuery.selectNode('div[id*='+token+']').id.split('_')[1];
    
    //Find all the inputs for given form
    var inputs = Ext.DomQuery.select("input[name*='"+token+"']");
    Ext.each(inputs,function(el){
        senddata[el.name] = el.value;
    }, this);
 
    Ext.Ajax.request({
        url: '/geoweb/complexsearch_form/'+app+'/'+model+'/?prefix='+token,
        params: senddata,
        success: function(result, request){
            var json = Ext.util.JSON.decode(result.responseText);
            var tab = Ext.getCmp(json.form_id);
            tab.body.update(json.html);
        },
        failure: function(result, request) {
            
        }
    });
}

this.GUI.submitComplexSearch = function(){
    var senddata = {};
    var inputs = Ext.getCmp('searchFormPanel').body.select('input');
    Ext.each(inputs.elements,function(el){
        if (el.name != '') senddata[el.name] = el.value;
    }, this);
    senddata['search'] = 'Search';
    
    var extent_type = Ext.getCmp('extentselect').getForm().getValues()['extent_type']
    senddata['extent_type'] = extent_type
    
    var extent_geom = false;
    if (extent_type == 2) {
        //whole map
        extent_geom = map.getExtent().toArray();
        senddata['extent_geom'] = extent_geom[0]+','+extent_geom[1]+','+extent_geom[2]+','+extent_geom[3];
    } else if (extent_type == 3) {
        //selection
        extent_geom = GUI.getSelectedFeaturesWKT();
        //console.log(extent_geom);
        senddata['extent_geom'] = extent_geom;
    }
    
    if (!extent_geom && extent_type == 3) {
        Ext.Msg.alert('Ühtegi ala ei ole valitud','Soovisid otsida kaardil valitud aladest, kuid selleks tuleb need ju enne valida.');
        return false;
    }
    
    parent.Ext.MessageBox.show({
       msg: 'Andmeid otsitakse, palun oodake...',
       progressText: 'Otsin...',
       width:300,
       wait:true,
       waitConfig: {interval:200},
       icon:'validation_icon'
    });

    Ext.Ajax.request({
        url: '/geoweb/complexsearch/',
        params: senddata,
        success: function(result,request) {
            Ext.MessageBox.hide();
            
            var json = Ext.util.JSON.decode(result.responseText);
            if (json.results) {
                //Remove previous errors
                $j('.errorpopup').remove();
                $j('.witherrors').removeClass('witherrors');
                $j('.errorhead').removeClass('errorhead');
                
                //ugly ugly way to remove red titles, but at least it works
                for (var i=0; i<Ext.getCmp('searchFormPanel').items.items.length; i++){
                    var tab = Ext.getCmp('searchFormPanel').items.items[i];
                    Ext.get(Ext.getCmp('searchFormPanel').getTabEl(tab)).child('.x-tab-strip-text').removeClass('tabwitherrors');   
                }
                
                if (json.jsondata) {
                    GUI.showComplexSearchResultsWindow(json.jsondata);
                } else {
                    Ext.Msg.alert('Liiga vähe otsingutulemusi','Palun laiendage otsingut.');
                }
            }
            else if (json.toomany)
            {
                Ext.Msg.alert('Liiga palju otsingutulemusi', 'Palun kitsendage otsingut.');
            }
            else if (json.errors)
            {
                for (var i=0; i<json.forms.length; i++){
                    var form_id = json.forms[i].form_id;
                    var form = Ext.getCmp(form_id)
                    form.body.update(json.forms[i].html);
                    
                    for (var j=0; j<json.forms_with_errors.length; j++){
                        if (form_id == json.forms_with_errors[j]) {
                            var prevtitle = form.title;
                            
                            //Simple way does not work. Ext's bug or smth: form.setIconClass('tabwitherrors');
                            //So we'll use the ugly one
                            Ext.get(Ext.getCmp('searchFormPanel').getTabEl(form)).child('.x-tab-strip-text').addClass('tabwitherrors');
                        }
                    } 
                }
                $j('.witherrors').hover(function(){
                    $j('.errorpopup',this).show();  
                },function(){
                    $j('.errorpopup',this).hide();  
                });
            }
        },                    
        failure: function(result,request) {
            Ext.MessageBox.hide();
            Ext.Msg.alert('Viga', 'Request/response viga.');  
        }
    });
}

Ext.onReady(function() {
    
    /*
    function showComplexSearchWindow() {
        var windowId = 'complexSearchWindow';
        window = Ext.WindowMgr.get(windowId)
        if (window == null) {
          var window = new Ext.Window({
              title: 'Otsing',
              border: false,
              width: 640,
              height: 320,
              html: '<iframe style="width: 100%; height: 100%;" src="/geoweb/complexsearch2/"></iframe>',
              id: windowId
          });
        }
        window.show();
    }
    */
    
    
    function showComplexSearchWindow() {
        
        var windowId = 'complexSearchWindow';
        window = Ext.WindowMgr.get(windowId);
        
        if (window == null) {
            var tree = new Ext.tree.TreePanel({
                useArrows: true,
                autoScroll: true,
                animate: true,
                containerScroll: true,
                region: 'center',
                height: 150,
                root: new Ext.tree.AsyncTreeNode({id:'source'}),
                rootVisible: false,
                loader: new Ext.tree.TreeLoader({
                    dataUrl:'/geoweb/complexsearch/tree_ext/'
                })
            });
        
            tree.on('click', function (node) {
                nodename = node.id.split('.')[0];
                        
                if (nodename == 'el') {
                    app_label = node.id.split('.')[1];
                    model_name = node.id.split('.')[2];
                    
                    Ext.Ajax.request({
                        url: '/geoweb/complexsearch_form/'+app_label+'/'+model_name+'/',
                        success: function(result, request) {
                            var json = Ext.util.JSON.decode(result.responseText);
                    
                            formpanel = Ext.getCmp('searchFormPanel');
                            formpanel.add({
                                title: json.model,
                                id: json.form_id,
                                autoScroll: true,
                                html: json.html,
                                closable: true
                            });
                            
                            formpanel.doLayout();
                            formpanel.activate(json.form_id);
                        },
                        failure: function(result, request) {
                            
                        }
                    });
                }
            });
            
            var controls = new Ext.form.FormPanel({
                region: 'south',
                id: 'extentselect',
                height: 125,
                frame: true,
                items: new Ext.form.FieldSet({
                    defaultType: 'radio',
                    autoHeight: true,
                    items: [{
                            fieldLabel: 'Otsing aladelt',
                            checked: true,
                            boxLabel: 'Kõikjalt',
                            name: 'extent_type',
                            inputValue: '1'
                        },{
                            fieldLabel: '',
                            labelSeparator: '',
                            boxLabel: 'Kaardiaknast',
                            name: 'extent_type',
                            inputValue: '2'
                        },{
                            fieldLabel: '',
                            labelSeparator: '',
                            boxLabel: 'Valitud aladelt',
                            name: 'extent_type',
                            inputValue: '3'
                        }]
                }),

                buttons: [{
                    text: 'Otsi',
                    handler: GUI.submitComplexSearch
                }]
            });
            
            var tabPanel = new Ext.TabPanel({
                region: 'center',
                plain: true,
                id: 'searchFormPanel',
                enableTabScroll:true,

                autoScroll: true,
                plugins: new Ext.ux.TabCloseMenu()
            });
        
            var window = new Ext.Window({
                title: 'Otsing',
                border: false,
                width: 640,
                height: 400,
                layout: 'border',
                id: windowId,
                
                items: [{
                    layout: 'border',
                    region: 'west',
                    split: true,
                    width: 250,
                    minSize: 250,
                    maxSize: 400,
                    items: [tree, controls]
                    }, 
                    tabPanel
                ],
                //maybe not the best way to achieve that:
                keys: new Ext.KeyMap(document, {
                    key: Ext.EventObject.ENTER,
                    fn: GUI.submitComplexSearch,
                    scope: this
                })
            });
            
        }

        window.show(); 
    }
        
    var menuItem = new Ext.menu.Item({text: 'Otsing...', handler: showComplexSearchWindow});
    GUI.searchMenu.addItem(menuItem);
});

GUI.showComplexSearchResultsWindow = function (json) {
    var grids = [];
    for (model in json) {
        var modeldata = json[model];
        var fields = [];
        var sm = new Ext.grid.CheckboxSelectionModel()
        var columns = [sm]
        var app_label = modeldata.app_label;
        for (field in modeldata.fields) {
            fields.push(field);
            columns.push({dataIndex:field,header:modeldata.fields[field],sortable:true});
        }
        fields.push('info','show');
        columns.push({dataIndex:'info',header:'Info',sortable:false});
        columns.push({dataIndex:'show',header:'Näita',sortable:false});
        
        for (var i=0;i<modeldata.data.length;i++) {
            modeldata.data[i]['info'] = '<a href="javascript:GUI.showElementInfo(' + modeldata.data[i].id + ')">info</a>';
            modeldata.data[i]['show'] = '<a href="javascript:GUI.addVectorFeature(\''+modeldata.data[i].geometry +'\','+modeldata.data[i].id+')">näita</a>';
        }
        
        var grid = new Ext.grid.GridPanel({
            store: new Ext.data.JsonStore({
                fields: fields,
                data: modeldata.data 
            }),
            columns: columns,
            sm: sm,
            title: 'Elemendi klass: ' + modeldata.name,
            autoHeight: true,
            frame: true,
            collapsible: true,
            stripeRows: true,
			autoExpandColumn: 1
            //anchor: '-16'
        });
        grids.push(grid);
    }
	
	var p = new Ext.Panel({width:580,autoScroll: true,layout:'anchor',items:grids});
	
	var tb = [{
		//text: 'Zip',
		iconCls: 'zip',
		disabled: false,
		handler: function() {
			var postdata = []
			for (var i=0;i<grids.length;i++) {
				var selections = grids[i].getSelectionModel().getSelections();
				if (selections.length > 0) {
					for (var j=0; j<selections.length; j++) {
						postdata.push(selections[j].json.app_label+'.'+selections[j].json.module_name+'.'+selections[j].json.id);
					}
					
				}
			}
			if (postdata.length > 0) {
				Ext.Ajax.request({
				   url: '/geoweb/modelzip/',
				   success: function(r){
					   Ext.Msg.alert('Zip faili allalaadimine','Zip faili saab alla laadida <a href="'+r.responseText+'">siit</a>.');
				   },
				   failure: function(r) {
						Ext.Msg.alert('nonii','Viga');
				   },
				   params: {'objectdata':postdata}
				});

			}
			else
			{
				Ext.Msg.alert('Failide kokkupakkimine','Palun valige kokkupakitavad failid.');
			}
		}
	}];

	var windowId = 'complexSearchResultsWindow';
	var w = Ext.WindowMgr.get(windowId)
	if (w != null) {
		w.close();
	}
	  w = new Ext.Window({
		title: 'Otsingutulemused',
		border: false,
		width: 600,
		//autoHeight: true,
		height: 350,
		//html: html,
		resizable: true,
		id: windowId,
		autoScroll: true,
        layout:'fit',
		items: p,
		tbar: tb
	  });

  
	//w.on('resize', function(obj, adjWidth, adjHeight, rawWidth, rawHeight){w.suspendEvents();w.setHeight(320);w.resumeEvents();});
  
	w.on('close', function(){GUI.removeVectorFeatures();});
	w.show();
}

