/*
* ContextMenu Plugin
* 
*
*/

(function ($) {

    $.extend(mejs.MepDefaults,
        {
            'contextMenuItems': [
                // demo of a fullscreen option
                {
                    render: function (player) {

                        // check for fullscreen plugin
                        if (typeof player.enterFullScreen == 'undefined')
                            return null;

                        if (player.isFullScreen) {
                            return mejs.i18n.t('Turn off Fullscreen');
                        } else {
                            return mejs.i18n.t('Go Fullscreen');
                        }
                    },
                    click: function (player) {
                        if (player.isFullScreen) {
                            player.exitFullScreen();
                        } else {
                            player.enterFullScreen();
                        }
                    }
                }
                ,
                // demo of a mute/unmute button
                {
                    render: function (player) {
                        if (player.media.muted) {
                            return mejs.i18n.t('Unmute');
                        } else {
                            return mejs.i18n.t('Mute');
                        }
                    },
                    click: function (player) {
                        if (player.media.muted) {
                            player.setMuted(false);
                        } else {
                            player.setMuted(true);
                        }
                    }
                },
                // separator
                {
                    isSeparator: true
                }
                ,
                // demo of simple download video
                {
                    render: function (player) {
                        return mejs.i18n.t('Download Video');
                    },
                    click: function (player) {
                        window.location.href = player.media.currentSrc;
                    }
                }
            ]
        }
    );


    $.extend(MediaElementPlayer.prototype, {
        buildcontextmenu: function (player, controls, layers, media) {

            // create context menu
            player.contextMenu = $('<div class="mejs-contextmenu"></div>')
                .appendTo($('body'))
                .hide();

            // create events for showing context menu
            player.container.bind('contextmenu', function (e) {
                if (player.isContextMenuEnabled) {
                    e.preventDefault();
                    player.renderContextMenu(e.clientX - 1, e.clientY - 1);
                    return false;
                }
            });
            player.container.bind('click', function () {
                player.contextMenu.hide();
            });
            player.contextMenu.bind('mouseleave', function () {

                //console.log('context hover out');
                player.startContextMenuTimer();

            });
        },

        cleancontextmenu: function (player) {
            player.contextMenu.remove();
        },

        isContextMenuEnabled: true,
        enableContextMenu: function () {
            this.isContextMenuEnabled = true;
        },
        disableContextMenu: function () {
            this.isContextMenuEnabled = false;
        },

        contextMenuTimeout: null,
        startContextMenuTimer: function () {
            //console.log('startContextMenuTimer');

            var t = this;

            t.killContextMenuTimer();

            t.contextMenuTimer = setTimeout(function () {
                t.hideContextMenu();
                t.killContextMenuTimer();
            }, 750);
        },
        killContextMenuTimer: function () {
            var timer = this.contextMenuTimer;

            //console.log('killContextMenuTimer', timer);

            if (timer != null) {
                clearTimeout(timer);
                delete timer;
                timer = null;
            }
        },

        hideContextMenu: function () {
            this.contextMenu.hide();
        },

        renderContextMenu: function (x, y) {

            // alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly
            var t = this,
                html = '',
                items = t.options.contextMenuItems;

            for (var i = 0, il = items.length; i < il; i++) {

                if (items[i].isSeparator) {
                    html += '<div class="mejs-contextmenu-separator"></div>';
                } else {

                    var rendered = items[i].render(t);

                    // render can return null if the item doesn't need to be used at the moment
                    if (rendered != null) {
                        html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random() * 1000000) + '">' + rendered + '</div>';
                    }
                }
            }

            // position and show the context menu
            t.contextMenu
                .empty()
                .append($(html))
                .css({top: y, left: x})
                .show();

            // bind events
            t.contextMenu.find('.mejs-contextmenu-item').each(function () {

                // which one is this?
                var $dom = $(this),
                    itemIndex = parseInt($dom.data('itemindex'), 10),
                    item = t.options.contextMenuItems[itemIndex];

                // bind extra functionality?
                if (typeof item.show != 'undefined')
                    item.show($dom, t);

                // bind click action
                $dom.click(function () {
                    // perform click action
                    if (typeof item.click != 'undefined')
                        item.click(t);

                    // close
                    t.contextMenu.hide();
                });
            });

            // stop the controls from hiding
            setTimeout(function () {
                t.killControlsTimer('rev3');
            }, 100);

        }
    });

})(mejs.$);