<commit_before>/*!
 *
 * Помощьник для работы с конами
 *
 * @date 06.11.2014
 * @copyright skeeks.com
 * @author <NAME> <<EMAIL>>
 */


(function(window, sx, $, _)
{
    sx.createNamespace('classes', sx);

    /**
     *
     * @event beforeOpen
     * @event afterOpen
     * @event close
     * @event error(e, data)
     *
     * @type {void|Function|*}
     */
    sx.classes._Window = sx.classes.Component.extend({

        construct: function (src, name, opts)
        {
            opts = opts || {};
            this._name          = name ? name : "sx-new-window";
            this._src           = src;
            this._openedWindow  = null;

            this.applyParentMethod(sx.classes.Component, 'construct', [opts]); // TODO: make a workaround for magic parent calling
        },

        _init: function()
        {
            this
                .defaultOpts({
                    "left"          : "50",
                    "top"           : "50",
                    "width"         : "90%",
                    "height"        : "70%",
                    "menubar"       : "no", //Если этот параметр установлен в yes, то в новом окне будет меню.
                    "location"      : "yes", //Если этот параметр установлен в yes, то в новом окне будет адресная строка
                    "toolbar"       : "no", //Если этот параметр установлен в yes, то в новом окне будет навигация (кнопки назад, вперед и т.п.) и панель вкладок
                    "scrollbars"    : "yes", //Если этот параметр установлен в yes, то новое окно при необходимости сможет показывать полосы прокрутки
                    "resizable"     : "yes", //Если этот параметр установлен в yes, то пользователь сможет изменить размеры нового окна. Рекомендуется всегда устанавливать этот параметр.
                    "status"        : "yes", //Если этот параметр установлен в yes, то в новом окне будет строка состояния
                    "directories"   : "yes"  //Если этот параметр установлен в yes, то в новом окне будут закладки/избранное
                })
                .normalizeOptions()
            ;
        },

        /**
         *
         * @returns {sx.classes.Window}
         */
        normalizeOptions: function()
        {
            var windowWidth     = window.screen.width;
            var windowHeight    = window.screen.height;

            if (sx.helpers.String.strpos(this.get("width"), "%", 0))
            {
                var newWidth = (Number(sx.helpers.String.str_replace("%", "", this.get("width")))/100) * windowWidth;
                this.set("width", Number(newWidth).toFixed())
            }

            if (sx.helpers.String.strpos(this.get("height"), "%", 0))
            {
                var newHeight = (Number(sx.helpers.String.str_replace("%", "", this.get("height")))/100) * windowHeight;
                this.set("height", Number(newHeight).toFixed())
            }

            return this;
        },

        /**
         * @returns {Window}
         */
        open: function()
        {
            var self = this;
            this.trigger('beforeOpen');
            //строка параметров, собираем из массива
            var paramsSting = "";
            if (this.getOpts())
            {
                _.each(this.getOpts(), function(value, key)
                {
                    if (paramsSting)
                    {
                        paramsSting = paramsSting + ',';
                    }
                    paramsSting = paramsSting + String(key) + "=" + String(value);
                });
            }

            this._openedWindow = window.open(this._src, this._name, paramsSting);
            if (!this._openedWindow)
            {
                this.trigger('error', {
                    'message': 'Браузер блокирует окно, необходимо его разрешить'
                });

                return this;
            }

            this.trigger('afterOpen');

            var timer = setInterval(function()
            {
                if(self._openedWindow.closed)
                {
                    clearInterval(timer);
                    self.trigger('close');
                }
            }, 1000);

            return this;
        },


        /**
         * @returns {sx.classes.Window}
         */
        focus: function()
        {
            if (this.getOpenedWindow())
            {
                this.getOpenedWindow().focus();
            }

            return this;
        },

        /**
         * @returns {boolean}
         */
        isOpened: function()
        {<commit_msg>add close method in Window component<commit_after>/*!
 *
 * Помощьник для работы с конами
 *
 * @date 06.11.2014
 * @copyright skeeks.com
 * @author <NAME> <<EMAIL>>
 */


(function(window, sx, $, _)
{
    sx.createNamespace('classes', sx);

    /**
     *
     * @event beforeOpen
     * @event afterOpen
     * @event close
     * @event error(e, data)
     *
     * @type {void|Function|*}
     */
    sx.classes._Window = sx.classes.Component.extend({

        construct: function (src, name, opts)
        {
            opts = opts || {};
            this._name          = name ? name : "sx-new-window";
            this._src           = src;
            this._openedWindow  = null;

            this.applyParentMethod(sx.classes.Component, 'construct', [opts]); // TODO: make a workaround for magic parent calling
        },

        _init: function()
        {
            this
                .defaultOpts({
                    "left"          : "50",
                    "top"           : "50",
                    "width"         : "90%",
                    "height"        : "70%",
                    "menubar"       : "no", //Если этот параметр установлен в yes, то в новом окне будет меню.
                    "location"      : "yes", //Если этот параметр установлен в yes, то в новом окне будет адресная строка
                    "toolbar"       : "no", //Если этот параметр установлен в yes, то в новом окне будет навигация (кнопки назад, вперед и т.п.) и панель вкладок
                    "scrollbars"    : "yes", //Если этот параметр установлен в yes, то новое окно при необходимости сможет показывать полосы прокрутки
                    "resizable"     : "yes", //Если этот параметр установлен в yes, то пользователь сможет изменить размеры нового окна. Рекомендуется всегда устанавливать этот параметр.
                    "status"        : "yes", //Если этот параметр установлен в yes, то в новом окне будет строка состояния
                    "directories"   : "yes"  //Если этот параметр установлен в yes, то в новом окне будут закладки/избранное
                })
                .normalizeOptions()
            ;
        },

        /**
         *
         * @returns {sx.classes.Window}
         */
        normalizeOptions: function()
        {
            var windowWidth     = window.screen.width;
            var windowHeight    = window.screen.height;

            if (sx.helpers.String.strpos(this.get("width"), "%", 0))
            {
                var newWidth = (Number(sx.helpers.String.str_replace("%", "", this.get("width")))/100) * windowWidth;
                this.set("width", Number(newWidth).toFixed())
            }

            if (sx.helpers.String.strpos(this.get("height"), "%", 0))
            {
                var newHeight = (Number(sx.helpers.String.str_replace("%", "", this.get("height")))/100) * windowHeight;
                this.set("height", Number(newHeight).toFixed())
            }

            return this;
        },

        /**
         * @returns {Window}
         */
        open: function()
        {
            var self = this;
            this.trigger('beforeOpen');
            //строка параметров, собираем из массива
            var paramsSting = "";
            if (this.getOpts())
            {
                _.each(this.getOpts(), function(value, key)
                {
                    if (paramsSting)
                    {
                        paramsSting = paramsSting + ',';
                    }
                    paramsSting = paramsSting + String(key) + "=" + String(value);
                });
            }

            this._openedWindow = window.open(this._src, this._name, paramsSting);
            if (!this._openedWindow)
            {
                this.trigger('error', {
                    'message': 'Браузер блокирует окно, необходимо его разрешить'
                });

                return this;
            }

            this.trigger('afterOpen');

            var timer = setInterval(function()
            {
                if(self._openedWindow.closed)
                {
                    clearInterval(timer);
                    self.trigger('close');
                }
            }, 1000);

            return this;
        },


        /**
         * @returns {sx.classes.Window}
         */
        focus: function()
        {
            if (this.getOpenedWindow())
            {
                this.getOpenedWindow().focus();
            }

            return this;
        },
        
        /**
         * @returns {sx.classes._Window}
         */
        close: function()
        {
            if (this.getOpenedWindow())
            {
                this.getOpenedWindow().close();
            }

            return this;
        },

        /**
         * @returns {boolean}
         */
        isOpened: function()
        {
{'fraction_non_alphanumeric': 0.11907783417935702, 'fraction_numerical': 0.005922165820642978, 'mean_word_length': 1.2705882352941176, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7232734', 'n_tokens_mistral': 2792, 'n_tokens_neox': 2754, 'n_words': 584}