extension.open_local_file = function () {
        var filebrowse = gw_new_file_dialog(null, 'Open file');
        filebrowse.filter = '*';
        filebrowse.browse(gpac.last_working_directory);

        filebrowse.extension = this;
        this.file_open_dlg = true;
        gw_object_set_dragable(filebrowse);

        filebrowse.on_display_size = function (width, height) {
            var w = width / 2;
            if (w < 200) w = width - 20;
            if (w > 500) w = 500;
            this.set_size(w, 0.8 * height);
            this.move((width - w) / 2, 0);
        }

        filebrowse.on_browse = function (value, directory) {
            if (value == null) {
                this.extension.controler.show();
            } else {
                if (directory) gpac.last_working_directory = directory;
                this.extension.set_movie_url(value);
            }
            this.file_open_dlg = false;
        }

        filebrowse.on_close = function () {
            this.extension.controler.show();
            this.extension.file_open_dlg = false;
        }

        if (this.history.length) {
            filebrowse.go_hist = filebrowse.add_tool('history');
            filebrowse.go_hist.on_click = function () {
                var hist_items = [];
                var history = this.dlg.extension.history;
                for (var i = 0; i < history.length; i++) {
                    var o = {};
                    var f = history[history.length - i - 1];
                    var names = f.url.split('/');
                    if (names.length == 0) names = f.url.split('\\');

                    o.name = names.pop();
                    o.directory = false;
                    o.path = f.url;
                    var delim = f.url.slice(-1);
                    hist_items.push(o);
                }
                this.dlg.set_label('History');
                this.dlg.browse(hist_items);
            }
        }

        filebrowse.go_fav = filebrowse.add_tool('favorite');
        filebrowse.go_fav.on_click = function () {
            var fav_items = [];
            var bookmarks = this.dlg.extension.bookmarks;
            for (var i = 0; i < bookmarks.length; i++) {
                var o = {};
                var f = bookmarks[bookmarks.length - i - 1];
                var names = f.url.split('/');
                if (names.length == 0) names = f.url.split('\\');

                o.name = names.pop();
                if (o.name == '') {
                    o.directory = true;
                    o.name = names.pop();
                } else {
                    o.directory = false;
                }
                o.path = f.url;
                var delim = f.url.slice(-1);
                fav_items.push(o);
            }
            this.dlg.set_label('Bookmarks');
            this.dlg.browse(fav_items);
        }
        if (this.bookmarks.length) filebrowse.go_fav.show();
        else filebrowse.go_fav.hide();


        filebrowse.on_long_click = function (filename, path, directory) {
            var popup = gw_new_window_full(null, true, '');
            popup.dlg = this;
            this.disable();
            popup.area = gw_new_grid_container(popup);
            popup.area.dlg = popup;
            popup.area.break_at_line = true;
            var hist_idx = this.extension.is_in_history(path, true);

            if (hist_idx > -1) {
                var item = gw_new_icon_button(popup.area, 'history', 'Remove from history', true, 'listitem');
                item.dlg = popup;
                item.set_size(0.9 * this.width, gwskin.default_control_height);
                item.index = hist_idx;
                item.on_click = function () {
                    var fb_dlg = this.dlg.dlg;
                    fb_dlg.extension.history.splice(this.index, 1);
                    gpac.set_option('GUI', 'PlaybackHistory', gwskin.stringify(fb_dlg.extension.history));
                    fb_dlg.go_hist.on_click();
                    this.dlg.close();
                }
            }

            if (this.extension.history.length) {
                var item = gw_new_icon_button(popup.area, 'trash', 'Clear all history', true, 'listitem');
                item.dlg = popup;
                item.set_size(0.9 * this.width, gwskin.default_control_height);
                item.index = hist_idx;
                item.on_click = function () {
                    var fb_dlg = this.dlg.dlg;
                    fb_dlg.extension.history = [];
                    gpac.set_option('GUI', 'PlaybackHistory', gwskin.stringify(fb_dlg.extension.history));
                    fb_dlg.close();
                    this.dlg.close();
                }
            }

            var hist_idx = this.extension.is_in_history(path, false);
            item = gw_new_icon_button(popup.area, 'favorite', hist_idx > -1 ? 'Remove from favorites' : 'Add to favorites', true, 'listitem');
            item.dlg = popup;
            item.set_size(0.9 * this.width, gwskin.default_control_height);
            item.index = hist_idx;
            item.on_click = function () {
                var fb_dlg = this.dlg.dlg;
                if (this.index > -1) {
                    fb_dlg.extension.bookmarks.splice(this.index, 1);
                    gpac.set_option('GUI', 'Bookmarks', gwskin.stringify(fb_dlg.extension.bookmarks));
                    if (fb_dlg.extension.bookmarks.length == 0) {
                        fb_dlg.go_fav.hide();
                        fb_dlg.browse(fb_dlg.directory);
                    }
                } else {
                    fb_dlg.extension.add_bookmark(path, false, filename);
                    fb_dlg.go_fav.show();
                }
                fb_dlg.layout(this.dlg.dlg.width, this.dlg.dlg.height);
                this.dlg.close();
            }


            popup.set_size(0.9 * this.width, 0.9 * this.height);
            popup.set_alpha(this.get_alpha());

            popup.on_close = function () {
                this.dlg.enable();
            }
            popup.show();
        }


        filebrowse.go_net = filebrowse.add_tool('remote_location');
        filebrowse.go_net.on_click = function () {
            var popup = gw_new_window_full(null, true, 'Enter Adress');
            popup.dlg = this.dlg;
            this.dlg.disable();
            popup.area = gw_new_grid_container(popup);
            popup.area.dlg = popup;
            popup.area.spread_h = true;

            popup.edit = gw_new_text_edit(popup.area, '');
            popup.edit.dlg = popup;
            gpac.set_focus(popup.edit);
            popup.edit.on_text = function (val) {
                if (val != '') {
                    this.dlg.dlg.on_browse(val, null);
                    this.dlg.dlg.close();
                }
                this.dlg.close();
            }

            popup.on_display_size = function (w, h) {
                this.edit.set_size(0.8 * w, 2 * gwskin.default_text_font_size);
                this.set_size(0.8 * w, 2 * gwskin.default_text_font_size + gwskin.default_icon_height);
            }

            popup.on_display_size(gw_display_width, gw_display_height);
            popup.set_alpha(1.0);

            popup.on_close = function () {
                this.dlg.enable();
            }
            popup.show();
        }


        filebrowse.on_display_size(gw_display_width, gw_display_height);
        if (gpac.hardware_rgba) filebrowse.set_alpha(0.8);

        this.controler.hide();
        filebrowse.show();
        
        return filebrowse;
    };
    
    
extension.is_in_history = function (url, is_history) {
        var search_in = is_history ? this.history : this.bookmarks;
        var hist = search_in.filter(function (obj) { return obj.url == url; });
        if (hist.length) {
            var index = search_in.indexOf(hist[0]);
            return index;
        }
        return -1;
    };

extension.add_bookmark = function (url, is_history) {
        var store = is_history ? this.history : this.bookmarks;
        var hist = store.filter(function (obj) { return obj.url == url; });
        if (hist.length) {
            var index = store.indexOf(hist[0]);
            if (index > -1) store.splice(index, 1);
            hist = hist[0];
        } else {
            hist = {};
            hist.url = url;
            hist.nb_access = 0;
        }
        hist.nb_access++;
        var t = new Date()
        hist.time = t.getTime();
        store.push(hist);

        if (is_history) {
            var nb_max = 3;
            if (this.history.length > nb_max) {
                var rem = this.history.length - nb_max;
                this.history.splice(-nb_max, rem);
            }
        }

        gpac.set_option('GUI', is_history ? 'PlaybackHistory' : 'Bookmarks', gwskin.stringify(store));
    };
