function meetings()
{

    var MeetingCreateForm;
    var MeetingCreateWindow;

    var FnameField;
    var LnameField;
    var BirthdayField;
    var MailField;
    var TelField;
    var ExamenField;
    var RdvDateField;
    var RdvHourField;

    var store;
    var MeetingListingSelectedRow;

    
    FnameField = new Ext.form.TextField(
    {
        id          : 'fname',
        fieldLabel  : 'Prénom',
        name        : 'fname',
        maxLength   : 20,
        allowBlank  : false,
        anchor      : '95%'
    });

    LnameField = new Ext.form.TextField(
    {
        id          : 'lname',
        fieldLabel  : 'Nom',
        name        : 'fname',
        maxLength   : 20,
        allowBlank  : false,
        anchor      : '95%'
    });

    BirthdayField = new Ext.form.DateField(
    {
        id          : 'birthday',
        fieldLabel  : 'Date de naissance',
        name        : 'birthday',
        altFormats  : 'd-m-Y',
        allowBlank  : false,
        anchor      : '95%'
    });

    MailField = new Ext.form.TextField(
    {
        id          : 'mail',
        fieldLabel  : 'e-Mail',
        name        : 'mail',
        maxLength   : 50,
        allowBlank  : true,
        anchor      : '95%'
    });

    TelField = new Ext.form.TextField(
    {
        id          : 'tel',
        fieldLabel  : 'Tél',
        name        : 'tel',
        maxLength   : 14,
        allowBlank  : true,
        anchor      : '95%'
    });

    var examensStore = new Ext.data.JsonStore({
        url     : baseUrl + '/admin/examen/json',
        root    : 'records',
        fields  : ['id', 'name']
    });
    
    ExamenField = new Ext.form.ComboBox({
        store           : examensStore,
        fieldLabel      : 'Examen',
        id              : 'examen',
        selectOnFocus   : true,
        triggerAction   : 'all',
        name            : 'examen',
        displayField    : 'name'
    });
    
    RdvDateField = new Ext.form.DateField(
    {
        id          : 'rdvDate',
        fieldLabel  : 'Date',
        name        : 'rdvDate',
        altFormats  : 'd-m-Y',
        disabledDays: [0, 6],
        allowBlank  : false,
        anchor      : '95%'
    });

    RdvHourField = new Ext.form.TextField(
    {
        id          : 'rdvHour',
        fieldLabel  : 'Heure',
        name        : 'rdvHour',
        allowBlank  : false,
        anchor      : '95%'
    });
    
    store = new Ext.data.JsonStore({
        url     : baseUrl + '/admin/meeting/json',
        root    : 'records',
        fields  : ['id', 'fname', 'lname', 'birthday', 'mail', 'tel', 'examen', 'rdvDate', 'rdvHour']
    });
    
    var cm = new Ext.grid.ColumnModel([
    {
        header      : "Prénom",
        dataIndex   : 'fname',
        editor      : FnameField
    }, {
        header      : "Nom",
        dataIndex   : 'lname',
        editor      : LnameField
    }, {
        header      : "Date de naissance",
        width       : 100,
        dataIndex   : 'birthday',
        editor      : BirthdayField
    }, {
        header      : "e-Mail",
        dataIndex   : 'mail',
        width       : 120,
        editor      : MailField
    }, {
        header      : "Tél",
        width       : 80,
        dataIndex   : 'tel',
        editor      : TelField
    }, {
        header      : "Examen",
        width       : 80,
        dataIndex   : 'examen',
        editor      : ExamenField
    }, {
        header      : "Date",
        width       : 100,
        dataIndex   : 'rdvDate',
        editor      : RdvDateField
    }, {
        header      : "Heure",
        width       : 40,
        dataIndex   : 'rdvHour',
        editor      : RdvHourField
    }
    ]);
    cm.defaultSortable= true;


    MeetingListingEditorGrid =  new Ext.grid.EditorGridPanel(
    {
        id              : 'MeetingListingEditorGrid',
        store           : store,
        cm              : cm,
        enableRowHeightSync : true,
        trackMouseOver  : true,
        enableColLock   : true,
        selModel        : new Ext.grid.RowSelectionModel(
        {
            singleSelect:false
        }),
        border          : false,
        collapsible     : false,
        titleCollapse   : true,
        tbar            : [{
            text    : 'Add a meeting',
            iconCls : 'add',
            handler : displayFormWindow
        }, '-', {
            text    : 'Delete selection',
            handler : confirmDeleteMeetings,
            iconCls : 'remove'
        }]
    });

    function onMeetingListingEditorGridContextMenu(grid, rowIndex, e)
    {  
        e.stopEvent();
        var coords = e.getXY();
        MeetingListingContextMenu.rowRecord = grid.store.getAt(rowIndex);
        grid.selModel.selectRow(rowIndex);
        MeetingListingSelectedRow=rowIndex;
        MeetingListingContextMenu.showAt([coords[0], coords[1]]);
    }

    function modifyMeetingContextMenu(){
        MeetingListingEditorGrid.startEditing(MeetingListingSelectedRow,1);
    }

    function deleteMeetingContextMenu(){
        confirmDeleteMeetings();
    }

    MeetingListingContextMenu = new Ext.menu.Menu({
        id      : 'MeetingListingEditorGridContextMenu',
        items   : [
        {
            text    : 'Modify this Meeting',
            handler : modifyMeetingContextMenu
        },

        {
            text    : 'Delete this Meeting',
            handler : deleteMeetingContextMenu
        }
        ]
    });

    MeetingListingEditorGrid.addListener('rowcontextmenu', onMeetingListingEditorGridContextMenu);

    var selections = MeetingListingEditorGrid.selModel.getSelections();
    var prez = [];
    for(i = 0; i< MeetingListingEditorGrid.selModel.getCount(); i++){
        prez.push(selections[i].json.id);
    }
    var encoded_array = Ext.encode(prez);

    MeetingCreateForm = new Ext.FormPanel(
    {
        labelAlign  : 'top',
        bodyStyle   : 'padding:5px',
        width       : 600,
        items       : [{
            layout  : 'column',
            border  : false,
            items   : [{
                columnWidth : 0.5,
                layout      : 'form',
                border      :false,
                items       : [FnameField, LnameField, BirthdayField, TelField, MailField]
            },{
                columnWidth    : 0.5,
                layout         : 'form',
                border         : false,
                items          : [ExamenField, RdvDateField, RdvHourField]
            }]
        }],
        buttons     : [{
            text    : 'Save and Close',
            handler : function()
            {
                createMeeting();
                var redirect = baseUrl + '/';
                window.location = redirect;
            }
        },{
            text    : 'Cancel',
            handler : function()
            {
                MeetingCreateWindow.hide();
                var redirect = baseUrl + '/';
                window.location = redirect;
            }
        }]
    });

    MeetingCreateWindow= new Ext.Window(
    {
        id          : 'MeetingCreateWindow',
        title       : 'Creating a New Meeting',
        closable    : true,
        width       : 610,
        listeners: {
          close: function() {
            var redirect = baseUrl + '/';
            window.location = redirect;
          }
        },
        height      : 350,
        plain       : true,
        layout      : 'fit',
        items       : MeetingCreateForm
    });

    // reset the Form before opening it
    function resetMeetingForm()
    {
        LnameField.setValue('');
        FnameField.setValue('');
        BirthdayField.setValue('');
        MailField.setValue('');
        TelField.setValue('');
        RdvDateField.setValue('');
        RdvHourField.setValue('');
    }

    // check if the form is valid
    function isMeetingFormValid(){
        return(LnameField.isValid() &&
            FnameField.isValid() &&
            BirthdayField.isValid() &&
            MailField.isValid() &&
            ExamenField.isValid() &&
            TelField.isValid() &&
            RdvDateField.isValid() &&
            RdvHourField.isValid());
    }

    // display or bring forth the form
    function displayFormWindow(){
        if(!MeetingCreateWindow.isVisible()){
            resetMeetingForm();
            MeetingCreateWindow.show();
        } else {
            MeetingCreateWindow.toFront();
        }
    }

    function confirmDeleteMeetings(){
        if(MeetingListingEditorGrid.selModel.getCount() == 1){
            Ext.MessageBox.confirm('Confirmation','Delete this meeting?', deleteMeetings);
        } else {
            Ext.MessageBox.alert('Erreur','Select one only !');
        }
    }


    function saveMeeting(oGrid_event)
    {
        Ext.Ajax.request({
            waitMsg: 'Please wait...',
            url: baseUrl + '/admin/meeting/edit',
            params: {
                task         : "UPDATEVC",
                id           : oGrid_event.record.data.id,
                fname        : oGrid_event.record.data.fname,
                lname        : oGrid_event.record.data.lname,
                birthday     : oGrid_event.record.data.birthday,
                mail         : oGrid_event.record.data.mail,
                tel          : oGrid_event.record.data.tel,
                examen       : oGrid_event.record.data.examen,
                rdvDate      : oGrid_event.record.data.rdvDate,
                rdvHour      : oGrid_event.record.data.rdvHour
            },
            success: function(response){
                var result=eval(response.responseText);
                switch(result){
                    case 1:
                        store.commitChanges();
                        Ext.MessageBox.alert('Success !', 'Meeting saved.');
                        store.reload();
                        break;
                    default:
                        Ext.MessageBox.alert('Error !','We couldn\'t save him...');
                        break;
                }
            },
            failure: function(response){
                var result=response.responseText;
                Ext.MessageBox.alert('error','could not connect to the database. retry later');
            }
        });
    }

    function createMeeting(){
        if(isMeetingFormValid()){
            Ext.Ajax.request({
                waitMsg: 'Please wait...',
                url: baseUrl + '/admin/meeting/add',
                params: {
                    task            : "CREATEVC",
                    fname           : FnameField.getValue(),
                    lname           : LnameField.getValue(),
                    birthday        : BirthdayField.getValue(),
                    mail            : MailField.getValue(),
                    tel             : TelField.getValue(),
                    examen          : ExamenField.getValue(),
                    rdvDate         : RdvDateField.getValue(),
                    rdvHour         : RdvHourField.getValue()
                },
                success: function(response){
                    var result=eval(response.responseText);
                    switch(result){
                        case 1:
                            Ext.MessageBox.alert('Creation OK', 'The meeting was created successfully.');
                            store.reload();
                            MeetingCreateWindow.hide();
                            break;
                        default:
                            Ext.MessageBox.alert('Warning', 'Could not create the meeting.');
                            break;
                    }
                },
                failure: function(response){
                    var result=response.responseText;
                    Ext.MessageBox.alert('error', 'could not connect to the database. retry later');
                }
            });
        } else {
            Ext.MessageBox.alert('Warning', 'Your Form is not valid!');
        }
    }

    function deleteMeetings(btn){
        if(btn=='yes'){
            var selections = MeetingListingEditorGrid.selModel.getSelections();
            var id = selections[0].json.id;
            
            Ext.Ajax.request({
                waitMsg: 'Please Wait',
                url: baseUrl + '/admin/meeting/delete',
                params: {
                    task: "DELETEVCS",
                    id:  id
                },
                success: function(response){
                    var result=eval(response.responseText);
                    switch(result){
                        case 1:  // Success : simply reload
                            Ext.MessageBox.alert('Success !', 'Meeting deleted.');
                            store.reload();
                            break;
                        default:
                            Ext.MessageBox.alert('Warning','Could not delete the entire selection.');
                            break;
                    }
                },
                failure: function(response){
                    var result=response.responseText;
                    Ext.MessageBox.alert('error','could not connect to the database. retry later');
                }
            });
        }
    }


    MeetingListingEditorGrid.on('afteredit', saveMeeting);
    store.load();
    examensStore.load();

    var win = new Ext.Window({
        title       : 'Meetings',
        layout      : 'fit',
        width       : 800,
        height      : 400,
        closable    : true,
        resizable   : true,
        autoScroll  : true,
        plain       : true,
        listeners: {
          close: function() {
            var redirect = baseUrl + '/';
            window.location = redirect;
          }
        },
        border      : false,
        items       : [MeetingListingEditorGrid]
	});

    win.show();
    return;
};

