opencarto.search.geom = '';
opencarto.search.queryID = null;
opencarto.search.target_id = null;
opencarto.search.distance = 0;
opencarto.search.attributeValues = null;
// préparation des cb pour les modes de croisement des géométries
opencarto.search.prepareForm = function(){
opencarto.search.operators = [
        ['None','Ne pas utiliser'],
        ['ST_Intersects','Intersection'],
        ['ST_Covers','Inclusion'],
        ['ST_Distance','Distance']
    ];
    
opencarto.search.operatorsDS = new Ext.data.Store({
    reader: new Ext.data.ArrayReader({}, [
           {name: 'id'},
           {name: 'label'}
      ])
});
opencarto.search.operatorsDS.loadData(opencarto.search.operators);
opencarto.search.distanceTB = new Ext.form.NumberField({
    id:'searchDistanceNb',
    fieldLabel:'Distance (m)',
    anchor:'95%',
    disabled:true,
    name:'searchDistanceField',
    value:opencarto.search.distance,
    listeners:{
         change:function(){
            opencarto.search.distance = opencarto.search.distanceTB.getValue();
         }
    }
    
});

opencarto.search.geoMode = new Ext.form.ComboBox({
        id: "searchGeoMode",
        fieldLabel: "Mode",
        anchor:'95%',
        displayField: 'label',
        valueField: 'id',
        editable: true,
        typeAhead: true,
        mode: 'local',
        forceSelection: true, 
        triggerAction: 'all',
        listeners:{
            select:function(cb,rec,idx){
                if (cb.value == 'ST_Distance')
                    opencarto.search.distanceTB.enable();
                else
                    opencarto.search.distanceTB.disable();
                if (opencarto.search.myCB)
                        opencarto.search.fusionGeom();
            }
        },
        selectOnFocus: true,
        store: opencarto.search.operatorsDS
});
opencarto.search.selectionRelationForm = new Ext.form.FormPanel({
      baseCls: 'x-plain',
      bodyStyle:'padding:5px',
      width:320,
      items:[
        opencarto.search.geoMode,
        opencarto.search.distanceTB
      ]
   });

}
opencarto.search.fusionGeom = function()
{
    if (!opencarto.search.geoMode.value || opencarto.search.geoMode.value == 'None'){
        opencarto.search.geom = '';
    }
    else{
        aGeom = new Array();
        for (i=0;i<opencarto.vectorLayer.features.length;i++)
        {
            aGeom.push(opencarto.vectorLayer.features[i].geometry.toString());
        }
        opencarto.search.geom = aGeom.join('$');
    }
    for (i=0;i<opencarto.search.myDS.length;i++)
    {
        opencarto.search.myDS[i].reload()
    }
}
opencarto.search.getSelectionGeom = function(store,options){
    store.baseParams.selectionGeom = opencarto.search.geom;
    store.baseParams.operator = opencarto.search.geoMode.value
    if (opencarto.search.geoMode.value == 'ST_Distance')
        store.baseParams.distance = opencarto.search.distanceTB.getValue();
    
}
opencarto.search.showItem = function(cb,rec,idx){
   dataType = cb.store.getAt(idx).get('fieldtype');
   opencarto.displayData(cb.layerID,cb.fieldLabel,cb.value, dataType)
   
}

opencarto.search.showSearchWindow = function(rec){
   theFields = rec.get('options.search').split(';');
   opencarto.search.myDS = new Array();
   opencarto.search.myCB = new Array();
   opencarto.search.geom = '';
   opencarto.search.prepareForm();
   for (i=0;i<theFields.length;i++)
   {
      opencarto.search.myDS[i] = new Ext.data.JsonStore({
         url:'../layer/'+rec.get('options.layerid')+'/values/',
         baseParams:{'fieldName':theFields[i],'proj':globalParams.projection.replace('epsg:','')},
         storeId: "searchStore" + i,
         root: 'allvalues',
         fields: ['id', 'fieldvalue','fieldtype'],
         remoteSort: true,
         autoLoad:false,
         listeners:{
            beforeload:opencarto.search.getSelectionGeom  
         }
      });
      opencarto.search.myCB[i] = new Ext.form.ComboBox({
         id: "searchCB"+i,
         fieldLabel: theFields[i],
         layerID:rec.get('options.layerid'),
         anchor:'95%',
         displayField: 'fieldvalue',
         valueField: 'fieldvalue',
         editable: true,
         typeAhead: true,
         mode: 'remote',
         forceSelection: true, 
         triggerAction: 'all',
         emptyText: '---------',
         selectOnFocus: true,
         store: opencarto.search.myDS[i],
         listeners:{
            select:opencarto.search.showItem
         }
     });
   }
   for (i=0;i<opencarto.search.myCB.length;i++)
            opencarto.search.selectionRelationForm.add(opencarto.search.myCB[i]);
        if (opencarto.vectorLayer.features.length==0){
            opencarto.search.distanceTB.disable();
            opencarto.search.geoMode.disable();
            
        }
  
    
  
   
    opencarto.search.SearchWindow = new Ext.Window({
        title: 'Recherche sur la couche '+rec.get('label'),
        width: 350,
        height:130 + theFields.length*30,
        minWidth: 300,
        minHeight: 100,
        layout: 'fit',
        closeAction:'close',
        plain:true,
        bodyStyle:'padding:5px;',
        buttonAlign:'center',
        items: opencarto.search.selectionRelationForm,
        listeners:{
            close:opencarto.search.resetSearch  
        },
        buttons: [{
           text: 'Fermer' ,
           handler  : function(){
              opencarto.search.SearchWindow.close();
           }
          },
          {
           text: 'TOUS' ,
           handler  : function(){
              opencarto.search.selectAllItems();
           }
          }
      ]
   });

   opencarto.search.SearchWindow.show(); 
   
}
opencarto.search.selectAllItems = function()
{
    
    cb = opencarto.search.selectionRelationForm.getForm().findField("searchCB0");
    opencarto.displayData(cb.layerID);
    
    
}
opencarto.search.onItemClick = function(item){
  
    opencarto.search.queryID = item.queryID;
    opencarto.search.target_id = item.target_id;
    if (!item.labels && opencarto.vectorLayer.features.length == 0)
        opencarto.displayData(opencarto.search.target_id);
    else if (!item.labels && opencarto.vectorLayer.features.length>0)
    {
        
       opencarto.search.prepareForm();
       opencarto.search.SearchWindow = new Ext.Window({
            title: 'Requête et sélection existante',
            width: 350,
            height:160,
            minWidth: 300,
            minHeight: 100,
            layout: 'fit',
            closeAction:'close',
            plain:true,
            bodyStyle:'padding:5px;',
            buttonAlign:'center',
            items: opencarto.search.selectionRelationForm,
            buttons: [{
               text: 'Fermer' ,
               handler  : function(){
                  opencarto.search.SearchWindow.close();
               }
            },{
               text: 'Lancer la requête' ,
               handler  : opencarto.search.goQueryWithSelection
            }]
         });
      
         opencarto.search.SearchWindow.show(); 
    }
    else if (item.labels)
    {
        opencarto.search.prepareForm();
        myFields = new Array();
        toks = item.labels.split('$')
        fieldTypes = item.fieldtypes.split('$');
        for (i=0;i<toks.length;i++)
        {
            fieldLabel = toks[i].split('|')[1]
            if (fieldTypes[i] == 'string'){
                myFields[i] = new Ext.form.TextField({
                    id:'searchValueField'+i,
                    name:'attField'+i,
                    fieldLabel:fieldLabel,
                    anchor:'95%'            
                })
            }
            else if (fieldTypes[i] == 'numeric')
            {
                myFields[i] = new Ext.form.NumberField({
                    id:'searchValueField'+i,
                    name:'attField'+i,
                    fieldLabel:fieldLabel,
                    anchor:'95%'            
                })
                
            }
        }
        
        for (i=0;i<myFields.length;i++)
            opencarto.search.selectionRelationForm.add(myFields[i]);
        if (opencarto.vectorLayer.features.length==0){
            opencarto.search.distanceTB.disable();
            opencarto.search.geoMode.disable();
            
        }
        opencarto.search.SearchWindow = new Ext.Window({
            title: 'Requête paramétrique',
            width: 350,
            height:150 + 30 * myFields.length,
            minWidth: 300,
            minHeight: 100,
            layout: 'fit',
            closeAction:'close',
            plain:true,
            bodyStyle:'padding:5px;',
            buttonAlign:'center',
            items: opencarto.search.selectionRelationForm,
            listeners:{
            close:opencarto.search.resetSearch  
             },
            buttons: [{
               text: 'Fermer' ,
               handler  : function(){
                  opencarto.search.SearchWindow.close();
               }
            },{
               text: 'Lancer la requête' ,
               handler  : opencarto.search.goQueryWithSelection
            }]
         });
      
         opencarto.search.SearchWindow.show(); 
        
    }
   
}
opencarto.search.resetSearch  = function(win){
    
    opencarto.search.myDS = null;
    opencarto.search.myCB = null;
   
    
}

opencarto.search.goQueryWithSelection = function(){
    geoOp = opencarto.search.selectionRelationForm.getForm().findField('searchGeoMode').value;
    if(geoOp != '' && geoOp != 'None'){
        opencarto.selection.mode = geoOp;
        aGeom = new Array();
        for (i=0;i<opencarto.vectorLayer.features.length;i++)
        {
            aGeom.push(opencarto.vectorLayer.features[i].geometry.toString());
        }
        opencarto.search.geom = aGeom.join('$');
        
    }
    opencarto.search.attributeValues = opencarto.search.selectionRelationForm.getForm().getValues(true);
     
    opencarto.displayData(opencarto.search.target_id);
    opencarto.search.SearchWindow.close();
}