//----------------------------------------------------------------------------
//  Copyright (C) 2008 The IPython Development Team
//
//  Distributed under the terms of the BSD License.  The full license is in
//  the file COPYING, distributed as part of this software.
//----------------------------------------------------------------------------

//============================================================================
// ToolBar
//============================================================================

var IPython = (function (IPython) {

    var ToolBar = function (selector) {
        this.selector = selector;
        if (this.selector !== undefined) {
            this.construct();
            this.addDropDownList();
            this.element = $(selector);
            this.style();
            this.bind_events();
        }
    };

    // add a group of button into the current toolbar.
    //
    // First argument : Mandatory
    //      list of dict as argument, each dict should contain
    //      3 mandatory keys and values :
    //      'label' : string -- the text to show on hover
    //      'icon'  : string -- the jQuery-ui icon to add on this button
    //      'callback' : function -- the callback to execute on a click
    //
    //      and optionnaly an 'id' key that is assigned to the button element
    //
    // Second Argument, optionnal,
    //      string reprensenting the id to give to the button group.
    //
    // Example
    //
    // IPython.toolbar.addButtonsGroup([
    //  {'label':'my button',
    //   'icon':'ui-icon-disk',
    //   'callback':function(){alert('hoho'),
    //   'id' : 'my_button_id',                 // this is optionnal
    //   }
    //  },
    //  {'label':'my second button',
    //   'icon':'ui-icon-scissors',
    //   'callback':function(){alert('be carefull I cut')}
    //  }
    //  ],
    //  "my_button_group_id"
    //  )
    //
    ToolBar.prototype.addButtonsGroup = function(list, group_id){
        var span_group = $('<span/>');
        if( group_id != undefined )
            span_group.attr('id',group_id)
        for(var el in list)
        {
            var button  = $('<button/>').button({
                icons : {primary: list[el]['icon']},
                text : false,
                label: list[el]['label'],
                });
            var id = list[el]['id'];
            if( id != undefined )
                button.attr('id',id);
            var fun = list[el]['callback']
            button.click(fun);
            span_group.append(button);
        }
        span_group.buttonset();
        $(this.selector).append(span_group)
    }

    ToolBar.prototype.style = function () {
        this.element.addClass('border-box-sizing').
            addClass('ui-widget ui-widget-content toolbar').
            css('border-top-style','none').
            css('border-left-style','none').
            css('border-right-style','none');
    };

    ToolBar.prototype.addDropDownList = function()
    {
        var select = $(this.selector)
            .append($('<select/>')
                .attr('id','cell_type')
                .addClass('ui-widget ui-widget-content')
                    .append($('<option/>').attr('value','code').text('Code'))
                    .append($('<option/>').attr('value','markdown').text('Markdown'))
                    .append($('<option/>').attr('value','raw').text('Raw Text'))
                    .append($('<option/>').attr('value','heading1').text('Heading 1'))
                    .append($('<option/>').attr('value','heading2').text('Heading 2'))
                    .append($('<option/>').attr('value','heading3').text('Heading 3'))
                    .append($('<option/>').attr('value','heading4').text('Heading 4'))
                    .append($('<option/>').attr('value','heading5').text('Heading 5'))
                    .append($('<option/>').attr('value','heading6').text('Heading 6'))
                    .append($('<option/>').attr('value','heading7').text('Heading 7'))
                    .append($('<option/>').attr('value','heading8').text('Heading 8'))
                );
    }

    ToolBar.prototype.construct = function() {
        this.addButtonsGroup([
                {
                    'id':'save_b',
                    'label':'Save',
                    'icon':'ui-icon-disk',
                    'callback':function(){
                        IPython.notebook.save_notebook();
                        },
                },
            ]);
        this.addButtonsGroup([
                {
                    'id':'cut_b',
                    'label':'Cut Cell',
                    'icon':'ui-icon-scissors',
                    'callback':function(){
                        IPython.notebook.cut_cell();
                        },
                },
                {
                    'id':'copy_b',
                    'label':'Copy Cell',
                    'icon':'ui-icon-copy',
                    'callback':function(){
                        IPython.notebook.copy_cell();
                        },
                },
                {
                    'id':'paste_b',
                    'label':'Paste Cell',
                    'icon':'ui-icon-clipboard',
                    'callback':function(){
                        IPython.notebook.paste_cell();
                        },
                },
            ],'cut_copy_paste');

        this.addButtonsGroup([
                {
                    'id':'move_up_b',
                    'label':'Move Cell Up',
                    'icon':'ui-icon-arrowthick-1-n',
                    'callback':function(){
                        IPython.notebook.move_cell_up();
                        },
                },
                {
                    'id':'move_down_b',
                    'label':'Move Cell Down',
                    'icon':'ui-icon-arrowthick-1-s',
                    'callback':function(){
                        IPython.notebook.move_cell_down();
                        },
                },
            ],'move_up_down');
        
        this.addButtonsGroup([
                {
                    'id':'insert_above_b',
                    'label':'Insert Cell Above',
                    'icon':'ui-icon-arrowthickstop-1-n',
                    'callback':function(){
                        IPython.notebook.insert_cell_above('code');
                        },
                },
                {
                    'id':'insert_below_b',
                    'label':'Insert Cell Below',
                    'icon':'ui-icon-arrowthickstop-1-s',
                    'callback':function(){
                        IPython.notebook.insert_cell_below('code');
                        },
                },
            ],'insert_above_below');

        this.addButtonsGroup([
                {
                    'id':'run_b',
                    'label':'Run Cell',
                    'icon':'ui-icon-play',
                    'callback':function(){
                    IPython.notebook.execute_selected_cell();
                        },
                },
                {
                    'id':'interrupt_b',
                    'label':'Interrupt',
                    'icon':'ui-icon-stop',
                    'callback':function(){
                        IPython.notebook.kernel.interrupt();
                        },
                },
            ],'run_int');


    }
    ToolBar.prototype.bind_events = function () {
        var that = this;
        
        this.element.find('#cell_type').change(function () {
            var cell_type = $(this).val();
            if (cell_type === 'code') {
                IPython.notebook.to_code();
            } else if (cell_type === 'markdown')  {
                IPython.notebook.to_markdown();
            } else if (cell_type === 'raw')  {
                IPython.notebook.to_raw();
            } else if (cell_type === 'heading1')  {
                IPython.notebook.to_heading(undefined, 1);
            } else if (cell_type === 'heading2')  {
                IPython.notebook.to_heading(undefined, 2);
            } else if (cell_type === 'heading3')  {
                IPython.notebook.to_heading(undefined, 3);
            } else if (cell_type === 'heading4')  {
                IPython.notebook.to_heading(undefined, 4);
            } else if (cell_type === 'heading5')  {
                IPython.notebook.to_heading(undefined, 5);
            } else if (cell_type === 'heading6')  {
                IPython.notebook.to_heading(undefined, 6);
            };
        });
        $([IPython.events]).on('selected_cell_type_changed.Notebook', function (event, data) {
            if (data.cell_type === 'heading') {
                that.element.find('#cell_type').val(data.cell_type+data.level);
            } else {
                that.element.find('#cell_type').val(data.cell_type);
            }
        });
    };


    ToolBar.prototype.toggle = function () {
        this.element.toggle();
        IPython.layout_manager.do_resize();
    };


    IPython.ToolBar = ToolBar;

    return IPython;

}(IPython));