/**
 * Player constructor
 * @constructor
 */

var stbEvent = {
    onEvent: function (data) {
    },
    event: 0
};

/**
 * @constructor
 */
function player() {

    var self = this;

    this.on = false;

    this.f_ch_idx = 0;
    this.ch_idx = 0;
    this.channels;
    this.fav_channels;
    this.fav_channels_ids;

    this.start_time;
    this.cur_media_item = {};
    this.cur_tv_item;
    this.last_not_locked_tv_item;
    this.need_show_info = 0;

    this.ch_aspect = {};
    this.ch_aspect_idx = 0;

    this.atrack_types = {
        1: 'MP2',
        2: 'MP3',
        3: 'DD',
        4: 'AAC',
        5: 'PCM',
        6: 'OGG',
        7: 'DTS'
    };

    this.pause = { "on": false };

    this.rec = {
        "on": false,

        "dom_obj": {},

        "show": function () {
            this.on = true;
            this.dom_obj.show();
        },

        "hide": function () {
            this.on = false;
            this.dom_obj.hide();
        },

        "set_seconds": function (seconds) {
            this.label.innerHTML = seconds;
        }
    };

    this.is_tv = false;

    this.cur_media_length = 0;
    this.cur_pos_time = 0;
    this.new_pos_time = 0;
    this.pos_step = 0;
    this.prev_move_pos_dir = 0;
    this.next_step = 0;
    this.diff_pos = 0;

    this.last_state = 0;
    this.prev_state = 0;

    this.send_last_tv_id_to = 1800000;
    this.send_played_tv_archive_to = 60000;
    this.send_played_timeshift_to = 60000;
    this.last_tv_id = 0;

    this.prev_layer = {};

    this.info = { "on": false, "hide_timer": 4000 };

    this.quick_ch_switch = { "on": false, "hide_to": 3000 };

    this.on_create_link = function () {
    };
    this.last_storage_id = 0;

    this.event1_counter = 0;
    this.event5_counter = 0;

    this.play_auto_ended = false;

    this.hist_ch_idx = [0, 0];
    this.hist_f_ch_idx = [0, 0];

    this.init();
    this.init_pause();
    this.init_rec();
    this.init_show_info();
    this.init_quick_ch_switch();
    this.volume.init();

    this.time_shift_indication.init();
    this.progress_bar.init();

    this.init_aspect_info();

    this.send_last_tv_id_callback = function () {
    };

    this.play_continuously = false;

    this.pos_by_numbers_input = '';

    /*this.con_menu = new context_menu();
    this.con_menu.bind();
    this.con_menu.set_x_offset(100);
    this.con_menu.set_y_offset(100);*/
}

player.prototype.init = function () {
    _debug('player.init');
    try {
        stb.InitPlayer();
        stb.SetTopWin(0);
        stb.SetAspect(0x10);
        stb.SetPIG(1, -1, -1, -1);
        stb.SetUserFlickerControl(1);
        stb.SetDefaultFlicker(1);
        stb.SetLoop(0);
        stb.SetMicVolume(100);

        if (stb.IsFileExist && stb.IsFileExist('/usr/lib/fonts/Ubuntu.ttf')) {
            stb.SetSubtitlesFont("/usr/lib/fonts/Ubuntu.ttf");
        }

        stbEvent.onEvent = (function (self) {
            return function () {
                self.event_callback.apply(self, arguments);
            }
        })(this);

        stbEvent.onMediaAvailable = (function (self) {
            return function () {
                self.play_or_download.apply(self, arguments);
            }
        })(this);

        stbEvent.onPortalEvent = function (params) {
            _debug('params', params);
            params = JSON.parse(params);
            _debug('json params', params);

            if (params.hasOwnProperty("type") && params.type == "settings") {

                if (params.hasOwnProperty("parent_password")) {
                    stb.user.parent_password = params.parent_password;
                }

                if (params.hasOwnProperty("settings_password")) {
                    stb.user.settings_password = params.settings_password;
                }

                if (params.hasOwnProperty("screensaver_delay")) {
                    stb.user.screensaver_delay = params.screensaver_delay;
                    screensaver.restart_timer();
                }

                if (params.hasOwnProperty("plasma_saving")) {
                    stb.user.plasma_saving = stb.profile.plasma_saving = params.plasma_saving;
                }

                if (params.hasOwnProperty("ts_enable_icon")) {
                    stb.user.ts_enable_icon = stb.profile.ts_enable_icon = params.ts_enable_icon;
                }

                if (params.hasOwnProperty("ts_path")) {
                    stb.user.ts_path = stb.profile.ts_path = params.ts_path;
                }

                if (params.hasOwnProperty("ts_max_length")) {
                    stb.user.ts_max_length = stb.profile.ts_max_length = params.ts_max_length;
                }

                if (params.hasOwnProperty("ts_buffer_use")) {
                    stb.user.ts_buffer_use = stb.profile.ts_buffer_use = params.ts_buffer_use;
                }

                if (params.hasOwnProperty("ts_action_on_exit")) {
                    stb.user.ts_action_on_exit = stb.profile.ts_action_on_exit = params.ts_action_on_exit;
                }

                if (params.hasOwnProperty("ts_delay")) {
                    stb.user.ts_delay = stb.profile.ts_delay = params.ts_delay;
                }

                if (params.hasOwnProperty("ts_enabled")) {
                    stb.user.ts_enabled = stb.profile.ts_enabled = params.ts_enabled;
                    module.time_shift_local.init();
                }

                if (params.hasOwnProperty("refresh_weather") && module.curweather) {
                    module.curweather.load.call(module.curweather);
                }

                if (params.hasOwnProperty("hdmi_event_reaction")) {
                    stb.user.hdmi_event_reaction = stb.profile.hdmi_event_reaction = params.hdmi_event_reaction;
                }

                if (params.hasOwnProperty("pri_audio_lang")) {
                    stb.user.pri_audio_lang = stb.profile.pri_audio_lang = params.pri_audio_lang;
                }

                if (params.hasOwnProperty("sec_audio_lang")) {
                    stb.user.sec_audio_lang = stb.profile.sec_audio_lang = params.sec_audio_lang;
                }

                if (params.hasOwnProperty("pri_audio_lang") && params.hasOwnProperty("pri_audio_lang")) {
                    stb.player.set_audio_langs(stb.user.pri_audio_lang, stb.user.sec_audio_lang);
                }

                if (params.hasOwnProperty("pri_subtitle_lang")) {
                    stb.user.pri_subtitle_lang = stb.profile.pri_subtitle_lang = params.pri_subtitle_lang;
                }

                if (params.hasOwnProperty("sec_subtitle_lang")) {
                    stb.user.sec_subtitle_lang = stb.profile.sec_subtitle_lang = params.sec_subtitle_lang;
                }

                if (params.hasOwnProperty("subtitle_size")) {
                    stb.user.subtitle_size = stb.profile.subtitle_size = params.subtitle_size;
                }

                if (params.hasOwnProperty("subtitle_color")) {
                    stb.user.subtitle_color = stb.profile.subtitle_color = params.subtitle_color;
                }

                if (params.hasOwnProperty("pri_subtitle_lang") && params.hasOwnProperty("sec_subtitle_lang") && params.hasOwnProperty("subtitle_size") && params.hasOwnProperty("subtitle_color")) {
                    stb.player.set_subtitle_langs(stb.user.pri_subtitle_lang, stb.user.sec_subtitle_lang, stb.user.subtitle_size, stb.user.subtitle_color);
                }

                if (params.hasOwnProperty("play_in_preview_by_ok")) {
                    stb.user.play_in_preview_only_by_ok = stb.profile.play_in_preview_only_by_ok = params.play_in_preview_by_ok;
                }

                if (params.hasOwnProperty("show_after_loading")) {
                    stb.user.display_menu_after_loading = stb.profile.display_menu_after_loading = params.show_after_loading == 'main_menu';
                }

                if (params.hasOwnProperty("dvb_type") && module.dvb) {
                    module.dvb.set_scan_type(params.dvb_type);
                }

                if (params.hasOwnProperty("dvb_antenna_power") && module.dvb) {
                    module.dvb.set_antenna_power(params.dvb_antenna_power);
                }

                if (params.hasOwnProperty("start_dvb_scan") && module.dvb) {
                    module.dvb.scan(params.data);
                }

                if (params.hasOwnProperty("start_manual_dvb_scan") && module.dvb) {
                    module.dvb.manual_scan(params.data);
                }

                if (params.hasOwnProperty("stop_dvb_scan") && module.dvb) {
                    module.dvb.stop_scan();
                }

                if (params.hasOwnProperty("update_dvb_channels") && module.dvb) {
                    module.dvb.init_channels();
                }

                if (params.hasOwnProperty("clear_dvb_channels") && module.dvb) {
                    module.dvb.clear_dvb_channels();
                }

                if (params.hasOwnProperty("mc_proxy_url")) {
                    stb.player.mc_proxy_url = params.mc_proxy_url;
                }
            }
        };

        stbEvent.onBroadcastMessage = function (win_id, msg) {
            _debug('stbEvent.onBroadcastMessage', win_id, msg);
        };

        stbEvent.onMessage = function (win_id, msg, data) {
            _debug('stbEvent.onMessage', win_id, msg, data);

            /*if (msg == 'stalker:open' && data && module[data]){

                stb.cur_single_module = data;
                _debug('stb.cur_single_module', stb.cur_single_module);

                module[stb.cur_layer.layer_name].hide && module[stb.cur_layer.layer_name].hide();

                if (module[data]._show){
                    module[data]._show();
                }else if (module[data].show){
                    module[data].show();
                }

            }else */
            if (msg == 'show') {
                if (data) {
                    data = JSON.parse(data);

                    if (data.module && module[data.module]) {
                        stb.cur_single_module = data.module;
                        _debug('stb.cur_single_module', stb.cur_single_module);

                        module[stb.cur_layer.layer_name].hide && module[stb.cur_layer.layer_name].hide();

                        if (module[stb.cur_single_module]._show) {
                            module[stb.cur_single_module]._show();
                        } else if (module[stb.cur_single_module].show) {
                            module[stb.cur_single_module].show();
                        }
                    }
                }

                stbWindowMgr.windowShow(windowId);
            } else if (msg == 'exit') {
                stbWebWindow.close();
            } else if (msg == 'AutoUpdateWindow:opened') {
                loader.pause();
            } else if (msg == 'AutoUpdateWindow:closed') {
                loader.resume();
            }
        };

    } catch (e) {
        _debug(e);
    }
};

player.prototype.set_audio_langs = function (pri_lang, sec_lang) {
    _debug('player.set_audio_langs', pri_lang, sec_lang);

    pri_lang = pri_lang || "";
    sec_lang = sec_lang || "";

    _debug('pri_lang', pri_lang);
    _debug('sec_lang', sec_lang);

    try {
        stb.SetAudioLangs(pri_lang, sec_lang);
    } catch (e) {
        _debug(e);
    }

    if (['MAG351', 'MAG256', 'MAG257'].indexOf(stb.type) != -1) {
        this.quick_ch_switch.input.style.marginTop = '5px';
    }
};

player.prototype.set_subtitle_langs = function (pri_lang, sec_lang, size, color) {
    _debug('player.set_subtitle_langs', pri_lang, sec_lang, size, color);

    pri_lang = pri_lang || "";
    sec_lang = sec_lang || "";

    _debug('pri_lang', pri_lang);
    _debug('sec_lang', sec_lang);

    if (!pri_lang && sec_lang) {
        pri_lang = sec_lang;
    } else if (!sec_lang && pri_lang) {
        sec_lang = pri_lang;
    }

    try {
        if (!pri_lang) {
            this.subtitle_pid.disable();
            stb.profile['always_enabled_subtitles'] = 0;
        } else {
            this.subtitle_pid.enable();
            stb.profile['always_enabled_subtitles'] = 1;
            stb.SetSubtitleLangs(pri_lang, sec_lang);
        }

        stb.SetSubtitlesSize(size);
        stb.SetSubtitlesColor(color);
    } catch (e) {
        _debug(e);
    }
};

player.prototype.setup_rtsp = function (rtsp_type, rtsp_flags) {
    _debug('player.prototype.setup_rtsp', rtsp_type, rtsp_flags);
    try {
        stb.SetupRTSP(parseInt(rtsp_type), parseInt(rtsp_flags));
    } catch (e) {
        _debug(e);
    }
};

player.prototype.set_cas = function (profile) {
    _debug('player.prototype.setup_cas', profile);
    try {

        if (profile['cas_ini_file']) {
            _debug('stb.LoadCASIniFile', profile['cas_ini_file']);
            stb.LoadCASIniFile(profile['cas_ini_file']);
        }

        if (!profile['cas_ini_file'] && profile['cas_params']) {
            _debug('stb.SetCASParam',
                profile['cas_params'].server_addr,
                parseInt(profile['cas_params'].server_port, 10),
                profile['cas_params'].company_name,
                parseInt(profile['cas_params'].ip_id, 10),
                parseInt(profile['cas_params'].error_level, 10));

            stb.SetCASParam(
                profile['cas_params'].server_addr,
                parseInt(profile['cas_params'].server_port, 10),
                profile['cas_params'].company_name,
                parseInt(profile['cas_params'].ip_id, 10),
                parseInt(profile['cas_params'].error_level, 10)
            );
        }

        if (!profile['cas_ini_file'] && profile['cas_additional_params']) {
            for (var param in profile['cas_additional_params']) {
                if (profile['cas_additional_params'].hasOwnProperty(param)) {
                    _debug('stb.SetAdditionalCasParam', param, profile['cas_additional_params'][param]);
                    stb.SetAdditionalCasParam(param, profile['cas_additional_params'][param]);
                }
            }
        }

        if (profile.hasOwnProperty('cas_hw_descrambling')) {
            _debug('stb.SetCASDescrambling', profile['cas_hw_descrambling']);
            stb.SetCASDescrambling(profile['cas_hw_descrambling']);
        }

        if (!profile['cas_ini_file'] && profile['cas_web_params']) {
            _debug('stb.SetupWebCAS', profile['cas_web_params'].server_addr, profile['cas_web_params'].company_name);
            stb.SetupWebCAS(profile['cas_web_params'].server_addr, profile['cas_web_params'].company_name);
        }

        if (profile['cas_type']) {
            _debug('stb.SetCASType', parseInt(profile['cas_type'], 10));
            stb.SetCASType(parseInt(profile['cas_type'], 10));
        }

    } catch (e) {
        _debug(e);
    }
};

player.prototype.set_hls_fast_start = function (hls_fast_start) {
    _debug('player.set_hls_fast_start', hls_fast_start);

    if (!stb.SetPlayerOption) {
        _debug('stb.SetPlayerOption method not found!');
        return;
    }

    stb.SetPlayerOption('HlsFastStart', hls_fast_start ? '1' : '0')
};

player.prototype.play_or_download = function (content_type, url) {
    _debug('player.play_media', content_type, url);

    /*if (content_type.indexOf('video') == 0 || content_type.indexOf('audio') == 0){*/

    this.init_play_or_download_dialog();

    if (content_type.indexOf('video') == 0) {
        _debug('module.downloads', !!module.downloads);
        if (module.downloads) {
            //this.init_play_or_download_dialog();
            this.play_or_download_dialog.contentType = content_type;
            this.play_or_download_dialog.url = url;
            this.play_or_download_dialog.show();
            _debug('before close');
            try {
                stbWindowMgr.showPortalWindow();
            } catch (e) {
                _debug(e);
            }
            _debug('after close');
        } else {
            _debug('play url');

            stb.set_cur_place('internet');

            main_menu.hide();

            stb.player.prev_layer = main_menu;

            stb.player.play({
                "cmd": "ffmpeg " + stb.player.play_or_download_dialog.url,
                "name": stb.player.play_or_download_dialog.url.split("/").pop()
            });
        }
    } else if (module.downloads) {
        _debug('show download dialog');
        module.downloads.dialog.show({ "parent": main_menu, "url": url });
        stbWindowMgr.showPortalWindow();
    }
};

player.prototype.show_time_shift_exit_confirm = function () {
    _debug('player.show_time_shift_exit_confirm');
    this.init_time_shift_exit_confirm();
    this.time_shift_exit_confirm.show();
};

player.prototype.init_time_shift_exit_confirm = function () {
    _debug('player.init_time_shift_exit_confirm');

    if (this.time_shift_exit_confirm) {
        return;
    }

    this.time_shift_exit_confirm = new ModalForm({
        "title": get_word('confirm_form_title'),
        "text": get_word('time_shift_exit_confirm_text')
    });
    this.time_shift_exit_confirm.getTextDomObj().style.textAlign = "center";
    this.time_shift_exit_confirm.enableOnExitClose();

    var scope = this;

    this.time_shift_exit_confirm.addItem(new ModalFormButton(
        {
            "value": get_word("close_btn"),
            "onclick": function () {
                scope.time_shift_exit_confirm.hide();
            }
        }
    ));

    this.time_shift_exit_confirm.addItem(new ModalFormButton(
        {
            "value": get_word("ok_btn"),
            "onclick": function () {

                scope.time_shift_exit_confirm.hide();

                if (scope.active_local_time_shift) {
                    module.time_shift_local.disable_mode();
                    scope.active_local_time_shift = false;
                    scope.is_tv = true;

                    if (scope.pause.on) {
                        scope.disable_pause();
                    }
                } else {

                    if (scope.cur_media_item.timeshift_hist_id) {
                        scope.update_played_timeshift_end_time(scope.cur_media_item.timeshift_hist_id);
                    }

                    scope.cur_media_item = module.time_shift.stored_media_item;
                    scope.cur_tv_item = scope.cur_media_item;
                    scope.active_time_shift = false;
                    scope.play_last();
                }
            }
        }
    ));
};

player.prototype.init_pvr_dialogs = function () {
    _debug('player.init_pvr_dialogs');

    if (this.pvr_target_select) {
        return;
    }

    var scope = this;

    this.pvr_target_select = new ModalForm({
        "title": get_word('select_form_title'),
        "text": get_word('pvr_target_select_text')
    });
    this.pvr_target_select.getTextDomObj().style.textAlign = "center";
    this.pvr_target_select.enableOnExitClose();

    this.pvr_target_select.addItem(new ModalFormButton(
        {
            "value": get_word("usb_target_btn"),
            "onclick": function () {
                if (scope.pvr_target_select.deferred) {
                    scope.local_pvr_confirm.channel = scope.pvr_target_select.channel;
                    scope.local_pvr_confirm.program = scope.pvr_target_select.program;
                } else {
                    scope.local_pvr_confirm.channel = scope.pvr_target_select.channel;
                }
                scope.local_pvr_confirm.deferred = scope.pvr_target_select.deferred;

                if (scope.pvr_target_select.deferred) {
                    scope.local_pvr_confirm.getItemByName('start_btn').setValue(get_word('add_btn'));
                } else {
                    scope.local_pvr_confirm.getItemByName('start_btn').setValue(get_word('start_btn'));
                }
                scope.pvr_target_select.hide();
                scope.local_pvr_confirm.show({ parent: scope.pvr_target_select._parent });
            }
        }
    ));

    this.pvr_target_select.addItem(new ModalFormButton(
        {
            "value": get_word("server_target_btn"),
            "onclick": function () {

                if (scope.pvr_target_select.deferred) {
                    scope.remote_pvr_confirm.program = scope.pvr_target_select.program;
                } else {
                    scope.remote_pvr_confirm.channel = scope.pvr_target_select.channel;
                }

                scope.remote_pvr_confirm.deferred = scope.pvr_target_select.deferred;

                scope.pvr_target_select.hide();

                if (scope.pvr_target_select.deferred) {
                    scope.remote_pvr_confirm.show({
                        text: get_word('remote_deferred_pvr_confirm_text'),
                        parent: scope.pvr_target_select._parent
                    });
                } else {
                    scope.remote_pvr_confirm.show({
                        text: get_word('remote_pvr_confirm_text'),
                        parent: scope.pvr_target_select._parent
                    });
                }
            }
        }
    ));

    this.remote_pvr_confirm = new ModalForm({
        "title": get_word('confirm_form_title'),
        "text": get_word('remote_pvr_confirm_text')
    });
    this.remote_pvr_confirm.getTextDomObj().style.textAlign = "center";
    this.remote_pvr_confirm.enableOnExitClose();
    this.remote_pvr_confirm.addItem(new ModalFormButton(
        {
            "value": get_word("cancel_btn"),
            "onclick": function () {
                scope.remote_pvr_confirm.hide();
            }
        }
    ));
    this.remote_pvr_confirm.addItem(new ModalFormButton(
        {
            "value": get_word("yes_btn"),
            "onclick": function () {

                if (scope.remote_pvr_confirm.deferred) {
                    scope.remote_pvr_confirm._parent.recorder.add_remote(scope.remote_pvr_confirm.program)
                } else {
                    module.remote_pvr.start_rec(scope.remote_pvr_confirm.channel.id);
                }

                scope.remote_pvr_confirm.hide();
            }
        }
    ));

    this.local_pvr_confirm = new ModalForm({ "title": get_word('rec_options_form_title'), "id": "local_pvr_confirm" });
    this.local_pvr_confirm.enableOnExitClose();

    this.local_pvr_confirm.addItem(
        new ModalFormDateTimeSelect(
            {
                "label": get_word('pvr_start_time') + ':',
                "name": "start_time",
                "onset": function (value) {
                    _debug('onset start_time', value);
                    var start_time = scope.local_pvr_confirm.getItemByName('start_time').getDateValue();
                    var end_time = scope.local_pvr_confirm.getItemByName('end_time').getDateValue();

                    var duration = (end_time.getTime() - start_time.getTime()) / 1000;

                    _debug('duration', duration);

                    if (duration < 0) {
                        duration = 0;
                    }

                    scope.local_pvr_confirm.getItemByName('duration').setTime(duration);
                }
            }
        )
    );

    this.local_pvr_confirm.addItem(
        new ModalFormDateTimeSelect(
            {
                "label": get_word('pvr_end_time') + ':',
                "name": "end_time",
                "onset": function (value) {
                    _debug('onset end_time', value);

                    var start_time = scope.local_pvr_confirm.getItemByName('start_time').getDateValue();
                    var end_time = scope.local_pvr_confirm.getItemByName('end_time').getDateValue();

                    var duration = (end_time.getTime() - start_time.getTime()) / 1000;

                    _debug('duration', duration);

                    if (duration < 0) {
                        duration = 0;
                    }

                    scope.local_pvr_confirm.getItemByName('duration').setTime(duration);
                }
            }
        )
    );

    this.local_pvr_confirm.addItem(
        new ModalFormDateTimeSelect(
            {
                "label": get_word('pvr_duration') + ':',
                "name": "duration",
                "only_time": true,
                "max_time": "05:00",
                "onset": function (value) {
                    _debug('onset duration', value);

                    var start_time = scope.local_pvr_confirm.getItemByName('start_time').getDateValue();

                    var duration_parts = value.split(':');

                    var duration = parseInt(duration_parts[0], 10) * 3600 + parseInt(duration_parts[1], 10) * 60;

                    _debug('duration', duration);

                    start_time.setSeconds(duration);

                    scope.local_pvr_confirm.getItemByName('end_time').setValue(start_time.getTime());
                }
            }
        )
    );

    this.local_pvr_confirm.addItem(new ModalFormSelect({ "label": get_word('usb_device') + ':', "name": "usb_device" }));
    this.local_pvr_confirm.addItem(new ModalFormInput({ "label": get_word('file_name') + ':', "name": "file_name" }));

    this.local_pvr_confirm.addItem(new ModalFormButton(
        {
            "value": get_word("cancel_btn"),
            "onclick": function () {
                scope.local_pvr_confirm.hide();
            }
        }
    ));
    this.local_pvr_confirm.addItem(new ModalFormButton(
        {
            "value": get_word("start_btn"),
            "name": "start_btn",
            "onclick": function () {
                var path = scope.local_pvr_confirm.getItemByName('usb_device').getValue() + '/' + scope.local_pvr_confirm.getItemByName('file_name').getValue();

                var start_time = scope.local_pvr_confirm.getItemByName('start_time').getDateValue();
                var end_time = scope.local_pvr_confirm.getItemByName('end_time').getDateValue();

                var duration = (end_time.getTime() - start_time.getTime()) / 1000;

                _debug('duration', duration);

                if (duration < 0) {
                    duration = 0;
                }

                var now_time = new Date();

                if (start_time.getTime() > now_time.getTime() && !scope.local_pvr_confirm.deferred) {
                    scope.local_pvr_confirm.deferred = true;
                    scope.local_pvr_confirm.program = {
                        "id": 0,
                        "ch_id": scope.local_pvr_confirm.channel.id,
                        "start_timestamp": parseInt(start_time.getTime() / 1000, 10),
                        "stop_timestamp": parseInt(end_time.getTime() / 1000, 10)
                    };
                } else if (scope.local_pvr_confirm.deferred && scope.local_pvr_confirm.program) {
                    if (scope.local_pvr_confirm.program.start_timestamp * 1000 != start_time.getTime()
                        || scope.local_pvr_confirm.program.stop_timestamp * 1000 != end_time.getTime()) {
                        scope.local_pvr_confirm.program.start_timestamp = parseInt(start_time.getTime() / 1000, 10);
                        scope.local_pvr_confirm.program.stop_timestamp = parseInt(end_time.getTime() / 1000, 10);
                    }
                }

                if (scope.local_pvr_confirm.deferred && scope.local_pvr_confirm.program.id == 0) {
                    module.pvr_local.create_for_program(scope.local_pvr_confirm.program, path)
                } else if (scope.local_pvr_confirm.deferred) {
                    scope.local_pvr_confirm._parent.recorder.add_local(scope.local_pvr_confirm.program, path)
                } else {
                    module.pvr_local.create(scope.local_pvr_confirm.channel, path, null, parseInt(end_time.getTime() / 1000, 10));
                }

                scope.local_pvr_confirm.hide();
            }
        }
    ));

    this.local_pvr_confirm.addCustomEventListener('before_show', function () {

        if (scope.local_pvr_confirm.program && scope.local_pvr_confirm.deferred) {
            var start_time = scope.local_pvr_confirm.program.start_timestamp * 1000;
            var end_time = scope.local_pvr_confirm.program.stop_timestamp * 1000;
        } else {

            start_time = 'now';

            var epg = stb.epg_loader.get_curr_and_next(scope.local_pvr_confirm.channel.id);

            if (epg && epg.length > 0) {
                end_time = epg[0].stop_timestamp * 1000;
            } else {
                end_time = new Date().getTime() + 3 * 3600 * 1000;
            }
        }

        scope.local_pvr_confirm.getItemByName('start_time').setValue(start_time);
        scope.local_pvr_confirm.getItemByName('end_time').setValue(end_time);
        scope.local_pvr_confirm.getItemByName('end_time')._onset(scope.local_pvr_confirm.getItemByName('end_time').getValue());
    });

    this.local_pvr_confirm.addCustomEventListener('show', function () {

        var options = stb.usbdisk.storage_info.map(function (storage_info) {
            storage_info.value = storage_info.mountPath;
            storage_info.text = storage_info.vendor
                + ' ' + storage_info.model
                + (storage_info.label ? '(' + storage_info.label + ')' : '')
                + (storage_info.partitionNum > 1 ? ' #' + storage_info.partitionNum : '');
            return storage_info;
        });

        scope.local_pvr_confirm.getItemByName('usb_device').setOptions(options);

        if (scope.local_pvr_confirm.deferred) {
            scope.local_pvr_confirm.getItemByName('file_name').setValue(module.pvr_local.get_record_filename_for_program(scope.local_pvr_confirm.program));
        } else {
            scope.local_pvr_confirm.getItemByName('file_name').setValue(module.pvr_local.get_record_filename(scope.local_pvr_confirm.channel));
        }
    });
};

player.prototype.init_subtitle_encoding_select = function () {
    _debug('player.init_subtitle_encoding_select');

    if (this.subtitle_encoding_select) {
        return;
    }

    this.subtitle_encoding_select = new ModalForm({ "title": get_word('select_form_title') });
    this.subtitle_encoding_select.enableOnExitClose();

    this.subtitle_encoding_select.addItem(new ModalFormSelect(
        {
            "label": get_word('encoding_label') + ':',
            "name": "subtitle_encoding",
            "options": [
                {
                    "text": "UTF-8",
                    "value": "utf-8"
                },
                {
                    "text": "Windows-1250 (cp1250)",
                    "value": "cp1250"
                },
                {
                    "text": "Windows-1251 (cp1251)",
                    "value": "cp1251"
                },
                {
                    "text": "Windows-1252 (cp1252)",
                    "value": "cp1252"
                },
                {
                    "text": "Windows-1253 (cp1253)",
                    "value": "cp1253"
                },
                {
                    "text": "Windows-1254 (cp1254)",
                    "value": "cp1254"
                },
                {
                    "text": "Windows-1255 (cp1255)",
                    "value": "cp1255"
                },
                {
                    "text": "Windows-1256 (cp1256)",
                    "value": "cp1256"
                },
                {
                    "text": "Windows-1257 (cp1257)",
                    "value": "cp1257"
                },
                {
                    "text": "Windows-1258 (cp1258)",
                    "value": "cp1258"
                },
                {
                    "text": "Latin 1 (iso8859-1)",
                    "value": "iso8859-1"
                },
                {
                    "text": "Latin 2 (iso8859-2)",
                    "value": "iso8859-2"
                },
                {
                    "text": "Latin 3 (iso8859-3)",
                    "value": "iso8859-3"
                },
                {
                    "text": "Latin 4 (iso8859-4)",
                    "value": "iso8859-4"
                },
                {
                    "text": "Latin/Cyrillic (iso8859-5)",
                    "value": "iso8859-5"
                },
                {
                    "text": "Latin/Arabic (iso8859-6)",
                    "value": "iso8859-6"
                },
                {
                    "text": "Latin/Greek (iso8859-7)",
                    "value": "iso8859-7"
                },
                {
                    "text": "Latin/Hebrew (iso8859-8)",
                    "value": "iso8859-8"
                },
                {
                    "text": "Latin 5 (iso8859-9)",
                    "value": "iso8859-9"
                },
                {
                    "text": "Latin 6 (iso8859-10)",
                    "value": "iso8859-10"
                },
                {
                    "text": "Latin/Thai (iso8859-11)",
                    "value": "iso8859-11"
                },
                {
                    "text": "Latin/Devanagari (iso8859-12)",
                    "value": "iso8859-12"
                },
                {
                    "text": "Latin 7 (iso8859-13)",
                    "value": "iso8859-13"
                },
                {
                    "text": "Latin 8 (iso8859-14)",
                    "value": "iso8859-14"
                },
                {
                    "text": "Latin 9 (iso8859-15)",
                    "value": "iso8859-15"
                },
                {
                    "text": "Latin 10 (iso8859-16)",
                    "value": "iso8859-16"
                }
            ]
        }
    ));

    var scope = this;

    this.subtitle_encoding_select.addItem(new ModalFormButton({
        "value": get_word("ok_btn"),
        "name": "ok_btn",
        "onclick": function () {
            var subtitle_encoding = scope.subtitle_encoding_select.getItemByName('subtitle_encoding').getValue();

            _debug('subtitle_encoding', subtitle_encoding);

            scope.subtitle_encoding_select.on_confirm && scope.subtitle_encoding_select.on_confirm(subtitle_encoding);
            scope.subtitle_encoding_select.hide();
        }
    }));
};

player.prototype.init_play_or_download_dialog = function () {
    _debug('player.init_play_or_download_dialog');

    if (this.play_or_download_dialog) {
        return;
    }

    this.play_or_download_dialog = new ModalForm({ "title": get_word('play_or_download') });
    this.play_or_download_dialog.enableOnExitClose();

    this.play_or_download_dialog.addItem(new ModalFormButton(
        {
            "value": get_word("player_play"),
            "onclick": function () {

                stb.set_cur_place('internet');

                stb.player.play_or_download_dialog.hide();
                main_menu.hide();

                stb.player.prev_layer = main_menu;

                stb.player.play({
                    "cmd": "ffmpeg " + stb.player.play_or_download_dialog.url,
                    "name": stb.player.play_or_download_dialog.url.split("/").pop()
                });
            }
        }
    ));

    this.play_or_download_dialog.addItem(new ModalFormButton(
        {
            "value": get_word("player_download"),
            "onclick": function () {

                module.downloads.dialog.show({ "parent": main_menu, "url": stb.player.play_or_download_dialog.url });

                stb.player.play_or_download_dialog.hide();
            }
        }
    ));
};

player.prototype.event_callback = function (event, params) {
    _debug('event: ', event);

    event = parseInt(event);

    if ([1, 2, 4, 5].indexOf(event) >= 0) {
        this.last_state = event;
    }

    this.play_initiated = false;

    var self = this;

    switch (event) {
        case 1: // End of stream
            {

                playback_limit.reset();

                try {

                    if (this.cur_media_item.hasOwnProperty('ad_tracking')) {
                        if (this.cur_media_item.ad_tracking.hasOwnProperty('complete')) {
                            stb.advert.track(this.cur_media_item.ad_tracking['complete'], 'complete')
                        }
                    }

                    if (this.cur_media_item.stop_callback) {

                        this.ad_indication.hide();
                        this.ad_skip_indication.hide();
                        stb.advert.stop_ticking();

                        this.cur_media_item.stop_callback();
                        return;
                    }

                    //this.prev_layer && this.prev_layer.show && this.prev_layer.show.call(this.prev_layer, true);

                    this.play_auto_ended = true;

                    if (this.media_type == 'stream' && (this.is_tv || stb.cur_place == 'radio')) {
                        _debug('stream error');

                        this.event1_counter++;

                        _debug('stb.user.tv_playback_retry_limit', stb.user.tv_playback_retry_limit);
                        _debug('stb.user.fading_tv_retry_timeout', stb.user.fading_tv_retry_timeout);
                        _debug('this.event1_counter', this.event1_counter);

                        if (stb.user.tv_playback_retry_limit > 0 && this.event1_counter > stb.user.tv_playback_retry_limit) {
                            _debug('stop replay');
                            return;
                        }

                        var replay_timeout = 1000;

                        if (stb.user.fading_tv_retry_timeout) {
                            replay_timeout *= this.event1_counter <= 2 ? 1 : 30;
                        }

                        if (this.is_tv) {

                            if (stb.profile['enable_stream_error_logging']) {
                                stb.log_stream_error(this.cur_tv_item['id'], 1);
                            }

                            this.replay_channel_timer = window.setTimeout(
                                function () {
                                    self.play_last();
                                },
                                replay_timeout
                            );
                        } else {
                            this.replay_channel_timer = window.setTimeout(
                                function () {
                                    self.play_last_radio();
                                },
                                replay_timeout
                            );
                        }
                    } else {

                        if (this.cur_media_item.media_type != 'vclub_ad' && this.cur_media_item.media_type != 'advert' && this.play_continuously && this.cur_media_item.hasOwnProperty('series') && this.cur_media_item.series && this.cur_media_item.series.length > 0) {

                            _debug('this.cur_media_item.cur_series before', this.cur_media_item.cur_series);
                            _debug('this.cur_media_item.series.length', this.cur_media_item.series.length);
                            _debug('this.cur_media_item.hasOwnProperty(series)', this.cur_media_item.hasOwnProperty('series'));

                            var series_idx = this.cur_media_item.series.indexOf(this.cur_media_item.cur_series);

                            _debug('series_idx before', series_idx);

                            var old_series_idx = series_idx;

                            if (series_idx < this.cur_media_item.series.length - 1) {
                                series_idx++;
                            }

                            _debug('series_idx after', series_idx);

                            if (old_series_idx != series_idx) {

                                this.cur_media_item.cur_series = this.cur_media_item.series[series_idx];
                                this.cur_media_item.disable_ad = true;

                                if (this.cur_media_item.cmd.indexOf('://')) {
                                    this.cur_media_item.cmd = '/media/' + this.cur_media_item.id + '.mpg';
                                }

                                this.play(this.cur_media_item);
                                break;
                            }

                        } else if (this.cur_media_item.playlist && this.cur_media_item.playlist.length > 0) {

                            stb.key_lock = false;

                            if (typeof (this.cur_media_item.playlist[0]) == 'object') {

                                idx = -1;

                                for (var i = 0; i < this.cur_media_item.playlist.length; i++) {
                                    if (this.cur_media_item.id == this.cur_media_item.playlist[i].id) {
                                        idx = i;
                                        break;
                                    }
                                }

                                _debug('playlist idx', idx);

                                if (idx >= 0 && idx < this.cur_media_item.playlist.length - 1) {
                                    idx++;

                                    cur_media_item = this.cur_media_item.playlist[idx].clone();
                                    cur_media_item.playlist = this.cur_media_item.playlist;
                                    _debug('cur_media_item', cur_media_item);

                                    if (cur_media_item.is_audio) {
                                        cur_media_item.number = null;
                                    }

                                    this.play(cur_media_item);

                                    break;
                                }

                            } else {
                                var idx = this.cur_media_item.playlist.indexOf(this.cur_media_item.cmd);

                                _debug('playlist idx', idx);


                                if (idx >= 0 && idx < this.cur_media_item.playlist.length - 1) {

                                    idx++;

                                    var cur_media_item = this.cur_media_item.clone();

                                    cur_media_item.cmd = cur_media_item.playlist[idx];

                                    var real_id_match = /real_id=([^&]*)/.exec(cur_media_item.cmd);

                                    if (real_id_match) {
                                        cur_media_item.real_id = real_id_match[1];
                                    }

                                    var osd_title_match = /osd_title=([^&]*)/.exec(cur_media_item.cmd);

                                    if (osd_title_match) {
                                        cur_media_item.name = decodeURIComponent(osd_title_match[1].replace(/\+/g, '%20'));
                                    } else if (!cur_media_item.hasOwnProperty('keep_original_name') || !cur_media_item.keep_original_name) {
                                        cur_media_item.name = cur_media_item.cmd.substr(this.cur_media_item.cmd.lastIndexOf("/") + 1);
                                    }

                                    if (cur_media_item.show_osd) {
                                        this.need_show_info = 1;
                                    }

                                    if (this.cur_media_item.media_type && this.cur_media_item.media_type == 'vclub_ad') {
                                        delete cur_media_item.media_type;
                                        cur_media_item.disable_ad = true;
                                        module && module.vclub && module.vclub.set_ad_ended_time && module.vclub.set_ad_ended_time(this.cur_media_item.ad_id, stb.GetPosTime(), stb.GetMediaLen(), true);
                                    }

                                    if (cur_media_item.hasOwnProperty('ad_must_watch')) {
                                        delete cur_media_item.ad_must_watch;
                                    }

                                    this.play(cur_media_item);

                                    break;
                                }
                            }
                        }

                        /*if (this.active_time_shift && this.cur_media_item['wowza_dvr'] != 1){*/
                        if (this.active_time_shift) {

                            var cur_piece_pos_time = stb.GetPosTime();
                            _debug('cur_piece_pos_time', cur_piece_pos_time);
                            var diff = 3600 - cur_piece_pos_time;
                            _debug('diff', diff);

                            ///if (cur_piece_pos_time(cur_piece_pos_time - stb.GetPosTime()) > 60 ){
                            if (diff <= 10 && diff >= -10) {
                                var new_url = module.time_shift.get_next_part();

                                if (new_url) {

                                    module.time_shift.update_media_item(new_url);
                                    this.need_show_info = 0;
                                    this.play(module.time_shift.cur_media_item);
                                    break;
                                }

                            } else {
                                this.cur_media_item = module.time_shift.stored_media_item;
                                this.cur_tv_item = this.cur_media_item;
                                this.active_time_shift = false;
                                this.play_last(); // 
                                return;

                            }
                        }

                        if (this.emulate_media_len) {

                            /*var global_pos_time = stb.GetPosTime();
                            this.cur_pos_time = global_pos_time - (this.cur_media_item.position ? this.cur_media_item.position : 0);
    
                            _debug('this.cur_media_length', this.cur_media_length);
                            _debug('this.cur_pos_time', this.cur_pos_time);
                            */

                            if ((this.cur_media_length - this.cur_pos_time) > 60) {

                                if (module.tv_archive) {

                                    new_url = module.tv_archive.get_next_part();

                                    if (new_url) {

                                        this.cur_media_item.cmd = new_url;
                                        //this.cur_media_item.position = undefined;
                                        delete this.cur_media_item.open;
                                        //delete this.cur_media_item.media_len;
                                        this.need_show_info = 0;
                                        this.play(this.cur_media_item);
                                        break;
                                    }
                                }
                            }
                        }

                        if (this.prev_layer && this.prev_layer.show) {
                            this.prev_layer.show.call(this.prev_layer, true);
                        }

                        this.stop();
                    }

                } catch (e) {
                    _debug(e);
                }

                break;
            }
        case 2: // Receive information about stream
            {

                this.set_media_aspect();

                if (stb.GetMetadataInfo) {
                    var metadata = stb.GetMetadataInfo();
                    _debug('stb.GetMetadataInfo()', metadata);

                    metadata = JSON.parse(metadata);

                    if (metadata && metadata.hasOwnProperty('titles') && metadata.titles.length > 1) {

                        var title_idx = self.cur_media_item.cmd.indexOf('?title=');

                        if (title_idx != -1) {
                            var clear_cmd = self.cur_media_item.cmd.substr(0, title_idx);
                        } else {
                            clear_cmd = self.cur_media_item.cmd;
                        }

                        this.cur_media_item.playlist = metadata.titles.map(function (title, idx) {
                            return clear_cmd + '?title=' + idx;
                        });

                        if (metadata.hasOwnProperty('infoCurtitle')) {
                            this.cur_media_item.cmd = clear_cmd + '?title=' + metadata.infoCurtitle;
                        }
                    }

                    _debug('this.cur_media_item', this.cur_media_item);
                }
                /*if (this.cur_media_item.hasOwnProperty('volume_correction')){
                    this.volume.correct_level(parseInt(this.cur_media_item.volume_correction));
                }else{
                    this.volume.correct_level(0);
                }*/

                _debug('this.prev_state', this.prev_state);

                if (this.prev_state == 4) {
                    this.get_pids();
                }

                this.triggerCustomEventListener('event_2', this.cur_media_item);
                //if (this.is_tv){
                if (stb.user['enable_buffering_indication'] && this.cur_media_item.cmd.indexOf('rtp ') != 0) {
                    this.progress_bar.start();
                }
                //}

                break;
            }
        case 4: // Playback started
            {
                this.event1_counter = 0;
                this.event5_counter = 0;

                this.triggerCustomEventListener('event_4', this.cur_media_item);
                if (stb.user['enable_buffering_indication'] && this.cur_media_item.cmd.indexOf('rtp ') != 0) {
                    this.progress_bar.stop();
                }

                if (this.cur_media_item.hasOwnProperty('ad_tracking')) {

                    if (this.cur_media_item.ad_tracking.hasOwnProperty('impression')) {
                        stb.advert.track(this.cur_media_item.ad_tracking['impression'], 'impression')
                    }

                    if (this.cur_media_item.ad_tracking.hasOwnProperty('creativeView')) {
                        stb.advert.track(this.cur_media_item.ad_tracking['creativeView'], 'creativeView')
                    }

                    if (this.cur_media_item.ad_tracking.hasOwnProperty('start')) {
                        stb.advert.track(this.cur_media_item.ad_tracking['start'], 'start')
                    }
                }

                if (this.cur_media_item.hasOwnProperty('volume_correction')) {
                    this.volume.correct_level(parseInt(this.cur_media_item.volume_correction));
                } else {
                    this.volume.correct_level(0);
                }

                this.time_shift_indication.hide();

                if (this.is_tv) {
                    stb.notice.hide();
                }

                if (this.is_tv && this.cur_tv_item && this.cur_tv_item.ready_to_timeshift && module.time_shift_local && module.time_shift_local.enabled) {

                    if (stb.profile.ts_delay !== 'on_pause') {
                        this.enable_local_timeshift = window.setTimeout(function () {
                            module.time_shift_local.enable_mode();
                        }, stb.profile.ts_delay * 1000);
                    }
                }

                if (this.active_local_time_shift && module.time_shift_local) {

                    this.time_shift_indication.show();

                } else if (this.active_time_shift && module.time_shift) {

                    this.cur_pos_time = module.time_shift.get_pos_time();
                    this.cur_media_length = module.time_shift.get_cur_media_length();

                    this.time_shift_indication.show();

                    window.clearTimeout(this.send_played_timeshift_timer);

                    this.send_played_timeshift_timer = window.setTimeout(
                        function () {
                            self.send_played_timeshift(stb.player.cur_media_item.id);
                        },

                        this.send_played_timeshift_to
                    );

                } else if (this.emulate_media_len && module.tv_archive) {
                    /*var global_pos_time = stb.GetPosTime();
                    this.cur_pos_time = global_pos_time - (this.cur_media_item.position ? this.cur_media_item.position : 0);
    
                    _debug('global_pos_time', global_pos_time);
                    _debug('this.cur_media_item.position', this.cur_media_item.position);
                    _debug('this.cur_pos_time 1', this.cur_pos_time);
    
                    if (module.tv_archive){
                        this.cur_pos_time += module.tv_archive.get_file_piece_num() * 3600;
                    }
    
                    _debug('this.cur_pos_time 2', this.cur_pos_time);*/

                    this.cur_pos_time = module.tv_archive.get_pos_time();

                    clearTimeout(this.emulated_media_len_stop);
                    this.emulated_media_len_stop = window.setTimeout(function () {
                        _debug('fire stop');
                        self.show_prev_layer();
                    }, (this.cur_media_length - this.cur_pos_time) * 1000);

                } else {
                    this.cur_media_length = stb.GetMediaLen();
                    this.cur_pos_time = stb.GetPosTime();

                    if (this.cur_media_item.media_type == 'advert' || this.cur_media_item.media_type == 'vclub_ad') {
                        stb.advert && stb.advert.disable();
                    }

                    if (this.cur_media_item.hasOwnProperty('ad_must_watch') && this.cur_media_item.ad_must_watch != 'all') {

                        if (this.cur_media_item.ad_must_watch.indexOf('s') > 0) { // time in seconds
                            var lock_time = parseInt(this.cur_media_item.ad_must_watch, 10);
                            lock_time = this.cur_media_length < lock_time ? this.cur_media_length : lock_time;
                        } else {
                            lock_time = this.cur_media_length * this.cur_media_item.ad_must_watch / 100;
                        }

                        _debug('lock_time', lock_time);

                        this.ad_skip_timer = window.setTimeout(function () {
                            _debug('can skip');
                            stb.key_lock = false;
                            stb.player.ad_skip_indication.show();
                        }, lock_time * 1000);

                        delete this.cur_media_item.ad_must_watch;
                    }
                }
                _debug('player.cur_media_length', this.cur_media_length);
                _debug('player.cur_pos_time', this.cur_pos_time);

                if (this.info.on) {
                    this.set_pos_button_to_cur_time();
                }

                if (this.cur_media_item.hasOwnProperty('ad_tracking')) {

                    stb.advert.start_ticking(this.cur_media_length);
                }

                /*if (this.is_tv){
                    this.send_last_tv_id(this.cur_tv_item.id);
                }*/

                window.clearTimeout(this.send_played_video_timer);

                _debug('stb.cur_place', stb.cur_place);

                if (stb.cur_place == 'vclub') {

                    var time_send_played = (this.cur_media_length * 0.7) * 1000;
                    _debug('time_send_played,', time_send_played);

                    this.send_played_video_timer = window.setTimeout(
                        function () {
                            self.send_played_video(self.cur_media_item.video_id || self.cur_media_item.id);
                        },

                        time_send_played
                    )
                }

                _debug('this.prev_state', this.prev_state);

                if (this.prev_state == 2) {
                    this.get_pids();
                }

                window.clearTimeout(this.send_played_tv_archive_timer);

                if (module.tv_archive && this.cur_media_item.mark_archive) {
                    window.clearTimeout(this.archive_continue_dialog_to);

                    var match = /-\d{10}-(\d+)\.m3u8/.exec(this.cur_media_item.cmd);

                    if (match) {
                        this.cur_media_length = match[1];
                    }

                    var archive_continue_dialog_delay = (this.cur_media_length - this.cur_pos_time - 30) * 1000;

                    _debug('archive_continue_dialog_delay 1', archive_continue_dialog_delay);

                    this.archive_continue_dialog_to = window.setTimeout(function () {
                        if (stb.profile['tv_archive_continued']) {
                            module.tv_archive.get_next_part_url();
                        } else {
                            module.tv_archive.continue_dialog.show();
                        }
                    }, archive_continue_dialog_delay);

                    self = this;

                    this.send_played_tv_archive_timer = window.setTimeout(
                        function () {
                            self.send_played_tv_archive(stb.player.cur_media_item.ch_id);
                        },

                        this.send_played_tv_archive_to
                    );
                }

                break;
            }
        case 5: // Not found
            {

                playback_limit.reset();

                stb.key_lock = false;

                if (this.cur_media_item.hasOwnProperty('ad_tracking')) {
                    if (this.cur_media_item.ad_tracking.hasOwnProperty('error')) {
                        stb.advert.track(this.cur_media_item.ad_tracking['error'], 'error')
                    }
                }
                _debug('this.cur_media_item', this.cur_media_item);
                if (this.cur_media_item.stop_callback) {

                    this.ad_indication.hide();
                    this.ad_skip_indication.hide();
                    stb.advert.stop_ticking();

                    this.cur_media_item.stop_callback();
                    return;
                }

                this.event5_counter++;
                if (this.media_type == 'stream') {

                    if (this.is_tv && stb.profile['enable_stream_error_logging']) {
                        stb.log_stream_error(this.cur_tv_item['id'], 5);
                    }

                    _debug('stb.user.tv_playback_retry_limit', stb.user.tv_playback_retry_limit);
                    _debug('stb.user.fading_tv_retry_timeout', stb.user.fading_tv_retry_timeout);
                    _debug('this.event5_counter', this.event5_counter);

                    if (stb.user.tv_playback_retry_limit > 0 && this.event5_counter > stb.user.tv_playback_retry_limit) {
                        _debug('stop replay');
                        return;
                    }

                    var replay_timeout = 5000;

                    if (stb.user.fading_tv_retry_timeout) {
                        replay_timeout *= this.event5_counter <= 2 ? 1 : 6;
                    }

                    if (this.is_tv) {

                        this.replay_channel_timer = window.setTimeout(
                            function () {
                                self.play_last();
                            },
                            replay_timeout
                        );

                    } else {

                        if (self.prev_layer && self.prev_layer.show && !self.prev_layer.on) {
                            self.prev_layer.show.call(self.prev_layer, true);
                        }

                        var prev_layer = this.prev_layer && this.prev_layer.layer_name;

                        self.stop();

                        stb.notice.show(get_word('player_file_missing'));

                        _debug('this.is_tv', this.is_tv);
                        _debug('prev_layer', prev_layer);

                        if (!this.is_tv && prev_layer == 'tv') {
                            this.play_last(true);
                        }
                    }

                } else {

                    if (this.cur_media_item.media_type != 'advert' && this.play_continuously && this.cur_media_item.hasOwnProperty('series') && this.cur_media_item.series && this.cur_media_item.series.length > 0) {

                        var series_idx = this.cur_media_item.series.lastIndexOf(this.cur_media_item.cur_series);

                        _debug('series_idx before', series_idx);

                        var old_series_idx = series_idx;

                        if (series_idx < this.cur_media_item.series.length - 1) {
                            series_idx++;
                        }

                        _debug('series_idx after', series_idx);

                        if (old_series_idx != series_idx) {

                            this.cur_media_item.cur_series = this.cur_media_item.series[series_idx];
                            this.cur_media_item.disable_ad = true;

                            if (this.cur_media_item.cmd.indexOf('://')) {
                                this.cur_media_item.cmd = '/media/' + this.cur_media_item.id + '.mpg';
                            }

                            this.play(this.cur_media_item);
                            break;
                        }

                    } else if (this.cur_media_item.playlist && this.cur_media_item.playlist.length > 0) {

                        stb.key_lock = false;

                        if (typeof (this.cur_media_item.playlist[0]) == 'object') {

                            idx = -1;

                            for (var i = 0; i < this.cur_media_item.playlist.length; i++) {
                                if (this.cur_media_item.id == this.cur_media_item.playlist[i].id) {
                                    idx = i;
                                    break;
                                }
                            }

                            _debug('playlist idx', idx);

                            if (idx >= 0 && idx < this.cur_media_item.playlist.length - 1) {
                                idx++;

                                cur_media_item = this.cur_media_item.playlist[idx].clone();
                                cur_media_item.playlist = this.cur_media_item.playlist;
                                _debug('cur_media_item', cur_media_item);

                                if (cur_media_item.is_audio) {
                                    cur_media_item.number = null;
                                }

                                this.play(cur_media_item);

                                break;
                            }

                        } else {
                            var idx = this.cur_media_item.playlist.lastIndexOf(this.cur_media_item.cmd);

                            _debug('playlist idx', idx);


                            if (idx >= 0 && idx < this.cur_media_item.playlist.length - 1) {

                                idx++;

                                var cur_media_item = this.cur_media_item.clone();

                                cur_media_item.cmd = cur_media_item.playlist[idx];

                                var real_id_match = /real_id=([^&]*)/.exec(cur_media_item.cmd);

                                if (real_id_match) {
                                    cur_media_item.real_id = real_id_match[1];
                                }

                                var osd_title_match = /osd_title=([^&]*)/.exec(cur_media_item.cmd);

                                if (osd_title_match) {
                                    cur_media_item.name = decodeURIComponent(osd_title_match[1].replace(/\+/g, '%20'));
                                } else if (!cur_media_item.hasOwnProperty('keep_original_name') || !cur_media_item.keep_original_name) {
                                    cur_media_item.name = cur_media_item.cmd.substr(this.cur_media_item.cmd.lastIndexOf("/") + 1);
                                }

                                if (cur_media_item.show_osd) {
                                    this.need_show_info = 1;
                                }

                                if (this.cur_media_item.media_type && this.cur_media_item.media_type == 'advert') {
                                    delete cur_media_item.media_type;
                                    module && module.vclub && module.vclub.set_ad_ended_time && module.vclub.set_ad_ended_time(this.cur_media_item.ad_id, stb.GetPosTime(), stb.GetMediaLen(), true);
                                }

                                if (cur_media_item.hasOwnProperty('ad_must_watch')) {
                                    delete cur_media_item.ad_must_watch;
                                }

                                this.play(cur_media_item);

                            }

                            break;
                        }
                    }
                    stb.remount_storages(
                        function () {
                            if (self.event5_counter == 1) {
                                self.play(self.cur_media_item);
                            } else {
                                if (self.prev_layer && self.prev_layer.show) {
                                    self.prev_layer.show.call(self.prev_layer, true);
                                }

                                self.stop();

                                stb.notice.show(get_word('player_server_unavailable'));
                            }
                        }
                    )
                }
                break;
            }
        case 7: // video content info
            {
                if (this.con_menu.map.length < 3) {
                    this.get_pids();
                    this.set_media_aspect();
                }
                break;
            }

        case 9: // Teletext subtitles
            {
                this.get_pids();

                break;
            }
        case 35: { // PVR Error
            _debug('params', params);

            params = JSON.parse(params);

            if (params && params.hasOwnProperty('id')) {
                module.pvr_local.handle_error(params.id);
            } else {
                stb.notice.show(get_word('local_pvr_interrupted'));
            }

            module.pvr_local.remove_all_with_errors();
            break;
        }
        case 32: // HDMI on
            {

            }
        case 33: // HDMI off
            {

                if (stb.type == 'MAG200') {
                    break;
                }

                _debug('stb.power_off', stb.power_off);

                module && module.tv && module.tv.recalculate_preview_mode();

                if (stb.type == 'MAG256' || stb.type == 'MAG257') {
                    if (stb.power_off && event == 33) {
                        _debug('ignore event');
                        break;
                    } else if (!stb.power_off && event == 32) {
                        _debug('ignore event');
                        break;
                    }
                }

                window.clearTimeout(this.hdmi_reaction_timer);

                _debug('stb.profile[hdmi_event_reaction]', stb.profile['hdmi_event_reaction']);
                _debug('module.blocking.on', module.blocking.on);
                _debug('stb.hdmi_on', stb.hdmi_on);
                _debug('stb.profile[standby_on_hdmi_off]', stb.profile['standby_on_hdmi_off']);

                if (stb.profile['hdmi_event_reaction'] >= 1 && !module.blocking.on) {

                    var hdmi_reaction_timeout = (stb.profile['hdmi_event_reaction'] == 1 || !stb.hdmi_on ? 5 : stb.profile['hdmi_event_reaction']) * 1000;

                    _debug('hdmi_reaction_timeout', hdmi_reaction_timeout);

                    this.hdmi_reaction_timer = window.setTimeout(function () {

                        _debug('stb.power_off', stb.power_off);
                        _debug('stb.cur_place', stb.cur_place);
                        _debug('stb.hdmi_on', stb.hdmi_on);

                        if (stb.hdmi_on) {

                            stb.hdmi_on = false;

                            if (self.on) {
                                if (stb.cur_place == 'tv' && self.is_tv) {
                                    stb.player.stop();
                                } else if (!self.pause.on) {
                                    keydown_observer.emulate_key(key.EXIT);
                                }
                            }

                            if (stb.profile['standby_on_hdmi_off'] && !stb.power_off) {
                                stb.power_off = true;
                                stb.StandBy(1);
                            }
                        } else {

                            stb.hdmi_on = true;

                            if (stb.power_off) {
                                stb.power_off = false;
                                stb.StandBy(0);
                            }

                            if (stb.cur_place == 'tv' && self.is_tv) {

                                _debug('module.tv.on', module.tv.on);

                                if (module.tv.on) {
                                    module.tv.cur_page = 0;
                                    module.tv.load_data();
                                } else {
                                    stb.player.play_last();
                                }
                            }
                        }

                    }, hdmi_reaction_timeout);

                }

                break;
            }
        case 36: // local TimeShift
            {
                _debug('params', params);

                params = JSON.parse(params);

                if (params.event_code === 3 && this.pause.on && stb.profile.ts_buffer_use === 'cyclic') {
                    this.disable_pause();
                } else if (params.event_code === 6) {
                    this.active_local_time_shift = false;
                    this.is_tv = true;
                }

                break;
            }
        case 40: // Scanning DVB Channel in progress (STB_EVENT_DVB_SCAN_PROGRESS)
            {
                _debug('params', params);
                module.dvb && module.dvb.on_scan_result("progress", params);
                break;
            }
        case 41: // Scanning DVB Channel found (STB_EVENT_DVB_SCAN_FOUND)
            {
                _debug('params', params);
                module.dvb && module.dvb.on_scan_result("found", params);
                break;
            }
        case 42: // DVB EPG update (STB_EVENT_DVB_EPG_UPDATE)
            {
                _debug('params', params);

                params = JSON.parse(params) || [];

                module.dvb && module.dvb.update_epg(params.id);

                break;
            }
        case 43: // Antena power off
            {
                _debug('params', params);
                break;
            }
        case 129: // Stream losses
            {
                if (this.is_tv && stb.profile['enable_stream_losses_logging']) {
                    stb.log_stream_error(this.cur_tv_item['id'], 129);
                }
                break;
            }
    }

    if ([1, 2, 4, 5].indexOf(event) >= 0) {
        this.prev_state = event;
    }
};

player.prototype.volume = new function () {
    this.on = false;
    this.level = 100;
    this.step = 5;
    this.dom_obj = {};
    this.mute = { "on": false };
    this.hide_to = 3000;
    this.correction = 0;

    this.init = function () {
        _debug('volume.init');

        this.dom_obj = create_block_element('volume');

        this.container = create_block_element('volume_bar', this.dom_obj);

        this.bar = create_block_element('volume_progress', this.container);

        this.mute.dom_obj = create_block_element('volume_off', this.dom_obj);
        this.mute.dom_obj.hide();

        this.dom_obj.hide();
    };

    this.set_level = function (v) {
        _debug('volume.set_level', v);

        /*if (v > 100){
            v = 100;
        }else if (v < 0){
            v = 0;
        }*/

        this.level = v;

        var final_level = this.level + this.correction;

        _debug('final_level', final_level);

        if (final_level > 100) {
            this.level = 100;
            this.correction = 100 - this.level;
            final_level = 100;
        } else if (final_level < 0) {
            this.level = 0;
            this.correction = 0 - this.level;
            final_level = 0;
        }

        _debug('this.level', this.level);
        _debug('this.correction', this.correction);

        try {
            stb.SetVolume(this._get_real_volume_level(final_level));
        } catch (e) {
            _debug(e);
        }

        if (final_level == 0) {
            if (!this.mute.on) {
                this.show_mute();
            }
        } else {
            if (this.mute.on) {
                this.hide_mute();
            }
        }

        _debug('final_level', final_level);

        this.update_bar(final_level);
    };

    this.correct_level = function (c) {
        _debug('volume.correct_level', c);

        if (!c) {
            c = 0;
        }

        this.correction = c * this.step;

        var level = this.level + this.correction;

        _debug('this.level', this.level);
        _debug('this.correction', this.correction);
        _debug('level', level);

        if (level > 100) {
            level = 100;
            this.correction = 100 - this.level;
        } else if (level < 0) {
            level = 0;
            this.correction = 0 - this.level;
        }

        _debug('this.correction', this.correction);
        _debug('this.level', this.level);
        _debug('level', level);

        _debug('this.mute.on', this.mute.on);

        try {
            if (!this.mute.on) {
                stb.SetVolume(this._get_real_volume_level(level));
            }
        } catch (e) {
            _debug(e);
        }

        this.update_bar(level);
    };

    this._get_real_volume_level = function (level) {

        if (stb.profile['logarithm_volume_control']) {
            level = Math.log(level == 0 ? 1 : level) / Math.log(100) * 100;
        }

        _debug('real_volume_level', level);

        return level;
    };

    this.show = function () {
        _debug('volume.show');

        this.dom_obj.show();
        this.on = true;

        this.t_hide();
    };

    this.t_hide = function () {
        _debug('volume.t_hide');

        window.clearTimeout(this.hide_timer);

        var self = this;

        this.hide_timer = window.setTimeout(function () {

            self.hide();

        }, this.hide_to);
    };

    this.hide = function () {
        _debug('volume.hide');

        this.dom_obj.hide();
        this.on = false;
        this.save();
    };

    this.control = function (dir) {
        _debug('volume.control', dir);

        if (!this.on) {
            this.show();
        } else {
            this.t_hide();
        }

        try {
            if (dir > 0) {
                //if (this.level < 100){
                this.level += this.step;
                //}
            } else {
                //if (this.level > 0){
                this.level -= this.step;
                //}
            }

            /*if (this.level > 100){
                this.level = 100;
            }else if (this.level < 0){
                this.level = 0;
            }*/

            this.set_level(this.level);
        } catch (e) {
            _debug(e);
        }
    };

    this.show_mute = function () {
        _debug('volume.show_mute');

        try {
            stb.SetVolume(0);
        } catch (e) {
            _debug(e);
        }

        this.mute.dom_obj.show();

        if (!this.on) {
            this.show();
        }

        window.clearTimeout(this.hide_timer);

        this.container.hide();
        this.mute.on = true;

        this.start_move_mute_countdown();
    };

    this.start_move_mute_countdown = function () {
        _debug('volume.start_move_mute_counting');

        if (stb.profile['plasma_saving'] === '1') {

            window.clearTimeout(this.move_mute_to);

            var self = this;

            if (!this.mute.on) {
                return;
            }

            this.move_mute_to = window.setTimeout(function () {

                _debug('move_mute_to fired');
                _debug('stb.player.on', stb.player.on);
                _debug('self.mute.on', self.mute.on);

                if (!self.mute.on) {
                    return;
                }

                self.start_move_mute();

            }, stb.profile['plasma_saving_timeout'] * 1000);
        }
    };

    this.start_move_mute = function () {
        _debug('volume.start_move_mute');

        var self = this;

        this.move_mute_interval = window.setInterval(function () {

            self.mute.dom_obj.style.left = Math.floor(Math.random() * 200) + 'px';

        }, 10000);
    };

    this.stop_move_mute = function () {
        _debug('volume.stop_move_mute');

        window.clearInterval(this.move_mute_interval);
        window.clearTimeout(this.move_mute_to);

        this.mute.dom_obj.style.left = 0;
    };

    this.hide_mute = function () {
        _debug('volume.hide_mute');

        try {
            stb.SetVolume(this._get_real_volume_level(this.level));
        } catch (e) {
            _debug(e);
        }

        this.mute.dom_obj.hide();
        this.stop_move_mute();
        this.container.show();

        this.update_bar(this.level);
        this.mute.on = false;

        if (!this.on) {
            this.show();
        } else {
            this.t_hide();
        }
    };

    this.mute_switch = function () {
        _debug('volume.mute_switch');

        if (this.mute.on) {
            this.hide_mute();
        } else {
            this.show_mute();
        }
    };

    this.update_bar = function (level) {
        _debug('volume.update_bar', level);

        //var width = 14*this.level/this.step;
        var width = 10 * ((level / this.step) - 1);

        if (width > 0) {
            width += 5;
        } else {
            width = 10;
        }

        _debug('bar width', width);

        this.bar.style.width = width + 'px';
    };

    this.save = function () {
        _debug('volume.save');

        stb.load(
            {
                'type': 'stb',
                'action': 'set_volume',
                'vol': this.level
            },

            function (result) {

            }
        )
    }
};

/*player.prototype.seek_bar = new function(){
    
    this.seek_bar_dom_obj = $('seek_bar');
    
    this.show = function(){
        this.seek_bar_dom_obj.show();
    };
    
    this.hide = function(){
        this.seek_bar_dom_obj.hide();
    };
    
    this.set_pos = function(){
        
    }
};*/

player.prototype.define_media_type = function (cmd) {
    _debug('player.define_media_type', cmd);

    if (cmd.indexOf('://') > 0 && !this.cur_media_item.is_advert) {

        _debug('stb.cur_place', stb.cur_place);

        if ((cmd.indexOf('mmsh://') >= 0 || cmd.indexOf('rtsp://') >= 0 || cmd.indexOf('rtmp://') >= 0 || cmd.indexOf('udp://') >= 0 || cmd.indexOf('rtp://') >= 0 || cmd.indexOf('http://') >= 0 || cmd.indexOf('dvb://') >= 0) && !this.active_time_shift && stb.cur_place != 'demo' && stb.cur_place != 'internet' && stb.cur_place != 'epg_simple' && stb.cur_place != 'epg' && stb.cur_place != 'radio' && stb.cur_place != 'vclub' && stb.cur_place != 'karaoke' && stb.cur_place != 'audioclub' && !this.cur_media_item.is_audio && !this.cur_media_item.promo && !this.cur_media_item.radio) {
            this.is_tv = true;
        } else {
            this.is_tv = false;
        }

        this.proto = cmd.match(/(\S*):\/\//)[1];

        return 'stream';
    } else {

        this.is_tv = false;
        this.proto = 'file';

        return 'file';
    }
};

player.prototype.play_last = function (dont_show_osd) {
    _debug('player.play_last');

    this.prev_layer = module.tv;
    if (!dont_show_osd) {
        this.show_info_after_play();
    }
    this.play(this.last_not_locked_tv_item || this.cur_tv_item);
};

player.prototype.play_last_radio = function () {
    _debug('player.play_last_radio');

    this.show_info_after_play();
    this.play(this.cur_media_item);
};

player.prototype.init_first_channel = function () {
    _debug('player.init_first_channel');

    if (typeof (this.channels) != 'undefined' &&
        typeof (this.fav_channels) != 'undefined' &&
        typeof (this.fav_channels_ids) != 'undefined') {


        if (stb.user.fav_itv_on) {

            this.f_ch_idx = this.fav_channels.getIdxById(stb.user.last_itv_id);

            if (this.f_ch_idx === null) {
                this.f_ch_idx = 0;
            }

            var channel = this.fav_channels[this.f_ch_idx];

        } else {

            this.ch_idx = this.channels.getIdxById(stb.user.last_itv_id);

            if (this.ch_idx === null) {
                this.ch_idx = 0;
            }

            channel = this.channels[this.ch_idx];
        }

        this.cur_media_item = this.cur_tv_item = this.last_not_locked_tv_item = channel || {};
    }
};

player.prototype.first_play = function () {
    _debug('player.first_play');

    this.need_show_info = 1;

    stb.set_cur_place(module.tv.layer_name);
    stb.set_cur_layer(module.tv);
    stb.player.prev_layer = module.tv;

    this.play(this.cur_tv_item);
};

player.prototype.play = function (item) {
    _debug('player.play', item);

    if (authentication_problem && authentication_problem.on) {
        _debug('Authentication problem, player disabled');
        return;
    }

    var cmd;

    this.on = true;
    stb.clock.show();
    //this.cur_media_item = item;

    window.clearTimeout(this.replay_channel_timer);
    window.clearTimeout(this.archive_continue_dialog_to);
    window.clearTimeout(this.ad_skip_timer);
    window.clearTimeout(this.enable_local_timeshift);

    this.ad_indication.hide();
    this.ad_skip_indication.hide();
    stb.advert.stop_ticking();

    if (this.pause.on) {
        this.hide_pause();
    }

    if (this.volume.mute.on) {
        this.volume.start_move_mute_countdown();
    }

    if (typeof (item) == 'object') {
        if (!item.hasOwnProperty('cmd')) {
            return;
        }

        cmd = item.cmd;
    } else {
        cmd = item;
    }

    if (item.hasOwnProperty && item.hasOwnProperty('position') && parseInt(item.position) > 0 && !this.emulate_media_len) {
        cmd += ' position:' + item.position;
    }


    if (item.hasOwnProperty && item.hasOwnProperty('media_len') && parseInt(item.media_len) > 0) {
        cmd += ' media_len:' + item.media_len;
    }

    if (item.hasOwnProperty && item.hasOwnProperty('atrack') && item.atrack) {
        cmd = cmd.replace(/atrack:(\d+)/, '');
        cmd += ' atrack:' + item.atrack;
        cmd.replace(/\s+/g, ' ');
    }

    if (stb.usbdisk.storage_info.length > 0) {
        cmd = cmd.replace(/\/media\/USB-\*/, stb.usbdisk.storage_info[0]['mountPath']);
    }

    _debug('cmd', cmd);

    this.active_time_shift = item.hasOwnProperty('live_date');

    playback_limit.start_counting();

    var media_len_part = /media_len:(\d*)/.exec(cmd);

    this.prev_state = 0;

    if (module.tv_archive && this.cur_media_item.mark_archive && this.cur_media_item.archive_hist_id) {
        this.update_played_tv_archive_end_time(this.cur_media_item.archive_hist_id);
    }

    if (this.active_time_shift && this.cur_media_item.timeshift_hist_id) {
        this.update_played_timeshift_end_time(this.cur_media_item.timeshift_hist_id);
        this.cur_media_item.timeshift_hist_id = null;
    }

    if (media_len_part) {
        this.emulate_media_len = true;
        this.cur_media_length = media_len_part[1];
        _debug('cmd 1', cmd);
        cmd = cmd.replace(/media_len:(\d*)/g, '').trim();
        _debug('cmd 2', cmd);
        _debug('this.cur_media_length', this.cur_media_length);
    } else {
        this.emulate_media_len = false;
    }

    var position_part = /position:(\d*)/.exec(cmd);

    if (position_part) {
        item.position = position_part[1];
    }

    this.triggerCustomEventListener('stop', this.cur_media_item);

    if (this.file_type == 'audio' || this.cur_media_item.is_audio) {
        this.triggerCustomEventListener('audiostop', this.cur_media_item);
    }

    this.cur_media_item = item;

    _debug('item.position', item.position);
    _debug('this.emulate_media_len', this.emulate_media_len);
    _debug('cmd: ', cmd);

    this.media_type = this.define_media_type(cmd);

    if (this.media_type == 'file' || this.cur_media_item.is_audio) {
        this.file_type = this.get_file_type(this.cur_media_item);
    } else {
        this.file_type = undefined;
    }

    _debug('player.proto', this.proto);

    if (this.is_tv) {
        this.cur_tv_item = item;

        if (this.cur_tv_item.lock != '1') {
            this.last_not_locked_tv_item = item;
        }
    }

    _debug('player.media_type: ', this.media_type);
    _debug('player.file_type: ', this.file_type);
    _debug('player.is_tv: ', this.is_tv);

    this.on_play && this.on_play(this.cur_media_item['id']);
    this.triggerCustomEventListener('onplay', this.cur_media_item['id']);

    if (this.file_type == 'audio' || this.cur_media_item.is_audio) {
        this.triggerCustomEventListener('audiostart', this.cur_media_item);
    } else if (stb.player.cur_media_item.radio || typeof (stb.player.radio_idx) != 'undefined') {
        this.triggerCustomEventListener('radiostart', this.cur_media_item);
    }

    _debug('stb.profile[plasma_saving]', stb.profile['plasma_saving']);
    _debug('module.tv.on', module.tv && module.tv.on);

    if (this.is_tv && module.tv && module.tv.on && stb.profile['plasma_saving'] === '1') {
        module.tv.start_tv_plasma_saving_count();
    }

    this.play_initiated = true;

    _debug('stb.cur_place', stb.cur_place);

    if (this.media_type == 'stream' && !stb.player.cur_media_item.hasOwnProperty('series') && !stb.player.cur_media_item.hasOwnProperty('is_file')) {

        if (item.hasOwnProperty('open') && !item.open) {
            _debug('channel is closed');
            try {
                stb.Stop();
            } catch (e) {
            }
            this.show_info(this.cur_media_item);
        } else {

            if (this.is_tv) {
                stb.setFrontPanel(item.number);
            }

            if (!this.active_time_shift && !this.active_local_time_shift && (parseInt(item.use_http_tmp_link) == 1 || parseInt(item.use_load_balancing) == 1 || stb.user['force_ch_link_check'] && this.is_tv)) {
                var self = this;
                stb.player.on_create_link = function (result) {
                    _debug('player.on_create_link', result);

                    if (result.error) {
                        self.cur_media_item.error = result.error;
                        module.tv.preview_msg.innerHTML = get_word('error_channel_' + result.error);
                    } else {
                        self.cur_media_item.error = '';
                        module.tv.preview_msg.innerHTML = '';
                    }
                    if (result.cmd && result.cmd.search(/%mac%/ig) !== -1) {
                        result.cmd = result.cmd.replace(/%mac%/ig, stb.profile.mac);
                    }

                    module.tv.handle_advert(result, item);
                };

                this.create_link('itv', cmd, 0, false, item.disable_ad || stb.advert && stb.advert.disabled, false, stb.user['force_ch_link_check']);
            } else {
                if (cmd && cmd.search(/%mac%/ig) !== -1) {
                    cmd = cmd.replace(/%mac%/ig, stb.profile.mac);
                }
                this.play_now(cmd);
            }

            if (this.is_tv) {

                this.send_last_tv_id(this.cur_tv_item.id, this.cur_tv_item.lock == '1');

                if (this.cur_tv_item.lock != '1') {

                    if (stb.user.fav_itv_on) {

                        this.f_ch_idx = this.fav_channels.getIdxByVal('number', item.number);

                        this.hist_f_ch_idx.push(item);
                        this.hist_f_ch_idx.shift();
                        _debug('this.hist_f_ch_idx', this.hist_f_ch_idx);
                    } else {

                        this.ch_idx = this.channels.getIdxByVal('number', item.number);

                        this.hist_ch_idx.push(item);
                        this.hist_ch_idx.shift();
                        _debug('this.hist_ch_idx', this.hist_ch_idx);
                    }
                }
            }
        }

    } else if (cmd.indexOf('/usbdisk') > 0 || cmd.indexOf('/USB-') > 0 || cmd.indexOf('/ram/mnt/smb/') > 0 || cmd.indexOf('/av/') > 0 || cmd.indexOf('/UPnP/') > 0 || stb.cur_place == 'media_browser' || stb.player.cur_media_item.media_type == 'advert' || stb.player.cur_media_item.media_type == 'vclub_ad') {

        this.play_now(cmd);

    } else if (stb.cur_place == 'karaoke') {

        this.create_link('karaoke', cmd, 0);

    } else if (stb.cur_place == 'records' || stb.cur_place == 'remote_pvr' || stb.cur_place == 'epg_simple' || stb.cur_place == 'epg') {

        if (item.mark_archive && !item.mark_rec) {
            this.create_link('tv_archive', cmd, 0, '', false, item.download || false);
        } else {
            this.create_link('remote_pvr', cmd, 0, '', false, item.download || false);
        }

    } else {

        var series_number = item.cur_series || 0;
        if (stb.player.cur_media_item.rtsp_url) {
            cmd = '/media/' + this.cur_media_item.id + '.mpg';

            if (this.cur_media_item.hasOwnProperty('position')) {
                cmd += ' position:' + this.cur_media_item.position;
            }
        } else if (stb.player.cur_media_item.is_file) {
            cmd = '/media/file_' + this.cur_media_item.id + '.mpg';

            if (this.cur_media_item.hasOwnProperty('position')) {
                cmd += ' position:' + this.cur_media_item.position;
            }
        }
        this.create_link('vod', cmd, series_number, item.forced_storage || '', item.disable_ad || stb.advert && stb.advert.disabled, item.download || false);
    }
};

player.prototype.create_link = function (type, uri, series_number, forced_storage, disable_ad, download, force_ch_link_check) {

    series_number = series_number || "";

    _debug('player.create_link', type, uri, series_number, forced_storage, disable_ad, download, force_ch_link_check);

    stb.load(
        {
            "type": type,
            "action": "create_link",
            "cmd": uri,
            "series": series_number,
            "forced_storage": forced_storage,
            "disable_ad": disable_ad || false,
            "download": download || false,
            "force_ch_link_check": force_ch_link_check || false

        },

        function (result) {

            _debug('player.create_link callback type', type);

            if (type !== 'itv' && type !== 'remote_pvr') {
                _debug('create_link callback: ', result);

                this.last_storage_id = result.storage_id;

                _debug('this.last_storage_id', this.last_storage_id);

                if (result.cmd && result.cmd.indexOf('://') === -1) {
                    stb.Mount(result.cmd);
                }
            }

            this.on_create_link && this.on_create_link(result);
        },

        this
    )
};

player.prototype.delete_link = function (uri) {
    _debug('player.delete_link', uri);

    stb.load(
        {
            "type": "vod",
            "action": "del_link",
            "item": uri
        },
        function (result) {
            _debug('del_link result', result);
        }
    )
};

player.prototype.play_now = function (item) {
    _debug('player.play_now', item);

    if (typeof (item) == 'object') {
        var uri = item.cmd;

        if (item.hasOwnProperty('streamer_id')) {
            _log('play', {
                "streamer_id": item.streamer_id,
                "link_id": (item.link_id || 0),
                "ch_id": item.id
            }, this.cur_media_item.id);
        } else {
            _log('play', item);
        }

    } else {
        uri = item;
        _log('play', uri);
    }

    this.start_time = Date.parse(new Date()) / 1000;

    if (this.need_show_info) {
        this.show_info(this.cur_media_item);
    }

    this.init_con_menu();

    if (module.time_shift_local && module.time_shift_local.enabled && this.cur_media_item.allow_local_timeshift === '1' && (uri.indexOf('rtp ') === 0 || uri.indexOf('ffrt ') === 0)) {
        _debug('replacing solution to extTimeShift');
        uri = uri.replace(/^(rtp|ffrt)+\s/, 'extTimeShift ');
        _debug('uri', uri);
        this.cur_tv_item.ready_to_timeshift = true;
    }

    try {

        if (this.cur_media_item.error) {
            stb.Stop();
        } else {
            var use_proxy = false;

            if (stb.user['web_proxy_host']) {

                if (stb.user['web_proxy_exclude_list']) {
                    var web_proxy_exclude_list = stb.user['web_proxy_exclude_list'].split(' ').filter(function (p) {
                        return p
                    });

                    _debug('web_proxy_exclude_list', web_proxy_exclude_list);

                    if (web_proxy_exclude_list) {
                        var result = /:\/\/([^\/]+)/.exec(uri);
                        if (result) {
                            var host = result[1];

                            _debug('host', host);

                            use_proxy = !web_proxy_exclude_list.some(function (mask) {
                                return host.indexOf(mask) !== -1;
                            });
                        }
                    }
                }
            }

            _debug('use_proxy', use_proxy);

            var match = /(rtp|udp):\/\/([^\s]+)(.*)/.exec(uri);

            if (this.mc_proxy_url && match) {
                _debug('mc_proxy_url', this.mc_proxy_url);
                uri = uri.replace(/.+:\/\/[^\/]+/, 'ffrt ' + this.mc_proxy_url + '/' + match[1] + '/' + match[2] + match[3]);
                _debug('new uri', uri);
            }

            if (use_proxy) {

                var proxy_addr = 'http://';
                if (stb.user['web_proxy_user']) {
                    proxy_addr += stb.user['web_proxy_user'] + ':' + stb.user['web_proxy_pass'] + '@';
                }
                proxy_addr += stb.user['web_proxy_host'] + ':' + stb.user['web_proxy_port'];

                _debug('proxy_addr', proxy_addr);

                stb.Play(uri, proxy_addr);
            } else {
                stb.Play(uri);
            }
        }
    } catch (e) {
        _debug(e)
    }
};

player.prototype.stop = function () {
    _debug('player.stop');

    this.on_stop && this.on_stop();

    stb.advert.stop_ticking();

    _debug('stb.cur_place', stb.cur_place);
    _debug('this.play_auto_ended', this.play_auto_ended);
    _debug('this.cur_media_item', this.cur_media_item);
    _debug('this.cur_media_item.media_type', this.cur_media_item.media_type);

    if (stb.cur_place == 'vclub' && !this.play_auto_ended) {

        var cur_series = this.cur_media_item.cur_series || 0;
        try {
            var end_time = stb.GetPosTime();
        } catch (e) {
            var end_time = 0;
        }

        if (this.cur_media_item.media_type == 'vclub_ad') {
            module && module.vclub && module.vclub.set_ad_ended_time && module.vclub.set_ad_ended_time(this.cur_media_item.ad_id, end_time, stb.GetMediaLen());
        } else if (this.cur_media_item.media_type != 'advert') {
            this.cur_media_item.video_id = this.cur_media_item.video_id || this.cur_media_item.id;
            this.cur_media_item.video_id && module && module.vclub && module.vclub.set_not_ended && module.vclub.set_not_ended(this.cur_media_item.video_id, cur_series, end_time, this.cur_media_item.id);
        }
    }

    if (stb.cur_place == 'vclub' && this.play_auto_ended) {
        this.cur_media_item.video_id = this.cur_media_item.video_id || this.cur_media_item.id;
        if (this.cur_media_item.media_type == 'vclub_ad') {
            module && module.vclub && module.vclub.set_ad_ended_time && module.vclub.set_ad_ended_time(this.cur_media_item.ad_id, end_time, stb.GetMediaLen());
        } else if (this.cur_media_item.media_type != 'advert') {
            this.cur_media_item.video_id && module && module.vclub && module.vclub.set_ended && module.vclub.set_ended(this.cur_media_item.video_id);
        }
    }

    if (this.cur_media_item.stop_callback) {
        this.cur_media_item.stop_callback();
        return;
    }

    if (module.tv_archive && this.cur_media_item.mark_archive && this.cur_media_item.archive_hist_id) {
        this.update_played_tv_archive_end_time(this.cur_media_item.archive_hist_id);
        this.cur_media_item.archive_hist_id = null;
    }

    if (this.active_time_shift && this.cur_media_item.timeshift_hist_id) {
        this.update_played_timeshift_end_time(this.cur_media_item.timeshift_hist_id);
        this.cur_media_item.timeshift_hist_id = null;
    }

    if (module.tv && stb.profile['plasma_saving'] === '1') {
        module.tv.stop_tv_plasma_saving_count();
        this.volume.stop_move_mute();
    }

    this.on_stop = undefined;

    this.prev_layer = {};

    this.event1_counter = 0;
    this.event5_counter = 0;

    this.need_show_info = 0;

    this.cur_media_length = 0;

    this.active_time_shift = false;

    this.active_local_time_shift = false;

    playback_limit.reset();
    this.time_shift_indication.hide();
    this.ad_indication.hide();
    this.ad_skip_indication.hide();

    this.set_pos_button(0);

    window.clearTimeout(this.replay_channel_timer);
    window.clearTimeout(this.emulated_media_len_stop);
    window.clearTimeout(this.archive_continue_dialog_to);
    window.clearTimeout(this.ad_skip_timer);
    window.clearTimeout(this.enable_local_timeshift);

    this.on_create_link = function () {
    };

    this.on = false;

    this.triggerCustomEventListener('stop', this.cur_media_item);

    if (this.file_type == 'audio' || this.cur_media_item.is_audio) {
        this.triggerCustomEventListener('audiostop', this.cur_media_item);
    } else if (stb.player.cur_media_item.radio || typeof (stb.player.radio_idx) != 'undefined') {
        this.triggerCustomEventListener('radiostop', this.cur_media_item);
    }

    if (this.pause.on) {
        this.disable_pause();
    }

    if (this.quick_ch_switch.on) {
        this.cancel_quick_ch_switch();
    }

    try {
        stb.Stop();
        _debug('stb.Stop()');

        if (stb && stb.Set3DConversionMode) {
            stb.Set3DConversionMode(0);
        }

    } catch (e) {
    }

    if (this.media_type == 'file') {
        //stb.Umount();
        var storage = stb.mounted_storage;
        this.umount_timer = window.setTimeout(function () {
            stb.Umount(storage)
        }, 10000);
    }

    this.play_auto_ended = false;

    window.clearTimeout(this.send_played_itv_timer);
    window.clearTimeout(this.send_played_tv_archive_timer);
    window.clearTimeout(this.send_played_timeshift_timer);
    window.clearTimeout(this.send_played_video_timer);
    window.clearTimeout(this.replay_channel_timer);

    this.hide_info();
    _log('stop');
};

player.prototype.init_pause = function () {
    this.pause.dom_obj = create_block_element('pause');
    this.pause.dom_obj.hide();
};

player.prototype.init_rec = function () {
    this.rec.dom_obj = create_block_element('rec_container');
    create_block_element('rec_left', this.rec.dom_obj);
    this.rec.label = create_block_element('rec_main', this.rec.dom_obj);
    this.rec.dom_obj.hide();
};

player.prototype.show_rec_icon = function (record) {
    _debug('player.show_rec_icon', record);

    _debug('record[t_start_ts]', record['t_start_ts']);
    _debug('record[t_stop_ts]', record['t_stop_ts']);
    _debug('stb.clock.timestamp', stb.clock.timestamp);

    window.clearInterval(this.tick_timer);

    stb.player.rec.set_seconds(stb.clock.convert_sec_to_human_time(record['t_start_ts'] - stb.clock.timestamp));

    var self = this;
    this.tick_timer = window.setInterval(function () {
        self.tick_s(record)
    }, 1000);

    stb.player.rec.show();
};

player.prototype.hide_rec_icon = function () {
    _debug('player.hide_rec_icon');

    stb.player.rec.hide();
    window.clearInterval(this.tick_timer);
    stb.player.rec.set_seconds(0);
};

player.prototype.tick_s = function (record) {
    stb.player.rec.set_seconds(stb.clock.convert_sec_to_human_time(stb.clock.timestamp - record['t_start_ts']));
};

player.prototype.pause_switch = function () {
    _debug('player.pause_switch');

    if (this.is_tv && this.prev_layer.on) {
        return;
    }

    _debug('module.time_shift', !!module.time_shift);
    _debug('module.time_shift_local', !!module.time_shift_local);
    _debug('module.time_shift_local.enabled', module.time_shift_local ? !!module.time_shift_local.enabled : false);
    _debug('this.cur_media_item.allow_local_timeshift', this.cur_media_item.allow_local_timeshift);

    if (this.is_tv && (!module.time_shift || !parseInt(this.cur_media_item.enable_tv_archive, 10)) && (!module.time_shift_local || !module.time_shift_local.enabled || !parseInt(this.cur_media_item.allow_local_timeshift, 10) || (this.cur_media_item.cmd.indexOf('rtp ') == -1 && this.cur_media_item.cmd.indexOf('ffrt ') == -1))
        && !module.radio_widget.widget_on) {
        return;
    }

    _debug('this.pause.on - ', this.pause.on);

    if (this.pause.on) {
        this.disable_pause();
    } else {

        if (this.is_tv && parseInt(this.cur_media_item.enable_tv_archive, 10) && module.time_shift && !this.prev_layer.on) {
            module.time_shift.set_media_item(this.cur_tv_item);
            module.time_shift.get_link_for_channel();

            this.active_time_shift = true;
        } else if (this.is_tv && parseInt(this.cur_media_item.allow_local_timeshift, 10) && module.time_shift_local && module.time_shift_local.enabled && !this.prev_layer.on) {

            _debug('enter in timeshift mode');

            module.time_shift_local.enable_mode();

            this.active_local_time_shift = true;

        } else {
            if (!this.cur_media_item.hasOwnProperty('live_date')) {
                this.active_time_shift = false;
            }
        }

        if ((this.file_type == 'audio' || this.cur_media_item.is_audio) && this.cur_media_item.playlist) {
            this.triggerCustomEventListener('audiopause', this.cur_media_item);
        } else if (stb.player.cur_media_item.radio || typeof (stb.player.radio_idx) != 'undefined') {
            this.triggerCustomEventListener('radiopause', this.cur_media_item);
        }

        if (module.tv_archive && this.cur_media_item.mark_archive) {
            window.clearTimeout(this.archive_continue_dialog_to);
        }

        try {
            stb.Pause();
        } catch (e) {
        }
        this.pause.on = true;
        this.pause.dom_obj.show();

        if (stb.profile['plasma_saving'] === '1') {
            this.start_disabling_pause_count();
        }
    }
};

player.prototype.disable_pause = function () {
    _debug('player.disable_pause');

    _debug('this.active_time_shift', this.active_time_shift);
    _debug('this.active_local_time_shift', this.active_local_time_shift);

    this.stop_disabling_pause_count();

    if (this.active_time_shift) {
        _debug('new Date() - module.time_shift.cur_media_item.live_date', (new Date().getTime() - module.time_shift.cur_media_item.live_date.getTime()) / 1000);

        if ((new Date() - module.time_shift.cur_media_item.live_date) / 1000 < 5) {
            this.active_time_shift = false;
            this.is_tv = true;
            this.play_last();
        } else {
            this.time_shift_indication.show();
            if (this.is_tv) {
                this.play(module.time_shift.cur_media_item);
            } else {
                try {
                    stb.Continue();
                } catch (e) {
                }
            }

            this.is_tv = false;
        }

    } else if (this.active_local_time_shift) {
        this.time_shift_indication.show();
        try {
            stb.Continue();
        } catch (e) {
        }
        this.is_tv = false;
    } else {

        if ((this.file_type == 'audio' || this.cur_media_item.is_audio) && this.cur_media_item.playlist) {
            this.triggerCustomEventListener('audiocontinue', this.cur_media_item);
        } else if (stb.player.cur_media_item.radio || typeof (stb.player.radio_idx) != 'undefined') {
            this.triggerCustomEventListener('radiocontinue', this.cur_media_item);
        }

        try {
            if (module.tv_archive && this.cur_media_item.mark_archive) {

                var match = /-\d{10}-(\d+)\.m3u8/.exec(this.cur_media_item.cmd);

                if (match) {
                    var cur_media_length = match[1];
                } else {
                    cur_media_length = stb.GetMediaLen();
                }

                var archive_continue_dialog_delay = (cur_media_length - stb.GetPosTime() - 30) * 1000;

                _debug('archive_continue_dialog_delay 1', archive_continue_dialog_delay);

                window.clearTimeout(this.archive_continue_dialog_to);

                this.archive_continue_dialog_to = window.setTimeout(function () {
                    if (stb.profile['tv_archive_continued']) {
                        module.tv_archive.get_next_part_url();
                    } else {
                        module.tv_archive.continue_dialog.show();
                    }
                }, archive_continue_dialog_delay);
            }
        } catch (e) {
        }

        try {
            stb.Continue();
        } catch (e) {
        }
    }

    this.hide_pause();
};

player.prototype.hide_pause = function () {
    _debug('player.hide_pause');
    this.pause.on = false;
    this.pause.dom_obj.hide();
};

player.prototype.start_disabling_pause_count = function () {
    _debug('player.start_disabling_pause_count');

    window.clearTimeout(this.disable_pause_to);

    this.disable_pause_to = window.setTimeout(function () {

        _debug('disable_pause fired');

        if (stb.player.pause.on) {
            stb.player.disable_pause();
        }

    }, stb.profile['plasma_saving_timeout'] * 1000);
};

player.prototype.stop_disabling_pause_count = function () {
    _debug('player.stop_disabling_pause_count');

    window.clearTimeout(this.disable_pause_to);
};

player.prototype.show_info_after_play = function () {
    this.need_show_info = 1;
};

player.prototype.init_show_info = function () {

    this.info.dom_obj = create_block_element("osd_info");

    this.info.clock = create_block_element("osd_info_clock", this.info['dom_obj']);

    this.info.time_shift_mark = create_block_element("osd_info_time_shift_mark", this.info['dom_obj']);

    this.info.title = create_block_element("osd_info_title", this.info['dom_obj']);

    this.info.logo = create_block_element("osd_info_logo", this.info['dom_obj']);

    this.info.epg = create_block_element("osd_info_epg", this.info['dom_obj']);

    this.info.video_container = create_block_element("", this.info['dom_obj']);

    var pos_bar = create_block_element("pos_bar", this.info.video_container);
    this.info.pos_bar = pos_bar;

    this.info.pos_button = create_block_element("pos_button", pos_bar);

    //this.info.pos_time = create_block_element("pos_time", this.info.video_container);

    this.pos_time_bar = create_block_element("pos_time", this.info.video_container);

    this.info.cur_pos_time = create_block_element("cur_pos_time", this.pos_time_bar);

    var pos_time_separator = create_block_element("pos_time_separator", this.pos_time_bar);
    pos_time_separator.innerHTML = '/';

    this.info.total_pos_time = create_block_element("total_pos_time", this.pos_time_bar);

    this.info.pos_series = create_block_element("pos_series", this.info.video_container);

    this.info.epg.hide();
    this.info.video_container.hide();

    this.info.dom_obj.hide();
};

player.prototype.show_info = function (item, direct_call) {
    _debug('show_info');

    item = item || this.cur_media_item;
    direct_call = direct_call || false;

    if (this.info.on) {
        window.clearTimeout(this.info.hide_timeout);
        var show_epg_desc = true;
    } else {
        this.info.dom_obj.show();
        this.info.on = true;
        show_epg_desc = false;
    }

    _debug('item', item);

    var title = '';

    if (item.hasOwnProperty('number') && item.number) {
        title = item.number + '. ';
    }

    var title_idx = item.name.indexOf('?title=');

    var part = '';

    if (title_idx != -1) {

        part = item.name.substr(title_idx + 7);

        item.name = item.name.substr(0, title_idx);
    }

    var cmd_title_idx = item.cmd.indexOf('?title=');

    if (!part && cmd_title_idx != -1) {
        part = item.cmd.substr(cmd_title_idx + 7);
    }

    title += item.name;

    if (part) {

        title += ' ' + get_word('iso_title') + ' ' + (parseInt(part, 10) + 1);

        if (item.hasOwnProperty('playlist')) {
            title += '/' + item.playlist.length;
        }
    }

    var osd_title_match = /osd_title=([^&]*)/.exec(item.cmd);

    if (osd_title_match) {
        title = decodeURIComponent(osd_title_match[1].replace(/\+/g, '%20'));
    }

    this.info.title.innerHTML = title;

    _debug('this.is_tv', this.is_tv);

    if (item.is_audio) {
        this.info.clock.style.visibility = 'hidden';
    } else {
        this.info.clock.style.visibility = 'visible';
    }

    try {

        if (stb.cur_place == 'radio') {
            if (!this.info.epg.isHidden()) {
                this.info.epg.hide();
            }

            if (!this.info.video_container.isHidden()) {
                this.info.video_container.hide();
            }

        } else if (this.is_tv) {
            if (this.info.epg.isHidden()) {
                this.info.epg.show();
            }

            if (!this.info.video_container.isHidden()) {
                this.info.video_container.hide();
            }

            if (item.hasOwnProperty('open') && !item.open) {

                if (item.hasOwnProperty('error') && item.error) {
                    this.info.epg.innerHTML = '<span style="color:#ffb0b0">' + get_word('error_channel_' + item.error) + '</span>';
                } else {
                    this.info.epg.innerHTML = '<span style="color:#ffb0b0">' + get_word('msg_channel_not_available') + '</span>';
                }

            } else if (item.hasOwnProperty('error') && item.error) {
                this.info.epg.innerHTML = '<span style="color:#ffb0b0">' + get_word('error_channel_' + item.error) + '</span>';
            } else if (item.type && item.type == 'dvb' && typeof (dvbManager) !== 'undefined') {

                epg = dvbManager.GetEPGBrief(item.dvb_id);
                _debug('epg', epg);

                try {
                    epg = JSON.parse(epg);
                    epg = epg.events || [];
                } catch (e) {
                    _debug(e);
                    epg = [];
                }

                epg = epg.slice(0, 2);

                if (epg.length > 0) {
                    this.info.epg.innerHTML = epg.reduce(function (prev, program) {

                        return prev
                            + stb.clock.convert_timestamp_to_human_time(program.start)
                            + ' ' + program.name + '<br>';
                    }, '');
                } else {
                    this.info.epg.innerHTML = '';
                }

            } else {

                var epg = stb.epg_loader.get_curr_and_next(item.id);

                if (direct_call && show_epg_desc && epg && epg.length > 0 && epg[0].hasOwnProperty('descr') && epg[0].descr && this.info.epg.getAttribute("descr") !== "1") {
                    this.info.epg.innerHTML = epg[0].t_time + ' ' + epg[0].descr;
                    this.info.epg.setAttribute("descr", "1");
                } else {
                    this.info.epg.innerHTML = stb.epg_loader.get_osd_info(epg);
                    this.info.epg.setAttribute("descr", "0");
                }
            }
        } else {

            _debug('this.info.epg.isHidden()', this.info.epg.isHidden());

            if (!this.info.epg.isHidden()) {
                this.info.epg.hide();
            }

            _debug('this.info.video_container.isHidden()', this.info.video_container.isHidden());

            _debug('this.last_state', this.last_state);

            if (this.info.video_container.isHidden()) {
                this.info.video_container.show();
            }

            if (this.last_state == 4) {
                this.set_pos_button_to_cur_time();
            }
        }

        if (item.logo && stb.profile['show_tv_channel_logo']) {
            this.info.logo.innerHTML = '<img src="' + item.logo + '">';
        } else {
            this.info.logo.innerHTML = '';
        }

        if (this.active_time_shift || this.active_local_time_shift) {
            this.pos_time_bar.addClass('padding_pos_bar')
        } else {
            this.pos_time_bar.removeClass('padding_pos_bar')
        }

        stb.clock.show();

        if (item.cur_series && parseInt(item.cur_series) > 0) {
            this.info.pos_series.innerHTML = (item.cur_season ? item.cur_season + ' ' + get_word('player_season') + ', ' : '') + item.cur_series + ' ' + get_word('player_series');
        } else if ((this.cur_media_item.hasOwnProperty('live_date') || this.pause.on) && this.active_time_shift) {
            this.info.pos_series.innerHTML = module.time_shift.get_current_date();
        } else {
            this.info.pos_series.innerHTML = '';
        }

        if (item.enable_tv_archive == 1 && module.time_shift || item.allow_local_timeshift == 1 && module.time_shift_local && module.time_shift_local.enabled) {
            this.info.time_shift_mark.show();
        } else {
            this.info.time_shift_mark.hide();
        }

        var self = this;

        this.info.hide_timeout = window.setTimeout(function () {
            self.info.dom_obj.hide();
            self.info.on = false;
        },
            this.info.hide_timer * (this.info.epg.getAttribute("descr") == "1" ? 4 : 1));
    } catch (e) {
        _debug(e);
    }
};

player.prototype.hide_info = function () {
    _debug('player.hide_info');

    this.reset_pos_by_numbers();
    this.new_pos_time = 0;
    window.clearTimeout(this.info.hide_timeout);
    this.info.dom_obj.hide();
    this.info.on = false;
};

player.prototype._find_nearest_ch_idx = function (direction, condition, invert_condition) {
    _debug('player._find_nearest_channel', direction, condition);

    invert_condition = invert_condition || false;

    if (stb.user.fav_itv_on) {
        var channels = this.fav_channels;
        var ch_idx = this.f_ch_idx;
    } else {
        channels = this.channels;
        ch_idx = this.ch_idx;
    }

    for (var _param in condition) {
        if (condition.hasOwnProperty(_param)) {
            var param = _param;
            var value = condition[param];
        }
    }

    if (direction > 0) {
        var end = channels.length - 1;
    } else {
        end = 0;
    }

    if (direction > 0) {

        for (var i = ch_idx + 1; i <= channels.length - 1; i++) {

            if (invert_condition) {
                if (channels[i][param] != value) {
                    return i;
                }
            } else {
                if (channels[i][param] == value) {
                    return i;
                }
            }
        }

        for (i = 0; i < ch_idx; i++) {

            if (invert_condition) {
                if (channels[i][param] != value) {
                    return i;
                }
            } else {
                if (channels[i][param] == value) {
                    return i;
                }
            }
        }

    } else {

        for (i = ch_idx - 1; i >= 0; i--) {
            if (invert_condition) {
                if (channels[i][param] != value) {
                    return i;
                }
            } else {
                if (channels[i][param] == value) {
                    return i;
                }
            }
        }

        for (i = channels.length - 1; i > ch_idx; i--) {
            if (invert_condition) {
                if (channels[i][param] != value) {
                    return i;
                }
            } else {
                if (channels[i][param] == value) {
                    return i;
                }
            }
        }

    }
    return null;
};

player.prototype.switch_channel = function (dir, show_info, do_not_invert) {

    _debug('switch_channel', dir);

    if (!do_not_invert && stb.user.invert_channel_switch_direction == 1) {
        dir = -1 * dir;
    }

    if (this.active_time_shift || this.active_local_time_shift) {
        this.time_shift_indication.show();
        return;
    }

    if (!this.is_tv) {
        return;
    }

    if (show_info) {
        this.need_show_info = 1;
    } else {
        this.need_show_info = 0;
    }

    var item = {};

    _debug('module.tv.genre', module.tv.genre);

    if (dir > 0) {

        if (stb.user.fav_itv_on) {

            if (module.tv.genre && module.tv.genre.id != '*') {
                this.f_ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": module.tv.genre.id });

                _debug('nearest this.f_ch_idx', this.f_ch_idx);
            } else {

                if (stb.profile['hide_tv_genres_in_fullscreen']) {
                    this.f_ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": stb.profile['hide_tv_genres_in_fullscreen'][0] }, true);
                } else {
                    if (this.f_ch_idx < this.fav_channels.length - 1) {
                        this.f_ch_idx++;
                    } else {
                        this.f_ch_idx = 0;
                    }
                }
            }

            _debug('this.f_ch_idx:', this.f_ch_idx);

            item = this.fav_channels[this.f_ch_idx];

        } else {

            if (module.tv.genre && module.tv.genre.id != '*') {
                this.ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": module.tv.genre.id });

                _debug('nearest this.ch_idx', this.ch_idx);
            } else {

                if (stb.profile['hide_tv_genres_in_fullscreen']) {
                    this.ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": stb.profile['hide_tv_genres_in_fullscreen'][0] }, true);
                } else {
                    if (this.ch_idx < this.channels.length - 1) {
                        this.ch_idx++;
                    } else {
                        this.ch_idx = 0;
                    }
                }
            }

            _debug('this.ch_idx:', this.ch_idx);

            item = this.channels[this.ch_idx];
        }

    } else {
        if (stb.user.fav_itv_on) {

            if (module.tv.genre && module.tv.genre.id != '*') {
                this.f_ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": module.tv.genre.id });

                _debug('nearest this.f_ch_idx', this.f_ch_idx);
            } else {

                if (stb.profile['hide_tv_genres_in_fullscreen']) {
                    this.f_ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": stb.profile['hide_tv_genres_in_fullscreen'][0] }, true);
                } else {
                    if (this.f_ch_idx > 0) {
                        this.f_ch_idx--;
                    } else {
                        this.f_ch_idx = this.fav_channels.length - 1;
                    }
                }
            }

            _debug('this.f_ch_idx:', this.f_ch_idx);

            item = this.fav_channels[this.f_ch_idx];

        } else {

            if (module.tv.genre && module.tv.genre.id != '*') {
                this.ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": module.tv.genre.id });

                _debug('nearest this.ch_idx', this.ch_idx);
            } else {

                if (stb.profile['hide_tv_genres_in_fullscreen']) {
                    this.ch_idx = this._find_nearest_ch_idx(dir, { "tv_genre_id": stb.profile['hide_tv_genres_in_fullscreen'][0] }, true);
                } else {
                    if (this.ch_idx > 0) {
                        this.ch_idx--;
                    } else {
                        this.ch_idx = this.channels.length - 1;
                    }
                }
            }

            _debug('this.ch_idx:', this.ch_idx);

            item = this.channels[this.ch_idx];
        }
    }

    if (!item) {
        _debug('no channel');
        return;
    }

    if (parseInt(item.use_http_tmp_link) == 1 || parseInt(item.use_load_balancing) == 1 || stb.user['force_ch_link_check']) {
        this.on_create_link = function (result) {
            _debug('player.tv.on_create_link', result);

            if (result.error == 'limit') {
                stb.notice.show(word['player_limit_notice']);
            } else if (result.error == 'nothing_to_play') {
                stb.notice.show(word['player_file_missing']);
            } else if (result.error == 'link_fault') {
                stb.notice.show(word['player_server_error']);
            } else if (result.error == 'access_denied') {
                stb.notice.show(word['player_access_denied']);
            } else {
                stb.player.play_now(result);
            }
        }
    }

    this.play(item);
};

player.prototype.send_last_tv_id = function (id, censored) {
    _debug('send_last_tv_id', id, censored);

    censored = censored || false;

    _debug('censored', censored);

    var self = this;

    window.clearTimeout(this.send_played_itv_timer);

    this.send_played_itv_timer = window.setTimeout(
        function () {
            self.send_played_itv(id, censored);
        },

        this.send_last_tv_id_to
    );

    if (censored) {
        return;
    }

    _debug('this.last_tv_id', this.last_tv_id);

    if (id == this.last_tv_id) {
        return;
    }

    this.last_tv_id = stb.user.last_itv_id = id;

    stb.load(
        {
            "type": "itv",
            "action": "set_last_id",
            "id": id
        },

        function (result) {
            _debug('last_tv_id saved', result);

            _debug('typeof this.send_last_tv_id_callback', typeof (this.send_last_tv_id_callback));

            this.send_last_tv_id_callback();

            this.send_last_tv_id_callback = function () {
            };
        },

        this
    )
};

player.prototype.send_played_itv = function (id, censored) {

    censored = censored || false;

    stb.load(
        {
            "type": "itv",
            "action": "set_played",
            "itv_id": id,
            "censored": censored
        },

        function (result) {

        }
    );
};

player.prototype.send_played_timeshift = function (id) {

    stb.load(
        {
            "type": "tv_archive",
            "action": "set_played_timeshift",
            "ch_id": id
        },

        function (result) {
            _debug('on timeshift set_played', result);

            this.cur_media_item.timeshift_hist_id = result;
        },

        this
    );
};

player.prototype.update_played_timeshift_end_time = function (id) {

    stb.load(
        {
            "type": "tv_archive",
            "action": "update_played_timeshift_end_time",
            "hist_id": id
        },

        function (result) {
            _debug('on update_played_timeshift_end_time', result);
        },

        this
    );
};

player.prototype.send_played_tv_archive = function (id) {

    stb.load(
        {
            "type": "tv_archive",
            "action": "set_played",
            "ch_id": id
        },

        function (result) {
            _debug('on archive set_played', result);

            this.cur_media_item.archive_hist_id = result;
        },

        this
    );
};

player.prototype.update_played_tv_archive_end_time = function (id) {

    stb.load(
        {
            "type": "tv_archive",
            "action": "update_played_end_time",
            "hist_id": id
        },

        function (result) {
            _debug('on update_played_end_time', result);

        },

        this
    );
};

player.prototype.send_played_video = function (video_id) {
    _debug('player.send_played_video', video_id);

    stb.load(
        {
            "type": "vod",
            "action": "set_played",
            "video_id": video_id,
            "storage_id": this.last_storage_id
        },

        function (result) {

        }
    );

};

player.prototype.show_prev_layer = function () {
    _debug('player.show_prev_layer');

    try {
        if (this.prev_layer && this.prev_layer.show) {
            this.prev_layer.show.call(this.prev_layer, true);
        } else {
            if (this.is_tv) {
                module.tv._show();
            }
        }

        if (this.prev_layer && this.prev_layer.cur_view == 'short') {
            return;
        }

        this.stop();
    } catch (e) {
        _debug(e);
    }
};

player.prototype.time_shift_indication = {
    on: false,

    init: function () {
        _debug('time_shift_indication.init');

        this.time_shift_info_container = create_block_element('time_shift_info_container');
        this.time_shift_info_txt = create_block_element('time_shift_info_block', this.time_shift_info_container);

        this.time_shift_info_txt.innerHTML = get_word('TIME SHIFT');

        create_block_element('time_shift_info_block_right', this.time_shift_info_container);

        this.time_shift_info_container.hide();
    },

    show: function () {
        _debug('time_shift_indication.show');
        this.time_shift_info_container.show();
        this.on = true;
        this.t_hide();
    },

    t_hide: function () {
        _debug('time_shift_indication.t_hide');
        window.clearTimeout(this.time_shift_indication_hide);
        var self = this;
        this.time_shift_indication_hide = window.setTimeout(function () {
            self.hide();
        }, 3000);
    },

    hide: function () {
        _debug('time_shift_indication.hide');
        this.time_shift_info_container.hide();
        this.on = false;
    }
};

player.prototype.ad_indication = {
    on: false,

    init: function () {
        _debug('ad_indication.init');

        this.ad_indication_container = create_block_element('time_shift_info_container');
        this.ad_indication_txt = create_block_element('time_shift_info_block', this.ad_indication_container);

        this.ad_indication_txt.innerHTML = get_word('commercial');

        create_block_element('time_shift_info_block_right', this.ad_indication_container);

        this.ad_indication_container.hide();
    },

    show: function () {
        _debug('ad_indication.show');
        this.ad_indication_container.show();
        this.on = true;
        this.t_hide();
    },

    t_hide: function () {
        _debug('ad_indication.t_hide');
        window.clearTimeout(this.ad_indication_hide);
        var self = this;
        this.ad_indication_hide = window.setTimeout(function () {
            self.hide();
        }, 3000);
    },

    hide: function () {
        _debug('ad_indication.hide');
        this.ad_indication_container && this.ad_indication_container.hide && this.ad_indication_container.hide();
        this.on = false;
    }
};

player.prototype.ad_skip_indication = {
    on: false,

    init: function () {
        _debug('ad_skip_indication.init');

        this.ad_skip_indication_container = create_block_element('ad_skip_container');
        this.ad_skip_indication_txt = create_block_element('ad_skip_block', this.ad_skip_indication_container);

        this.ad_skip_indication_txt.innerHTML = '<div class="ad_skip_txt">' + get_word('ad_skip') + '</div>';

        create_block_element('time_shift_info_block_right', this.ad_skip_indication_container);

        this.ad_skip_indication_container.hide();
    },

    show: function () {
        _debug('ad_skip_indication.show');
        this.ad_skip_indication_container.show();
        this.on = true;
        //this.t_hide();
    },

    t_hide: function () {
        _debug('ad_skip_indication.t_hide');
        window.clearTimeout(this.ad_skip_indication_hide);
        var self = this;
        this.ad_skip_indication_hide = window.setTimeout(function () {
            self.hide();
        }, 3000);
    },

    hide: function () {
        _debug('ad_skip_indication.hide');
        this.ad_skip_indication_container && this.ad_skip_indication_container.hide && this.ad_skip_indication_container.hide();
        this.on = false;
    }
};

player.prototype.bind = function () {

    var self = this;

    this.switch_channel.bind(key.UP, self, 1, true);
    this.switch_channel.bind(key.DOWN, self, -1, true);

    this.switch_channel.bind(key.CHANNEL_NEXT, self, 1, true, true);
    this.switch_channel.bind(key.CHANNEL_PREV, self, -1, true, true);

    (function () {
        stb.player.ClockOnVideo.toggle();
    }).bind(key.CLOCK, this);

    (function () {

        if (this.info.on) {
            this.set_pos_and_play();
        } else {
            this.pause_switch();
        }

    }).bind(key.PAUSE, this);


    (function () {
        if (this.info.on) {
            this.set_pos_and_play(true);
        } else if (this.quick_ch_switch.on) {
            this.cancel_quick_ch_switch();
        } else if (this.is_tv) {
            this.hide_info();
            module.tv._show();
            module.tv.set_short_container();
        } else {
            if (this.active_time_shift || this.active_local_time_shift) {
                this.show_time_shift_exit_confirm();
            } else if (this.prev_layer.layer_name == 'epg' && this.prev_layer.player_overlay_mode) {
                this.play_last();
                module.epg.show(false, true);
            } else {
                this.show_prev_layer();
                if (this.cur_media_item.hasOwnProperty('ad_tracking')) {

                    this.ad_indication.hide();
                    this.ad_skip_indication.hide();
                    stb.advert.stop_ticking();

                    if (this.cur_media_item.ad_tracking.hasOwnProperty('close')) {
                        stb.advert.track(this.cur_media_item.ad_tracking['close'], 'close')
                    }

                    this.cur_media_item.stop_callback && this.cur_media_item.stop_callback();
                }
            }
        }
    }).bind(key.EXIT, this);

    (function () {
        this.prev_layer && this.prev_layer.hide && this.prev_layer.hide();
        this.play_last();
    }).bind(key.TV, this);

    (function () {
        if (this.is_tv && !module.tv.on) {

            var rec_idx = stb.recordings.getIdxByVal('ch_id', this.cur_tv_item.id);

            _debug('rec_idx', rec_idx);

            if (rec_idx !== null) {

                if (stb.recordings[rec_idx].local == 1) {
                    module.pvr_local.stop_channel_rec(this.cur_tv_item);
                } else {
                    module.remote_pvr.stop_channel_rec(this.cur_tv_item);
                }

                return;
            }

        } else {
            if (this.active_time_shift || this.active_local_time_shift) {
                this.show_time_shift_exit_confirm();
            } else {
                this.show_prev_layer();
            }
        }
    }).bind(key.STOP, self);

    //this.show_prev_layer.bind(key.STOP, self);

    this.show_info.bind(key.INFO, self, null, true);

    this.move_pos.bind(key.FFWD, this, 1);

    this.move_pos.bind(key.REW, this, -1);

    (function () {

        if (this.cur_media_item.media_type == 'advert' || this.cur_media_item.media_type == 'vclub_ad') {

            this.ad_indication.hide();
            this.ad_skip_indication.hide();
            stb.advert.stop_ticking();

            if (this.cur_media_item.hasOwnProperty('ad_tracking')) {
                if (this.cur_media_item.ad_tracking.hasOwnProperty('close')) {
                    stb.advert.track(this.cur_media_item.ad_tracking['close'], 'close')
                }
            }

            this.cur_media_item.stop_callback && this.cur_media_item.stop_callback();
            return;
        } else if (this.info.on && !this.quick_ch_switch.on) {
            if (this.is_tv) {
                this.hide_info();
                module.tv._show();
                module.tv.set_short_container();
            } else {
                this.set_pos_and_play();
            }

        } else if (this.quick_ch_switch.on) {
            this.hide_quick_ch_switch();
        } else if (this.prev_layer && this.prev_layer.cur_view == 'short' && !this.is_tv) {

            if (this.active_time_shift || this.active_local_time_shift) {
                this.show_time_shift_exit_confirm();
            } else {
                this.show_prev_layer();
            }

        } else if (this.is_tv) {
            if (this.active_local_time_shift) {
                this.show_time_shift_exit_confirm();
            } else {
                module.tv._show(module.tv.genre);
                module.tv.set_short_container();
            }
        }

    }).bind(key.OK, this);

    (function () {

        if (!module.tv || !module.tv.on) {
            this.con_menu && this.con_menu.show && this.con_menu.show();
        }

    }).bind(key.APP, this).priority_bind(key.AUDIO, this);


    (function () {
        if (this.on) {
            this.volume.control(1);
        }
    }).bind(key.VOL_UP, this);

    (function () {
        if (this.on) {
            this.volume.control(-1);
        }
    }).bind(key.VOL_DOWN, this);


    (function (dir) {

        _debug('stb.profile[enable_arrow_keys_setpos]', stb.profile['enable_arrow_keys_setpos']);
        _debug('dir', dir);

        if (stb.profile['enable_arrow_keys_setpos']) {
            this.move_pos(dir);
        } else {
            this.volume.control(dir);
        }

    }).bind(key.RIGHT, this, 1).bind(key.LEFT, this, -1);

    (function () {
        if (this.on) {
            this.volume.mute_switch();
        }
    }).bind(key.MUTE, this);

    this.numpad_key_handler.bind(key.NUM1, this, 1);
    this.numpad_key_handler.bind(key.NUM2, this, 2);
    this.numpad_key_handler.bind(key.NUM3, this, 3);
    this.numpad_key_handler.bind(key.NUM4, this, 4);
    this.numpad_key_handler.bind(key.NUM5, this, 5);
    this.numpad_key_handler.bind(key.NUM6, this, 6);
    this.numpad_key_handler.bind(key.NUM7, this, 7);
    this.numpad_key_handler.bind(key.NUM8, this, 8);
    this.numpad_key_handler.bind(key.NUM9, this, 9);
    this.numpad_key_handler.bind(key.NUM0, this, 0);

    (function () {

        if (this.info.on) {
            if (this.pos_by_numbers_input != '') {
                this.pos_by_numbers_back_key_handler();
            }
        }

        if (this.quick_ch_switch.on) {
            this.del_quick_go_ch();
        } else {
            if (this.is_tv) {
                this.hist_back();
            }
        }
    }).bind(key.BACK, this);

    (function () {

        if (this.is_tv) {
            this.change_tv_channel_aspect();
        } else {
            this.change_aspect();
        }

    }).bind(key.FRAME, this);

    (function () {

        if (this.is_tv && !module.tv.on) {

            var rec_idx = stb.recordings.getIdxByVal('ch_id', this.cur_tv_item.id);

            _debug('rec_idx', rec_idx);

            if (rec_idx !== null) {

                if (stb.recordings[rec_idx].t_start_ts * 1000 > new Date().getTime()) {
                    stb.notice.show(get_word('rec_channel_has_scheduled_recording'));
                } else if (stb.recordings[rec_idx].local == 1) {
                    module.pvr_local.rec_switch(this.cur_tv_item);
                } else {
                    module.remote_pvr.rec_switch(this.cur_tv_item);
                }

                return;
            }

            this.init_pvr_dialogs();

            if (loader.template == "xc_vm") {
                if (module.pvr_local) {
                    if (this.cur_tv_item['allow_local_pvr']) {
                        // show confirm
                        this.local_pvr_confirm.deferred = false;
                        this.local_pvr_confirm.channel = this.cur_tv_item;
                        this.local_pvr_confirm.show({ parent: this });
                    } else {
                        stb.notice.show(get_word('channel_recording_restricted'));
                    }
                } else {
                    stb.notice.show(get_word('recording_disabled'));
                }
            } else {
                var allow_remote_pvr = module.remote_pvr && this.cur_tv_item['allow_pvr'];
                var allow_local_pvr = module.pvr_local && this.cur_tv_item['allow_local_pvr'];
                if (allow_remote_pvr && allow_local_pvr) {
                    this.pvr_target_select.deferred = false;
                    this.pvr_target_select.channel = this.cur_tv_item;
                    this.pvr_target_select.show({ parent: this });
                } else if (allow_remote_pvr) {
                    // show confirm
                    this.remote_pvr_confirm.deferred = false;
                    this.remote_pvr_confirm.channel = this.cur_tv_item;
                    this.remote_pvr_confirm.show({ parent: this });
                } else if (allow_local_pvr) {
                    // show confirm
                    this.local_pvr_confirm.deferred = false;
                    this.local_pvr_confirm.channel = this.cur_tv_item;
                    this.local_pvr_confirm.show({ parent: this });
                } else {
                    stb.notice.show(get_word('channel_recording_restricted'));
                }
            }
        }

    }).bind(key.REC, this).bind(key.RED, this);

    this.volume.set_level.bind(key.REFRESH, this.volume, 50);

    (function (dir) {

        _debug('dir', dir);

        var self = this;

        if (this.cur_media_item.media_type != 'vclub_ad' && this.cur_media_item.media_type != 'advert' && this.cur_media_item.hasOwnProperty('series') && this.cur_media_item.series && this.cur_media_item.series.length > 0) {

            _debug('this.cur_media_item.cur_series before', this.cur_media_item.cur_series);
            _debug('this.cur_media_item.series.length', this.cur_media_item.series.length);

            var series_idx = this.cur_media_item.series.indexOf(this.cur_media_item.cur_series);

            _debug('series_idx before', series_idx);

            var old_series_idx = series_idx;

            if (dir > 0) {
                if (series_idx < this.cur_media_item.series.length - 1) {
                    series_idx++;
                }
            } else {
                if (series_idx > 0) {
                    series_idx--;
                }
            }

            _debug('series_idx after', series_idx);

            if (old_series_idx != series_idx) {

                this.cur_media_item.cur_series = this.cur_media_item.series[series_idx];
                this.cur_media_item.disable_ad = true;

                if (this.cur_media_item.cmd.indexOf('://')) {
                    this.cur_media_item.cmd = '/media/' + this.cur_media_item.id + '.mpg';
                }

                this.play(this.cur_media_item);
            }

            return;
        }

        _debug('this.active_time_shift', this.active_time_shift);

        if (this.active_time_shift) {

            if (!this.pause.on) {

                if (module.tv_archive && this.cur_media_item.mark_archive) {
                    window.clearTimeout(this.archive_continue_dialog_to);
                }

                try {
                    stb.Pause();
                } catch (e) {
                    _debug(e);
                }
                this.pause.on = true;
            }

            if (dir > 0) {
                module.time_shift.pos_to_next_program();
            } else {
                module.time_shift.pos_to_previous_program();
            }

            if (!this.info.on) {
                this.show_info();
            }

            window.clearTimeout(this.info.hide_timeout);

            this.info.hide_timeout = window.setTimeout(function () {
                stb.player.set_pos_and_play();
            }, 4000);
        }

        // start time-shift mode
        if (this.is_tv && parseInt(this.cur_media_item.enable_tv_archive, 10) && module.time_shift && !this.prev_layer.on) {

            if (dir > 0) {
                return;
            }

            if (!this.pause.on) {

                if (module.tv_archive && this.cur_media_item.mark_archive) {
                    window.clearTimeout(this.archive_continue_dialog_to);
                }

                try {
                    stb.Pause();
                } catch (e) {
                    _debug(e);
                }
                this.pause.on = true;
            }

            module.time_shift.set_media_item(this.cur_tv_item);
            module.time_shift.get_link_for_channel();
            this.is_tv = false;
            this.active_time_shift = true;
            this.cur_pos_time = module.time_shift.get_pos_time();
            this.cur_media_length = module.time_shift.get_cur_media_length();
            _debug('this.cur_media_length', this.cur_media_length);
            _debug('this.cur_pos_time', this.cur_pos_time);

            module.time_shift.pos_to_cur_program_begin();

            if (!this.info.on) {
                this.show_info();
            }

            window.clearTimeout(this.info.hide_timeout);

            this.info.hide_timeout = window.setTimeout(function () {
                self.hide_info();
            }, 4000);
        }

        if (this.cur_media_item.media_type == 'advert' || this.cur_media_item.media_type == 'vclub_ad') {

            this.ad_indication.hide();
            this.ad_skip_indication.hide();
            stb.advert.stop_ticking();

            if (this.cur_media_item.hasOwnProperty('ad_tracking')) {
                if (this.cur_media_item.ad_tracking.hasOwnProperty('close')) {
                    stb.advert.track(this.cur_media_item.ad_tracking['close'], 'close')
                }
            }

            this.cur_media_item.stop_callback && this.cur_media_item.stop_callback();
            return;
        }

        var idx = this.cur_media_item.playlist.lastIndexOf(this.cur_media_item.cmd);

        _debug('idx', idx);

        if (idx == -1) {
            return;
        }

        idx = idx + dir;

        if (!this.cur_media_item.playlist[idx]) {
            return;
        }

        var cur_media_item = this.cur_media_item.clone();

        cur_media_item.cmd = cur_media_item.playlist[idx];

        //cur_media_item.name = cur_media_item.cmd.substr(this.cur_media_item.cmd.lastIndexOf("/") + 1);

        var real_id_match = /real_id=([^&]*)/.exec(cur_media_item.cmd);

        if (real_id_match) {
            cur_media_item.real_id = real_id_match[1];
        }

        var osd_title_match = /osd_title=([^&]*)/.exec(cur_media_item.cmd);

        if (osd_title_match) {
            cur_media_item.name = decodeURIComponent(osd_title_match[1].replace(/\+/g, '%20'));
        } else if (!cur_media_item.hasOwnProperty('keep_original_name') || !cur_media_item.keep_original_name) {
            cur_media_item.name = cur_media_item.cmd.substr(this.cur_media_item.cmd.lastIndexOf("/") + 1);
        }

        if (cur_media_item.show_osd) {
            stb.Stop();
            this.need_show_info = 1;
        }

        if (cur_media_item.hasOwnProperty('ad_must_watch')) {
            delete cur_media_item.ad_must_watch;
        }

        if (this.cur_media_item.media_type && this.cur_media_item.media_type == 'vclub_ad') {
            delete cur_media_item.media_type;
            cur_media_item.disable_ad = true;
            module && module.vclub && module.vclub.set_ad_ended_time && module.vclub.set_ad_ended_time(this.cur_media_item.ad_id, stb.GetPosTime(), stb.GetMediaLen());
        }

        this.play(cur_media_item);

    }).bind(key.NEXT, this, 1).bind(key.PREV, this, -1);

    (function () {
        if (this.is_tv && module.epg) {
            if (module.epg.on) {
                module.epg.hide();
            } else {
                module.epg.ch_id = this.cur_tv_item.id;
                module.epg.show(false, true);
            }
        }
    }).bind(key.EPG, this).bind(key.BLUE, this);
};

player.prototype.numpad_key_handler = function (num) {
    _debug('player.numpad_key_handler', num);

    if (stb.cur_place == 'radio') {
        return;
    }

    if (this.is_tv) {
        this.show_quick_ch_switch(num)
    } else {
        this.change_pos_by_numbers(num)
    }
};

player.prototype.change_pos_by_numbers = function (num) {
    _debug('player.change_pos_by_numbers', num);

    this.processing_pos_input();

    this.pos_by_numbers_input += num.toString();

    if (this.pos_by_numbers_input.length > 6) {
        this.pos_by_numbers_input = this.pos_by_numbers_input.substr(this.pos_by_numbers_input.length - 6, 6);
    }

    this.pos_by_numbers_input = '' + parseInt(this.pos_by_numbers_input, 10);

    //var new_pos_time = this.human_time_to_sec(this.pos_by_numbers_input);
    var new_pos_time = this.number_to_sec(this.pos_by_numbers_input);
    this.set_pos_button(new_pos_time);
    this.update_current_time(this.pos_by_numbers_input);
};

player.prototype.pos_by_numbers_back_key_handler = function () {
    _debug('player.pos_by_numbers_back_key_handler');

    this.processing_pos_input();

    this.pos_by_numbers_input = this.pos_by_numbers_input.substr(0, this.pos_by_numbers_input.length - 1);

    //var new_pos_time = this.human_time_to_sec(this.pos_by_numbers_input);
    var new_pos_time = this.number_to_sec(this.pos_by_numbers_input);
    this.set_pos_button(new_pos_time);
    this.update_current_time(this.pos_by_numbers_input);
};

player.prototype.processing_pos_input = function () {
    _debug('player.processing_pos_input');

    if (!this.info.on) {
        this.show_info();
    }

    if (this.pos_by_numbers_input == '') {
        this.update_current_time(0);

        this.info.cur_pos_time.setAttribute('active', 'active');
    }

    window.clearTimeout(this.info.hide_timeout);

    var self = this;

    this.info.hide_timeout = window.setTimeout(function () {
        self.set_pos_and_play();
    }, 4000);

    if (module.tv_archive && this.cur_media_item.mark_archive) {
        window.clearTimeout(this.archive_continue_dialog_to);
    }

    if (!this.pause.on) {
        try {
            stb.Pause();
        } catch (e) {
            _debug(e);
        }
        this.pause.on = true;
    }
};

player.prototype.reset_pos_by_numbers = function () {
    _debug('player.reset_pos_by_numbers');

    this.pos_by_numbers_input = '';
    this.info.cur_pos_time.setAttribute('active', '');
};

player.prototype.save_fav_ids = function () {
    _debug('player.save_fav');

    stb.load(
        {
            'type': 'itv',
            'action': 'set_fav',
            'fav_ch': this.fav_channels_ids.join(',')
        },

        function (result) {
            _debug('fav_saved', result);

            //stb.load_fav_channels();

            stb.load(
                {
                    'type': 'itv',
                    'action': 'get_all_fav_channels',
                    'fav': 1
                },

                function (result) {
                    _debug('get_all_fav_channels result', result);

                    stb.player.fav_channels = result.data || [];
                },

                this
            )
        },

        this
    )
};

player.prototype.get_file_type = function (item) {

    if (item.is_audio) {
        return 'audio';
    }

    var cmd = '';

    if (typeof (item) == 'object') {
        cmd = item.cmd;
    } else {
        cmd = item;
    }

    var p = /^(.*)\.(\S+)$/

    var ext = ['mp3', 'ac3', 'wav', 'flac', 'ogg'];

    var type = 'video';

    if (ext.indexOf(cmd.replace(p, "$2")) != -1) {
        type = 'audio';
    }

    _debug('file_type', type);

    return type;
};

player.prototype.set_pos_button_to_cur_time = function () {
    _debug('player.set_pos_button_to_cur_time');

    try {

        _debug('this.active_time_shift', this.active_time_shift);

        if (this.active_time_shift && module.time_shift) {

            //this.cur_media_length = module.time_shift.get_cur_media_length();
            this.cur_media_length = module.time_shift.get_cur_media_length();
            this.cur_pos_time = module.time_shift.get_pos_time();
            _debug('this.cur_media_length', this.cur_media_length);
            _debug('this.cur_pos_time', this.cur_pos_time);

        } else if (this.active_local_time_shift) {

            /*var now = new Date();
            this.cur_media_length = now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds();
            this.cur_pos_time = this.cur_media_length - (stb.GetMediaLen() - stb.GetPosTime());*/

            this.cur_media_length = stb.GetMediaLen();
            this.cur_pos_time = stb.GetPosTime();

        } else if (this.emulate_media_len && module.tv_archive) {
            /*var global_pos_time = stb.GetPosTime();

            this.cur_pos_time = global_pos_time - (this.cur_media_item.position ? this.cur_media_item.position : 0);

            _debug('global_pos_time', global_pos_time);
            _debug('this.cur_media_item.position', this.cur_media_item.position);
            _debug('this.cur_pos_time 1', this.cur_pos_time);

            if (module.tv_archive){
                this.cur_pos_time += module.tv_archive.get_file_piece_num() * 3600;
            }*/

            this.cur_pos_time = module.tv_archive.get_pos_time();

            _debug('this.cur_pos_time 1', this.cur_pos_time);

        } else {
            this.cur_pos_time = stb.GetPosTime();
        }

        _debug('this.cur_pos_time', this.cur_pos_time);

        this.set_pos_button(this.cur_pos_time);
    } catch (e) {
        _debug(e);
    }
};

player.prototype.set_pos_button = function (to_time) {
    _debug('player.set_pos_button', to_time);

    //this.new_pos_time = to_time;

    /*if (this.new_pos_time < 0){
        if (this.active_time_shift){ 
            this.cur_media_length = 86400;
            //this.cur_pos_time = 86400 + to_time;
            //
            //to_time =  86400;
        }else{
            this.new_pos_time = 0;
        }
    }*/

    var real_to_time = to_time;

    try {

        if (this.active_time_shift) {

            _debug('this.cur_media_length 1', this.cur_media_length);

            if (to_time > this.cur_media_length) {

                /*if (module.time_shift.is_last_archive_day()){
                    to_time = this.cur_media_length;
                }else{
                    to_time = 0;
                    module.time_shift.cur_piece_date.setDate(module.time_shift.cur_piece_date.getDate()-1);
                }*/
                //this.cur_pos_time = to_time = 0;

                if (!module.time_shift.is_last_archive_day()) {
                    this.cur_pos_time = to_time = 0;
                    //_debug('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!date + 1');
                    module.time_shift.cur_piece_date.setDate(module.time_shift.cur_piece_date.getDate() + 1);
                    this.cur_media_length = module.time_shift.get_cur_media_length();

                    //this.diff_pos -= 86400;
                    this.diff_pos = 0;
                } else {
                    to_time = this.cur_media_length;
                }

            } else if (to_time < 0) {

                _debug('this.cur_pos_time 1', this.cur_pos_time);

                if (module.time_shift.can_reduce_day()) {

                    _debug('set previous day');
                    this.cur_pos_time = to_time = 86400;
                    this.cur_media_length = 86400;

                    this.diff_pos = 0;
                    //_debug('------------------------------------------------------------------------------------------------------------------------! date - 1');
                    module.time_shift.cur_piece_date.setDate(module.time_shift.cur_piece_date.getDate() - 1);

                } else {
                    to_time = 0;
                }
            } else {
                if (!module.time_shift.in_archive(to_time) && this.diff_pos) {
                    _debug('this.diff_pos', this.diff_pos);
                    //_debug('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
                    this.cur_pos_time = to_time = module.time_shift.get_first_piece_position();
                    this.diff_pos = 0;
                    //return;
                }
            }

            _debug('this.cur_media_length', this.cur_media_length);
            _debug('this.new_pos_time', this.new_pos_time);
            _debug('this.diff_pos', this.diff_pos);
            _debug('this.prev_to_time', this.prev_to_time);
            _debug('this.cur_pos_time', this.cur_pos_time);
            _debug('to_time', to_time);

            this.new_pos_time = to_time;
            this.info.pos_series.innerHTML = module.time_shift.get_current_date();

            var program_name = module.time_shift.get_program_name_by_pos(to_time);

            _debug('program_name', program_name);

            if (program_name) {
                this.info.title.innerHTML = this.cur_media_item.number + '. ' + this.cur_media_item.name + ' — ' + program_name;
                _debug('this.info.title.innerHTML', this.info.title.innerHTML);
            }

        } else {
            if (to_time > this.cur_media_length) {
                to_time = this.cur_media_length;
            } else if (to_time < 0) {
                to_time = 0;
            }
        }

        this.prev_to_time = real_to_time;

        /*if (to_time > this.cur_media_length){
            to_time = this.cur_media_length;
        }else if (to_time < 0){
            to_time = 0;
        }*/

        this.new_pos_time = to_time;

        this.update_current_time(to_time, true);

        var to_pos = 0;

        if (this.cur_media_length != 0) {
            //to_pos = Math.round(590*to_time/this.cur_media_length);
            _debug('this.info.pos_bar.offsetWidth', this.info.pos_bar.offsetWidth);
            _debug('this.info.pos_bar.clientWidth', this.info.pos_bar.clientWidth);
            _debug('this.info.pos_bar.isHidden()', this.info.pos_bar.isHidden());
            _debug('this.info.pos_bar.style.display', this.info.pos_bar.style.display);
            to_pos = Math.round((this.info.pos_bar.offsetWidth - (this.info.pos_button.offsetWidth + 12)) * to_time / this.cur_media_length);
        }

        _debug('to_pos', to_pos);

        this.info.pos_button.moveX(to_pos);
    } catch (e) {
        _debug(e);
    }
};

player.prototype.set_pos_and_play = function (reset, do_not_hide_info) {
    _debug('set_pos_and_play', reset, do_not_hide_info);

    _debug('this.info.on', this.info.on);

    if (!this.info.on) {
        return;
    }

    window.clearTimeout(this.info.hide_timeout);

    try {
        if (!reset) {

            if (this.active_time_shift && module.time_shift) {

                _debug('module.time_shift.in_process', module.time_shift.in_process);

                if (module.time_shift.in_process) {

                    var self = this;

                    this.info.hide_timeout = window.setTimeout(function () {
                        self.set_pos_and_play();
                    }, 500);

                    _debug('return set_pos_and_play');
                    return;
                }

                var new_url = module.time_shift.get_url_by_pos(this.new_pos_time);
                _debug('new_url', new_url);

                module.time_shift.update_media_item(new_url);

                this.play(module.time_shift.cur_media_item);

                if (!do_not_hide_info) {
                    this.hide_info();
                }

                this.pos_step = 10;
                this.diff_pos = 0;
                this.next_step = 0;
                this.pause.on = false;

                return;
            } else if (this.emulate_media_len && module.tv_archive) {

                /*var new_pos_time = this.new_pos_time + parseInt(this.cur_media_item.position, 10);

                if (module.tv_archive){
                    new_pos_time -= module.tv_archive.get_file_piece_num() * 3600;
                }

                _debug('new_pos_time', new_pos_time);*/

                new_url = module.tv_archive.get_part_by_pos(this.new_pos_time);
                _debug('new_url', new_url);

                if (new_url) {
                    this.cur_media_item.cmd = new_url;
                    delete this.cur_media_item.open;
                    this.need_show_info = 0;
                    this.play(this.cur_media_item);
                } else {

                    //var new_pos_time = this.new_pos_time + parseInt(this.cur_media_item.position, 10);
                    var new_pos_time = this.new_pos_time + module.tv_archive.get_start_position() - module.tv_archive.get_file_piece_num() * 3600;

                    _debug('this.new_pos_time', this.new_pos_time);
                    _debug('new_pos_time', new_pos_time);

                    stb.SetPosTime(new_pos_time);
                }
            } else {
                _debug('stb.SetPosTime', this.new_pos_time);
                stb.SetPosTime(this.new_pos_time);
            }
        } else {
            if (this.active_time_shift) {
                //module.time_shift.cur_media_item = module.time_shift.stored_media_item.clone();
                _debug('module.time_shift.cur_media_item.live_date.getTime()', module.time_shift.cur_media_item.live_date.getTime());
                module.time_shift.cur_piece_date = new Date(module.time_shift.cur_media_item.live_date);
            }
        }
    } catch (e) {
        _debug(e);
    }

    this.disable_pause();
    //this.info.dom_obj.hide();
    //this.info.on = false;
    if (!do_not_hide_info) {
        this.hide_info();
    }

    this.pos_step = 10;
    this.diff_pos = 0;
    this.next_step = 0;
};

player.prototype.move_pos = function (dir) {
    _debug('player.move_pos', dir);

    _debug('this.info.on', this.info.on);
    _debug('this.is_tv', this.is_tv);

    this.reset_pos_by_numbers();

    /*if (this.is_tv){
        return;
    }*/

    if (this.is_tv && this.prev_layer.on) {
        return;
    }

    if (this.is_tv && (!module.time_shift || !parseInt(this.cur_media_item.enable_tv_archive, 10)) && (!module.time_shift_local || !module.time_shift_local.enabled || !parseInt(this.cur_media_item.allow_local_timeshift, 10) || (this.cur_media_item.cmd.indexOf('rtp ') == -1 && this.cur_media_item.cmd.indexOf('ffrt ') == -1))
    ) {
        return;
    }

    if (this.is_tv && parseInt(this.cur_media_item.enable_tv_archive, 10) && module.time_shift && !this.prev_layer.on) {

        if (dir > 0) {
            return;
        }

        module.time_shift.set_media_item(this.cur_tv_item);
        module.time_shift.get_link_for_channel();
        this.is_tv = false;
        this.active_time_shift = true;
        this.cur_pos_time = module.time_shift.get_pos_time();
        this.cur_media_length = module.time_shift.get_cur_media_length();
        _debug('this.cur_media_length', this.cur_media_length);
        _debug('this.cur_pos_time', this.cur_pos_time);
    } else if (this.is_tv && parseInt(this.cur_media_item.allow_local_timeshift, 10) && module.time_shift_local && module.time_shift_local.enabled && !this.prev_layer.on) {

        module.time_shift_local.enable_mode();

        this.is_tv = false;
        this.active_local_time_shift = true;
        this.cur_pos_time = stb.GetPosTime();
        this.cur_media_length = stb.GetMediaLen();
    }

    if (!this.info.on) {
        this.show_info();
    }

    window.clearTimeout(this.info.hide_timeout);

    var self = this;

    this.info.hide_timeout = window.setTimeout(function () {
        self.set_pos_and_play();
    }, 4000);

    if (!this.pause.on) {

        if (module.tv_archive && this.cur_media_item.mark_archive) {
            window.clearTimeout(this.archive_continue_dialog_to);
        }

        try {
            stb.Pause();
        } catch (e) {
            _debug(e);
        }
        this.pause.on = true;
    }

    if (!this.info.on) {
        this.show_info();
    }

    var media_len = stb.GetMediaLen();

    _debug('media_len', media_len);
    _debug('this.last_state', this.last_state);
    _debug('this.active_time_shift', this.active_time_shift);

    if ((media_len <= 0 || this.last_state != 4) && !this.active_time_shift) {
        return;
    }

    if (this.prev_move_pos_dir != dir) {
        this.pos_step = 10;
        this.next_step = 0;
    } else {
        if (this.active_time_shift) {
            if (this.pos_step >= 3600) {
                this.pos_step = 3600;
                this.next_step = 0;
            } else {

                _debug('this.pos_step 1', this.pos_step);

                if (this.pos_step == 10) {
                    this.pos_step = 30;
                } else {
                    this.pos_step = this.pos_step * 2;
                }
                //this.pos_step = this.pos_step * 2;
                this.next_step = 0;
            }
        }
    }

    _debug('this.pos_step', this.pos_step);

    this.prev_move_pos_dir = dir;

    _debug('this.next_step', this.next_step);

    if ((this.diff_pos + this.next_step + this.cur_pos_time) > this.cur_media_length) {
        this.diff_pos = this.cur_media_length - this.cur_pos_time;
    } else if ((this.diff_pos + this.next_step + this.cur_pos_time) < 0) {
        this.diff_pos = -this.cur_pos_time;
    } else {
        this.next_step += this.pos_step;
    }

    if (dir > 0) {
        this.diff_pos += this.next_step;
    } else {
        this.diff_pos -= this.next_step;
    }

    _debug('this.diff_pos', this.diff_pos);

    var new_pos_time = this.cur_pos_time + this.diff_pos;

    _debug('new_pos_time', new_pos_time);

    try {
        this.set_pos_button(new_pos_time);
    } catch (e) {
        _debug(e);
    }
};

player.prototype.update_current_time = function (cur_time, strict) {
    _debug('player.update_current_time', cur_time);

    //this.info.pos_time.innerHTML = this.sec_to_human_time(cur_time) + '/' + this.sec_to_human_time(this.cur_media_length);
    //this.info.cur_pos_time.innerHTML   = this.sec_to_human_time(cur_time);
    if (strict) {
        this.info.cur_pos_time.innerHTML = this.sec_to_human_time(cur_time);
    } else {
        this.info.cur_pos_time.innerHTML = this.pos_format_str(cur_time);
    }
    this.info.total_pos_time.innerHTML = this.sec_to_human_time(this.cur_media_length);
};

player.prototype.sec_to_human_time = function (seconds) {
    var hh = Math.floor(seconds / 3600);
    var mm = Math.floor((seconds - 3600 * hh) / 60);
    var ss = seconds - hh * 3600 - mm * 60;

    if (hh < 10) {
        hh = '0' + hh;
    }

    if (mm < 10) {
        mm = '0' + mm;
    }

    if (ss < 10) {
        ss = '0' + ss;
    }

    return hh + ':' + mm + ':' + ss;
};

player.prototype.pos_format_str = function (number) {

    number = '' + number;

    var zeros = 6 - number.length;

    var zeros_str = '';

    for (var i = 0; i < zeros; i++) {
        zeros_str += '0';
    }

    number = zeros_str + number;

    return number.substr(0, 2) + ':' + number.substr(2, 2) + ':' + number.substr(4, 2);
};

player.prototype.number_to_sec = function (number) {

    var hh = 0;
    var mm = 0;
    var ss = 0;

    number = '' + number;

    if (number.length > 4) {
        hh = number.substr(0, number.length - 4);
        number = number.substring(number.length - 4);
        hh = parseInt(hh, 10);
        if (hh > 99) {
            hh = 99;
        }
    }

    if (number.length > 2) {
        mm = number.substr(0, number.length - 2);
        number = number.substring(number.length - 2);
        mm = parseInt(mm, 10);
        if (mm > 59) {
            mm = 59;
            ss = 59;
        }
    }

    if (number.length > 0 && !ss) {
        ss = parseInt(number, 10);
        if (ss > 59) {
            ss = 59;
        }
    }

    return hh * 3600 + mm * 60 + ss;
};

player.prototype.human_time_to_sec = function (time) {
    _debug('player.human_time_to_sec', time);

    if (!time) {
        return 0;
    }

    return time.toString().split('').reverse().reduce(function (prev, cur, i, arr) {

        cur = parseInt(cur, 10);

        if ((i % 2)) {
            cur = cur * 10
        }

        cur = cur * Math.pow(60, Math.floor(i / 2));

        return parseInt(prev, 10) + cur;
    })
};

player.prototype.init_quick_ch_switch = function () {
    _debug('player.init_quick_ch_switch');

    this.quick_ch_switch.dom_obj = create_block_element('quick_ch_switch');

    this.quick_ch_switch.input = create_block_element('quick_ch_input', this.quick_ch_switch.dom_obj);

    this.quick_ch_switch.dom_obj.hide();
};

player.prototype.show_quick_ch_switch = function (num) {
    _debug('player.show_quick_ch_switch');

    if (!this.is_tv) {
        return;
    }

    if (!this.quick_ch_switch.on) {
        this.quick_ch_switch.dom_obj.show();
        this.quick_ch_switch.on = true;
    }

    if (this.quick_ch_switch.input.innerHTML.length < 5) {
        if (this.quick_ch_switch.input.innerHTML.length == 0 && num == 0) {

        } else {
            this.quick_ch_switch.input.innerHTML = this.quick_ch_switch.input.innerHTML + '' + num;
        }
    }

    this.t_hide_quick_ch_switch();
};

player.prototype.quick_go_to_ch = function () {
    _debug('player.quick_go_to_ch');

    var ch_num = parseInt(this.quick_ch_switch.input.innerHTML);

    _debug('ch_num', ch_num);

    var item = {};

    _debug('stb.profile[hide_tv_genres_in_fullscreen]', stb.profile['hide_tv_genres_in_fullscreen']);

    if (stb.user.fav_itv_on) {

        this.f_ch_idx = this.fav_channels.getIdxByVal('number', ch_num);

        _debug('this.f_ch_idx', this.f_ch_idx);

        if (this.f_ch_idx >= 0) {

        } else {
            this.f_ch_idx = 0;
        }

        item = this.fav_channels[this.f_ch_idx];

        if (stb.profile['hide_tv_genres_in_fullscreen'] && module.tv.genre && module.tv.genre.id != stb.profile['hide_tv_genres_in_fullscreen'][0] && item.tv_genre_id == stb.profile['hide_tv_genres_in_fullscreen'][0]) {
            _debug('reset item');
            item = null;
        }

        _debug('item', item);

    } else {

        this.ch_idx = this.channels.getIdxByVal('number', ch_num);

        _debug('this.ch_idx', this.ch_idx);

        if (this.ch_idx >= 0) {

        } else {
            this.ch_idx = 0;
        }

        item = this.channels[this.ch_idx];


        if (stb.profile['hide_tv_genres_in_fullscreen'] && module.tv.genre && module.tv.genre.id != stb.profile['hide_tv_genres_in_fullscreen'][0] && item && item.tv_genre_id == stb.profile['hide_tv_genres_in_fullscreen'][0]) {
            _debug('reset item');
            item = null;
        }

        _debug('item', item);
    }

    if (!empty(item)) {
        stb.player.need_show_info = 1;
        stb.player.play(item);
    }
};

player.prototype.del_quick_go_ch = function () {
    _debug('player.del_quick_go_ch');

    if (!this.quick_ch_switch.on) {
        return;
    }

    this.t_hide_quick_ch_switch();

    this.quick_ch_switch.input.innerHTML = this.quick_ch_switch.input.innerHTML.substr(0, this.quick_ch_switch.input.innerHTML.length - 1);

    //this.quick_ch_switch.input.innerHTML = ch_num;
};

player.prototype.t_hide_quick_ch_switch = function () {
    _debug('player.t_hide_quick_ch_switch');

    window.clearTimeout(this.quick_ch_switch.hide_timer);

    var self = this;

    this.quick_ch_switch.hide_timer = window.setTimeout(function () {

        self.hide_quick_ch_switch();

    }, this.quick_ch_switch.hide_to);
};

player.prototype.hide_quick_ch_switch = function () {
    _debug('player.hide_quick_ch_switch');

    if (!this.quick_ch_switch.on) {
        return;
    }

    this.quick_go_to_ch();

    this.quick_ch_switch.dom_obj.hide();
    this.quick_ch_switch.on = false;

    this.quick_ch_switch.input.innerHTML = '';
};

player.prototype.cancel_quick_ch_switch = function () {
    _debug('player.cancel_quick_ch_switch');

    window.clearTimeout(this.quick_ch_switch.hide_timer);

    this.quick_ch_switch.dom_obj.hide();
    this.quick_ch_switch.on = false;

    this.quick_ch_switch.input.innerHTML = '';
};

player.prototype.change_aspect = function () {
    _debug('player.change_aspect');

    if (module.tv && module.tv.on && module.tv.cur_view == 'short') {
        return;
    }

    if (!this.aspect_info_container.isHidden()) {
        if (stb.aspect_idx < stb.aspect_array.length - 1) {
            stb.aspect_idx++;
        } else {
            stb.aspect_idx = 0;
        }
    }

    _debug('set aspect', stb.aspect_array[stb.aspect_idx].alias);

    this.show_aspect_info(get_word('aspect_' + stb.aspect_array[stb.aspect_idx].alias).toUpperCase());

    stb.SetAspect(stb.aspect_array[stb.aspect_idx].mode);

    stb.load(
        {
            "type": "stb",
            "action": "set_aspect",
            "aspect": stb.aspect_array[stb.aspect_idx].mode
        },

        function (result) {

        },

        this
    )
};

player.prototype.change_tv_channel_aspect = function () {
    _debug('player.change_tv_channel_aspect');

    if (module.tv && module.tv.on && module.tv.cur_view == 'short') {
        return;
    }

    _debug('this.ch_aspect[this.cur_media_item.id]', this.ch_aspect[this.cur_media_item.id]);

    if (this.ch_aspect[this.cur_media_item.id] === undefined) {
        this.ch_aspect[this.cur_media_item.id] = stb.aspect_array[this.ch_aspect_idx].mode;
    }

    if (!this.aspect_info_container.isHidden()) {
        if (this.ch_aspect_idx < stb.aspect_array.length - 1) {
            this.ch_aspect_idx++;
        } else {
            this.ch_aspect_idx = 0;
        }
    }

    this.ch_aspect[this.cur_media_item.id] = stb.aspect_array[this.ch_aspect_idx].mode;

    _debug('set aspect', stb.aspect_array[this.ch_aspect_idx].alias);

    this.show_aspect_info(get_word('aspect_' + stb.aspect_array[this.ch_aspect_idx].alias).toUpperCase());

    stb.SetAspect(stb.aspect_array[this.ch_aspect_idx].mode);

    stb.load(
        {
            "type": "stb",
            "action": "set_aspect",
            "aspect": stb.aspect_array[this.ch_aspect_idx].mode,
            "ch_id": this.is_tv ? this.cur_media_item.id : 0
        },

        function (result) {

        },

        this
    )
};

player.prototype.init_aspect_info = function () {
    _debug('player.init_aspect_info');

    this.aspect_info_container = create_block_element('aspect_info_container');
    this.aspect_info_txt = create_block_element('aspect_block', this.aspect_info_container);

    create_block_element('aspect_block_right', this.aspect_info_container);

    this.aspect_info_container.hide();
};

player.prototype.show_aspect_info = function (text) {
    _debug('player.show_aspect_info');

    window.clearTimeout(this.aspect_info_timer);

    this.aspect_info_txt.innerHTML = text;
    this.aspect_info_container.show();

    var self = this;

    this.aspect_info_timer = window.setTimeout(function () {
        self.aspect_info_container.hide();
    }, 3000);
};

player.prototype.hist_back = function () {

    this.need_show_info = 1;

    var item;

    if (stb.user.fav_itv_on) {
        item = this.hist_f_ch_idx[0];
    } else {
        item = this.hist_ch_idx[0];
    }

    if (!empty(item)) {
        this.play(item);
    }
};

player.prototype.get_pids = function () {
    _debug('player.get_pids');

    try {
        this.audio_pid.get_all();

        _debug('test');
        _debug('typeof this.subtitle_pid', typeof (this.subtitle_pid));
        _debug('typeof this.subtitle_pid.get_all', typeof (this.subtitle_pid.get_all));

        this.subtitle_pid.get_all();

        this.build_con_menu();
    } catch (e) {
        _debug(e);
    }
};

player.prototype.set_media_aspect = function () {
    _debug('player.set_media_aspect');

    _debug('this.cur_media_item.mark_archive', this.cur_media_item.mark_archive);
    _debug('this.active_time_shift', this.active_time_shift);
    _debug('this.active_local_time_shift', this.active_local_time_shift);

    if (this.is_tv || module.tv_archive && this.cur_media_item.mark_archive || this.active_time_shift || this.active_local_time_shift) {

        var ch_id = this.is_tv || this.active_time_shift || this.active_local_time_shift ? this.cur_media_item.id : this.cur_media_item.ch_id;

        _debug('ch_id', ch_id);

        _debug('this.ch_aspect[ch_id]', this.ch_aspect[ch_id]);

        if (this.ch_aspect[ch_id] !== undefined) {

            try {
                stb.SetAspect(parseInt(this.ch_aspect[ch_id], 10));
            } catch (e) {
                _debug(e);
            }

            this.ch_aspect_idx = stb.aspect_array.getIdxByVal('mode', this.ch_aspect[ch_id]);

            _debug('aspect_alias', stb.aspect_array[this.ch_aspect_idx].alias);
        } else {

            _debug('this.profile[tv_channel_default_aspect]', stb.profile['tv_channel_default_aspect']);

            var cur_aspect = stb.profile['tv_channel_default_aspect'];

            this.ch_aspect_idx = stb.aspect_array.getIdxByVal('mode', cur_aspect);

            _debug('aspect_alias', stb.aspect_array[this.ch_aspect_idx].alias);

            try {
                stb.SetAspect(cur_aspect);
            } catch (e) {
                _debug(e);
            }
        }

        _debug('this.ch_aspect_idx', this.ch_aspect_idx);
    } else {
        _debug('aspect_alias', stb.aspect_array[stb.aspect_idx].alias);
        try {
            stb.SetAspect(stb.aspect_array[stb.aspect_idx].mode);
        } catch (e) {
            _debug(e);
        }
    }
};

player.prototype.audio_pid = {

    all_pids: [],
    cur_pid: 0,
    cur_pid_idx: 0,

    get_all: function () {
        _debug('audio_pid.get_all');

        if (stb.GetAudioPIDsEx) {
            var audio_pids = stb.GetAudioPIDsEx();
        } else {
            audio_pids = stb.GetAudioPIDs();
        }

        _debug('audio_pids str', audio_pids);

        audio_pids = eval('(' + audio_pids + ')');

        _debug('audio_pids obj', audio_pids);

        this.cur_pid = stb.GetAudioPID();

        _debug('cur_pid', this.cur_pid);

        this.cur_pid_idx = audio_pids.getIdxByVal('pid', this.cur_pid);

        if (this.cur_pid_idx !== null) {
            audio_pids[this.cur_pid_idx].selected = true;
        }

        this.all_pids = audio_pids;
    },

    set: function (pid) {
        _debug('audio_pid.set', pid);

        this.all_pids[this.cur_pid_idx].selected = false;
        this.cur_pid = pid;
        this.cur_pid_idx = this.all_pids.getIdxByVal('pid', this.cur_pid);

        stb.SetAudioPID(pid);

        _debug('stb.player.is_tv', stb.player.is_tv);

        if (stb.player.is_tv) {

            stb.player.cur_media_item.atrack = pid;

            var idx = stb.player.channels.getIdxByVal('id', stb.player.cur_media_item.id);

            _debug('channels idx', idx);

            if (idx !== null) {
                stb.player.channels[idx].atrack = pid;
            }

            idx = stb.player.fav_channels.getIdxByVal('id', stb.player.cur_media_item.id);

            _debug('fav_channel idx', idx);

            if (idx !== null) {
                stb.player.fav_channels[idx].atrack = pid;
            }

            idx = module.tv.data_items.getIdxByVal('id', stb.player.cur_media_item.id);

            _debug('data_items idx', idx);

            if (idx !== null) {
                module.tv.data_items[idx].atrack = pid;
            }
        }
    },

    get_for_menu: function () {
        _debug('audio_pid.get_for_menu');

        var lang;
        var title;
        var map = [];

        for (var i = 0; i < this.all_pids.length; i++) {

            if (this.all_pids[i].lang.length > 1 && this.all_pids[i].lang[1] != '') {
                lang = ' - ' + this.all_pids[i].lang[1];
            } else if (this.all_pids[i].lang[0] != '') {
                lang = ' - ' + this.all_pids[i].lang[0];
            } else {
                lang = '';
            }

            title = get_word('player_track') + ' ' + (i + 1) + lang + (this.all_pids[i].hasOwnProperty('type') && stb.player.atrack_types.hasOwnProperty(this.all_pids[i].type) ? ' [' + stb.player.atrack_types[this.all_pids[i].type] + ']' : '');

            map.push({
                "title": title, "cmd": (function (pid) {
                    return function () {
                        stb.player.audio_pid.set(pid)
                    }
                })(this.all_pids[i].pid), "active": !!this.all_pids[i].selected
            });
        }

        _debug('map', map);

        return map;
    }
};

player.prototype.subtitle_pid = {

    all_pids: [],
    cur_pid: 0,
    cur_pid_idx: 0,
    enabled: false,

    enable: function () {
        _debug('subtitle_pid.enable');
        stb.SetSubtitles(true);
        this.enabled = true;
    },

    disable: function () {
        _debug('subtitle_pid.disable');
        stb.SetSubtitles(false);
        this.enabled = false;
    },

    get_all: function () {
        _debug('subtitle_pid.get_all');

        _debug('stb.profile[always_enabled_subtitles]', stb.profile['always_enabled_subtitles']);

        if (stb.profile['always_enabled_subtitles'] || stb.player.cur_media_item.cmd.indexOf(' strack:') != -1) {
            this.enable();
        } else {
            this.disable();
        }

        var subtitle_pids = stb.GetSubtitlePIDs();

        _debug('subtitle_pids str', subtitle_pids);

        subtitle_pids = eval('(' + subtitle_pids + ')');

        this.cur_pid = stb.GetSubtitlePID();

        _debug('cur_pid', this.cur_pid);

        this.cur_pid_idx = subtitle_pids.getIdxByVal('pid', this.cur_pid);

        _debug('this.cur_pid_idx', this.cur_pid_idx);

        if (this.cur_pid_idx !== null && this.enabled) {
            subtitle_pids[this.cur_pid_idx].selected = true;
        }

        if (stb.player.cur_media_item.hasOwnProperty('subtitles')) {
            subtitle_pids = subtitle_pids.concat(stb.player.cur_media_item.subtitles)
        }

        _debug('subtitle_pids', subtitle_pids);

        this.all_pids = subtitle_pids;

        _debug('stb.user[pri_subtitle_lang]', stb.user['pri_subtitle_lang']);
        _debug('stb.user[sec_subtitle_lang]', stb.user['sec_subtitle_lang']);

        if (stb.profile['always_enabled_subtitles'] && (stb.user['pri_subtitle_lang'] || stb.user['sec_subtitle_lang'])) {
            var picked_subs = this.all_pids.filter(function (item) {
                return item.hasOwnProperty('lang')
                    && Array.isArray(item.lang)
                    && (
                        stb.user['pri_subtitle_lang'] && item.lang.indexOf(stb.user['pri_subtitle_lang']) != -1
                        || stb.user['sec_subtitle_lang'] && item.lang.indexOf(stb.user['sec_subtitle_lang']) != -1
                        || stb.user['pri_subtitle_lang'] && item.lang.indexOf(stb.user['pri_subtitle_lang'].slice(0, 2)) != -1
                        || stb.user['sec_subtitle_lang'] && item.lang.indexOf(stb.user['sec_subtitle_lang'].slice(0, 2)) != -1
                    )
            });

            _debug('picked_subs', picked_subs);

            var picked_embedded_subs = picked_subs.filter(function (item) {
                return !item.hasOwnProperty('file');
            });

            var all_embedded_subs = this.all_pids.filter(function (item) {
                return !item.hasOwnProperty('file');
            });

            _debug('picked_embedded_subs', picked_embedded_subs);

            var picked_subtitle = null;

            if (picked_subs.length > 0 && picked_embedded_subs.length == 0) {
                picked_subtitle = picked_subs[0];
            } else if (all_embedded_subs.length == 0 && this.all_pids.length > 0) {
                picked_subtitle = this.all_pids[0];
            }

            _debug('picked_subtitle', picked_subtitle);

            if (picked_subtitle) {

                this._set_current_pid(picked_subtitle.pid);

                if (picked_subtitle.hasOwnProperty('file')) {
                    stb.SetSubtitlesEncoding('utf-8'); // UTF as default
                    stb.LoadExternalSubtitles(picked_subtitle.file);
                }
            }
        }
    },

    _set_current_pid: function (pid) {
        _debug('subtitle_pid._set_current_pid', pid);

        this.enable();

        this.cur_pid_idx = this.all_pids.getIdxByVal('pid', pid);

        _debug('this.cur_pid_idx', this.cur_pid_idx);
        _debug('this.all_pids', this.all_pids);

        this.all_pids[this.cur_pid_idx].selected = true;
        this.cur_pid = pid;
        this.cur_pid_idx = this.all_pids.getIdxByVal('pid', this.cur_pid);
    },

    set: function (pid) {
        _debug('subtitle_pid.set', pid);

        var cur_pid_idx = this.all_pids.getIdxByVal('pid', pid);

        if (this.all_pids[cur_pid_idx].hasOwnProperty('file')) {

            var self = this;

            stb.player.init_subtitle_encoding_select();

            stb.player.subtitle_encoding_select.on_confirm = function (encoding) {
                _debug('on_confirm', encoding);
                self._set_current_pid(pid);
                stb.SetSubtitlesEncoding(encoding);
                stb.LoadExternalSubtitles(self.all_pids[cur_pid_idx].file);
            };

            stb.player.subtitle_encoding_select.show();

        } else {
            this._set_current_pid(pid);
            stb.SetSubtitlePID(pid);
        }
    },

    get_for_menu: function () {
        _debug('subtitle_pid.get_for_menu');

        var lang;
        var title;
        var map = [];

        var sub_off = this.all_pids.some(function (pid_obj) {
            return pid_obj.selected;
        });

        _debug('sub_off', sub_off);

        var self = this;

        map.push({
            'title': get_word('player_off'), 'cmd': function () {
                self.disable()
            }, 'active': !sub_off
        });

        for (var i = 0; i < this.all_pids.length; i++) {

            if (this.all_pids[i].lang.length > 1 && this.all_pids[i].lang[1] != '') {
                lang = ' - ' + this.all_pids[i].lang[1];
            } else if (this.all_pids[i].lang[0] != '') {
                lang = ' - ' + this.all_pids[i].lang[0];
            } else {
                lang = '';
            }

            title = get_word('player_subtitle') + ' ' + (i + 1) + lang;

            map.push({
                'title': title, 'cmd': (function (pid) {
                    return function () {
                        stb.player.subtitle_pid.set(pid)
                    }
                })(this.all_pids[i].pid), 'active': this.all_pids[i].selected
            });
        }

        return map;
    }
};

player.prototype.init_con_menu = function () {
    _debug('player.init_con_menu');

    if (!this.con_menu) {
        this.con_menu = new context_menu();
        this.con_menu.bind();
        this.con_menu.set_x_offset(100);
        this.con_menu.set_y_offset(100);
    }

    var claim_cmd = [
        {
            "cmd": function () {
                stb.player.send_claim('sound')
            },
            "title": get_word('player_on_sound')
        },
        {
            "cmd": function () {
                stb.player.send_claim('video')
            },
            "title": get_word('player_on_video')
        }
    ];

    if (this.is_tv) {
        claim_cmd = claim_cmd.concat(
            [
                {
                    "cmd": function () {
                        stb.player.send_claim('no_epg')
                    },
                    "title": get_word('no epg')
                }
                ,
                {
                    "cmd": function () {
                        stb.player.send_claim('wrong_epg')
                    },
                    "title": get_word('wrong epg')
                }
            ]
        )
    }

    var map = [
        {
            "title": get_word('player_claim'),
            "cmd": claim_cmd
        }
    ];

    var ClockMap = {
        "title": get_word('videoClockTitle'),
        "cmd": [
            {
                "cmd": function () {
                    stb.player.ClockOnVideo.changeType('Off');
                },
                "title": get_word('videoClock_off'),
                "active": (stb.user.video_clock == 'Off')
            },
            {
                "cmd": function () {
                    stb.player.ClockOnVideo.changeType('upRight');
                },
                "title": get_word('videoClock_upRight'),
                "active": (stb.user.video_clock == 'upRight')
            },
            {
                "cmd": function () {
                    stb.player.ClockOnVideo.changeType('upLeft');
                },
                "title": get_word('videoClock_upLeft'),
                "active": (stb.user.video_clock == 'upLeft')
            },
            {
                "cmd": function () {
                    stb.player.ClockOnVideo.changeType('downRight');
                },
                "title": get_word('videoClock_downRight'),
                "active": (stb.user.video_clock == 'downRight')
            },
            {
                "cmd": function () {
                    stb.player.ClockOnVideo.changeType('downLeft');
                },
                "title": get_word('videoClock_downLeft'),
                "active": (stb.user.video_clock == 'downLeft')
            }

        ],
        "type": 'switch'
    };
    map = map.concat(ClockMap);


    this.con_menu.construct(map);
};

player.prototype.build_con_menu = function () {
    _debug('player.build_con_menu');

    if (this.con_menu.map.length > 2) {
        this.con_menu.map.splice(0, this.con_menu.map.length - 2);
    }

    if (stb && stb.Set3DConversionMode) {
        var mode = stb.Get3DConversionMode ? stb.Get3DConversionMode() : 0;
        this.con_menu.map.unshift(
            {
                "title": get_word('3D mode'),
                "type": "switch",
                "cmd": [
                    {
                        "title": get_word('mode {0}').format(1), "cmd": function () {
                            _debug('mode 1');
                            stb.Set3DConversionMode(0)
                        }, active: (mode == 0)
                    },
                    {
                        "title": get_word('mode {0}').format(2), "cmd": function () {
                            _debug('mode 2');
                            stb.Set3DConversionMode(1)
                        }, active: (mode == 1)
                    },
                    {
                        "title": get_word('mode {0}').format(3), "cmd": function () {
                            _debug('mode 3');
                            stb.Set3DConversionMode(2)
                        }, active: (mode == 2)
                    },
                    {
                        "title": get_word('mode {0}').format(4), "cmd": function () {
                            _debug('mode 4');
                            stb.Set3DConversionMode(3)
                        }, active: (mode == 3)
                    }
                ]
            }
        );
    }

    this.con_menu.map.unshift(
        {
            "title": get_word('player_subtitle'),
            "type": "switch",
            "cmd": this.subtitle_pid.get_for_menu()
        }
    );

    this.con_menu.map.unshift(
        {
            "title": get_word('player_audio'),
            "type": "switch",
            "cmd": this.audio_pid.get_for_menu()
        }
    );

    _debug('this.con_menu.map', this.con_menu.map);

    if (this.con_menu.on) {
        this.con_menu.hide();

        this.con_menu.construct(this.con_menu.map);
        this.con_menu.show();
    } else {

        this.con_menu.construct(this.con_menu.map);
    }
};

player.prototype.send_claim = function (type) {
    _debug('player.send_claim', type);

    if (this.is_tv) {
        this.itv_claim(type);
    } else if (stb.cur_place == 'vclub') {
        this.video_claim(type);
    } else if (stb.cur_place == 'karaoke') {
        this.karaoke_claim(type);
    }

    stb.notice.show(get_word('player_ty'));
};

player.prototype.video_claim = function (type) {
    _debug('player.video_claim', type);

    stb.load(
        {
            "type": "vod",
            "action": "set_claim",
            "id": this.cur_media_item.video_id || this.cur_media_item.id,
            "real_type": type
        },
        function (result) {

        }
    );
};

player.prototype.itv_claim = function (type) {
    _debug('player.itv_claim', type);

    stb.load(
        {
            "type": "itv",
            "action": "set_claim",
            "id": this.cur_media_item.id,
            "real_type": type
        },
        function (result) {

        }
    );
};

player.prototype.karaoke_claim = function (type) {
    _debug('player.karaoke_claim', type);

    stb.load(
        {
            "type": "karaoke",
            "action": "set_claim",
            "id": this.cur_media_item.id,
            "real_type": type
        },
        function (result) {

        }
    );
};

player.prototype.set_fav_status = function () {
    _debug('player.save_fav_status');

    stb.load(
        {
            "type": "itv",
            "action": "set_fav_status",
            "fav_itv_on": stb.user.fav_itv_on
        },
        function (result) {

        }
    );
};

var playback_limit = {

    start_counting: function () {
        _debug('playback_limit.start_counting');

        _debug('stb.user[playback_limit]', stb.user['playback_limit']);

        if (!stb.user['playback_limit']) {
            _debug('playback_limit not set');
            return;
        }

        window.clearTimeout(this.timer);

        var self = this;

        this.timer = window.setTimeout(function () {

            self.show_message.call(self);

        }, stb.user['playback_limit'] * 3600000);

    },

    show_message: function () {
        _debug('playback_limit.show_message');

        if (!stb.player.on) {
            return;
        }

        var self = this;

        this.stop_timer = window.setTimeout(function () {
            stb.msg.callback = function () {
            };
            stb.msg.hide();
            keydown_observer.emulate_key(key.MENU);
        }, 30000);

        stb.msg.push(
            {
                "msg": get_word('playback_limit_reached'),
                "callback": function () {
                    _debug('clear stop_timer');
                    window.clearTimeout(self.stop_timer);
                    playback_limit.start_counting();
                }
            });
    },

    reset: function () {
        _debug('playback_limit.reset');

        window.clearTimeout(this.timer);
    }
};

player.prototype.progress_bar = {

    load: 0,

    init: function () {
        _debug('progressBar.init');

        this.dom_obj = create_block_element('playback_progress_block');
        this.progress = create_block_element('playback_progress', this.dom_obj);
        this.dom_obj.hide();
    },

    start: function () {
        _debug('progressBar.start');

        this.dom_obj.show();

        var self = this;

        window.clearInterval(this.update_timer);
        window.clearTimeout(this.stop_timer);
        window.clearTimeout(this.hide_timeout);

        this.update_timer = window.setInterval(function () {
            self.update();
        }, 300);
    },

    update: function (load) {
        _debug('progressBar.update', load);

        if (!load) {
            load = stb.GetBufferLoad();
        }

        _debug('load 1', load);

        if (this.load > load) {
            load = 100;
        }

        _debug('load 2', load);

        this.set_progress(load);

        if (load == 100) {
            //var self = this;
            window.clearTimeout(this.stop_timer);
            window.clearInterval(this.update_timer);
            //this.stop_timer = window.setTimeout(function(){self.stop()}, 300);
            this.stop();
        }
    },

    set_progress: function (load) {
        _debug('set_progress', load);

        this.load = load;

        var max = this.dom_obj.offsetWidth - 4;

        var width = max / 100 * load;

        this.progress.style.width = width + 'px';
    },

    stop: function () {
        _debug('progressBar.stop');

        //this.dom_obj.hide();

        this.set_progress(100);
        var self = this;
        window.clearTimeout(this.hide_timeout);
        this.hide_timeout = window.setTimeout(function () {
            self.dom_obj.hide();
            self.progress.style.width = 0;
        }, 300);

        window.clearInterval(this.update_timer);
        this.load = 0;
        //this.progress.style.width = 0;
    }
};

//Clock On Video by Agnitumus
player.prototype.ClockOnVideo = {
    "on": false,
    "position": "Off",

    changeType: function (value, do_not_save) {

        if (!do_not_save) {
            this.position = value;
        }

        this.dom_obj.removeClass('onVideo' + stb.user.video_clock);

        stb.user.video_clock = value;

        _debug('player.change_ClockOnVideoType');
        _debug('set clock Type', stb.user.video_clock);

        if (!do_not_save) {
            stb.load(
                {
                    "type": "stb",
                    "action": "set_clock_on_video",
                    "clockType": stb.user.video_clock
                },

                function (result) {

                },

                this
            );
        }

        this.dom_obj.addClass('onVideo' + value);
        this.Refresh();
    },
    Refresh: function () {

        if (stb.user.video_clock == 'Off') {
            this.dom_obj.hide();
            this.on = false;
        } else {
            this.on = true;
            this.dom_obj.show();
        }
        stb.clock.show();
    },
    init: function () {
        _debug('player.init_ClockOnVideo');

        this.dom_obj = document.createElement('div');
        this.dom_obj.className = 'osd_clock_block';
        document.body.insertBefore(this.dom_obj, document.querySelector('.loader'));

        _debug('stb.user.video_clock', stb.user.video_clock);

        this.position = stb.user.video_clock = stb.user.video_clock || 'Off';

        this.osd_clock = create_block_element('osd_clock', this.dom_obj);
        this.dom_obj.addClass('onVideo' + stb.user.video_clock);
        this.Refresh();

        var self = this;

        stb.clock.addCustomEventListener("tick", function (date) {
            if (self.on && stb.player.on) {
                self.osd_clock.innerHTML = get_word('time_format').format(date.hours, date.minutes, date.ap_hours, date.ap_mark);
            }
        });
    },
    toggle: function () {
        _debug('ClockOnVideo.toggle');

        if (this.on) {
            this.changeType('Off', true);
        } else {
            if (this.position == 'Off') {
                this.position = 'upRight';
            }
            this.changeType(this.position, true);
        }
    }
};
//END Clock On Video


/*
 * END Player
 */