/*
 * Copyright © 2008  Neogeo Technologies, Toulouse, France

 * This file is part of Opencarto web map publishing system project
 *
 * Opencarto is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Opencarto is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with Opencarto.  If not, see <http://www.gnu.org/licenses/>.
 */
 
Ext.namespace('opencarto.layerControl');

//Texte pour le slider: Affichage du %

Ext.ux.SliderTip = Ext.extend(Ext.Tip, {
 	    minWidth: 10,
 	    offsets : [0, -10],
 	    init : function(slider){
 	        slider.on('dragstart', this.onSlide, this);
 	        slider.on('drag', this.onSlide, this);
 	        slider.on('dragend', this.hide, this);
 	        slider.on('destroy', this.destroy, this);
 	    },
 	
 	    onSlide : function(slider){
 	        this.show();
 	        this.body.update(this.getText(slider));
 	        this.doAutoWidth();
 	        this.el.alignTo(slider.thumb, 'b-t?', this.offsets);
 	    },
 	
 	    getText : function(slider){
 	    	// pourcentage
 	        return slider.getValue()+'%';
 	    }
});


opencarto.layerControl.load = function(){
  var reader = new Ext.data.JsonReader({}, [
                {name: 'options.layerid'},
                {name: 'name'},
                {name: 'label'},
                {name: 'options.groupname'},
                {name: 'options.rang'},
                {name: 'options.grouporder'},
                {name: 'options.visibility'},
                {name: 'options.exporter'},
                {name: 'options.typegeo'},
                {name: 'options.sldFiles'},
                {name: 'options.opacity'},
                {name: 'options.search'},
                {name: 'options.editable'},
                {name: 'options.showInLegend'}
                
             ]);
            opencarto.layerStore = new Ext.data.GroupingStore({
                reader: reader,
                data: opencarto.gisobjects.layers,
                sortInfo:{field: 'options.rang', direction: "ASC"},
                enableRowSorting: true,
                groupField:'options.grouporder'
                
            });
            opencarto.layerStore.filter('options.showInLegend',true);
            var visibilityColumn = new Ext.grid.CheckColumn({
                header: oMessages.display_abv,
                dataIndex: 'options.visibility',
                menuDisabled:true,
                width: 2,
                hidden:false,
                sortable: false,
                resizable:true
             });
             
             
		

	    //type de ligne
            opencarto.sm = new Ext.grid.RowSelectionModel({  
			    singleSelect:true,
			    // pour le grag n drop et activation du slider 
			    listeners: {  
			        beforerowselect: function(sm,i,ke,row){  
			            opencarto.layerGrid.ddText = row.get('name');
			            //slidebar.show();
			        },
			        rowselect: function(sm, i, row) {
                        	    slidebar.show();
                    		},
                    		rowdeselect: function(sm, i, row) {
                        	    slidebar.hide();
                    		}  
			    }  
			}); 
			
	    

	    //Définition des colonnes de la grille
            opencarto.layercm = new Ext.grid.ColumnModel([
                visibilityColumn,
                {id:'id',header: "ID", width: 60, hidden:true, sortable: false, dataIndex: 'options.layerid'},
                
                {id:'name',header: "Nom", width: 60, hidden:true, sortable: false, dataIndex: 'name'},
                {header: oMessages.layer_name,  menuDisabled:true,sortable: false, dataIndex: 'label'},
                {header: oMessages.layer_group, width: 20, hidden:true, sortable: false,  dataIndex: 'options.groupname'},
                {header: oMessages.layer_rank, width: 20, hidden:true, sortable: false, dataIndex: 'options.rang'},
                {header: oMessages.layer_categ, width: 20, hidden:true, sortable: false, dataIndex: 'options.grouporder'},
                {header: oMessages.layer_export, width: 20, hidden:true, sortable: false, dataIndex: 'options.exporter'},
                {header: oMessages.layer_type, width: 20, hidden:true, sortable: false, dataIndex: 'options.typegeo'},
                {header: oMessages.layer_sld, width: 20, hidden:true, sortable: false, dataIndex: 'options.sldFiles'},
                {header: oMessages.layer_opacity, width: 20, hidden:true, sortable: false, dataIndex: 'options.opacity'},
                {header: oMessages.layer_search, width: 20, hidden:true, sortable: false, dataIndex: 'options.search'}
            ]);
            
            
            //construction du slider
            
            var slider = new Ext.Slider({width:100,plugins: new Ext.ux.SliderTip()});
	    slider.on("change", function(slider, newValue) {
	    	     //selected layer
	    	     var layer = opencarto.map.getLayersByName(opencarto.layerGrid.getSelectionModel().getSelected().get('name'));
                     layer[0].setOpacity(newValue/100);
                });
 
 	   //Evènement du slider
           slider.on("dragstart", function(slider, e) { 
                    this.control.isMouseDown = false; 
                }, {control: this});
            
            //Toolbar pour le slider
            var slidebar = new Ext.Toolbar({items: [{ xtype: 'tbtext', text: oMessages.layer_opacity },slider],hidden:true});
            
            
            //Grille de gestion des layers
            opencarto.layerGrid = new Ext.grid.EditorGridPanel({
            id: 'layerGrid', 
            store: opencarto.layerStore,
            cm: opencarto.layercm,
            sm:opencarto.sm,
            plugins:visibilityColumn,

            view: new Ext.grid.GroupingView({
                forceFit:true,
                // version avec nb de couches : 
                //groupTextTpl: '{[values.rs[0].data["options.groupname"]]} ({[values.rs.length]} {[values.rs.length > 1 ? "Couches" : "Couche"]})'
                groupTextTpl: '{[Ext.util.Format.capitalize(values.rs[0].data["options.groupname"])]}'
            }),
            autoHeight:true,
            autoExpandColumn:'label',
            width:'auto',
            enableDragDrop : true,
	    ddGroup : 'mygrid-dd',  
            ddText : 'Place this row.',
            frame:false,
            border:true,
            hideGroupedColumn:true,
            collapsible: true,
            title: oMessages.layer_list,
            autoExpandColumn:'label',
            animCollapse: true,
            enableColLock: false,
            iconCls: 'layerList',
            loadMask: true,
            //toolbar pour le slider 
            bbar:slidebar,
	    //listener pour le menu contextuel
            listeners: {
                      rowcontextmenu:opencarto.onContextClick
                }
            });
            
            //Evènements de selection d'une couche
            
            //Active l'outil de selection
            opencarto.layerGrid.getSelectionModel().on(
                'rowselect',opencarto.layerSelect
            );
            //Met à jour l'opacité pour ce layer
            opencarto.layerGrid.getSelectionModel().on(
                'rowselect',function(row, e) {
                var layer = opencarto.map.getLayersByName(opencarto.layerGrid.getSelectionModel().getSelected().get('name'));
                op_value = layer[0].opacity*100;
                slider.setValue(op_value,true); }
            );
            //
            opencarto.layerGrid.getSelectionModel().on(
                'rowdeselect',opencarto.layerSelect
            ); 
            
            opencarto.leftPanel.insert(0,opencarto.layerGrid);
            opencarto.leftPanel.doLayout();
            
            
            //A placer après le doLayout() pour que Target existe
            
            var orderGridDropTargetEl = opencarto.layerGrid.getView().el.dom.childNodes[0].childNodes[1];
            var mydropTarget = new Ext.dd.DropTarget(orderGridDropTargetEl, {  
		    ddGroup : 'mygrid-dd',  
		    notifyDrop : function(dd, e, data){  
		        var sm = opencarto.layerGrid.getSelectionModel();  
		        var rows = sm.getSelections();  
		        var cindex = dd.getDragData(e).rowIndex;  
		        if (sm.hasSelection()) {  
		            for (i = 0; i < rows.length; i++) {
		                opencarto.layerStore.remove(opencarto.layerStore.getById(rows[i].id));  
		                opencarto.layerStore.insert(cindex,rows[i]); 
		            }  
		            sm.selectRecords(rows);
		            var mylayer = opencarto.map.getLayersByName(opencarto.layerGrid.getSelectionModel().getSelected().get('name'));
		            opencarto.map.setLayerIndex(mylayer[0],cindex); 
		        }    
		    }  
	    });
}    

