cubesystems/releaf

View on GitHub
releaf-core/app/assets/javascripts/releaf/include/localization.js

Summary

Maintainability
A
3 hrs
Test Coverage
jQuery(function()
{
    var body = jQuery('body');

    var overlay = jQuery('<div />').addClass('localization-menu-overlay').appendTo(body);
    overlay.bind('click', function()
    {
        body.trigger('localizationmenucloseall');
    });

    body.bind('localizationinit', function(e)
    {
        var block = jQuery(e.target);

        e.stopPropagation();

        var fields;
        if (block.is('.field.i18n'))
        {
            fields = block;
        }
        else
        {
            fields = block.find('.field.i18n');
        }

        if (fields.length < 1)
        {
            return;
        }

        fields.bind('localizationmenuopen', function()
        {
            var field  = jQuery(this);

            // close all other open menus
            body.trigger('localizationmenucloseall');

            var menu = field.data('localization-menu');

            field.attr('data-localization-menu-open', true);

            menu.appendTo( body );

            field.trigger('localizationmenuposition');

            overlay.show();

            menu.show();

            return;
        });

        fields.bind('localizationmenuclose', function()
        {
            var field   = jQuery(this);

            var menu = field.data('localization-menu');

            var localization_switch = field.data('localization-switch');

            menu.hide().appendTo( localization_switch );

            overlay.hide();

            field.removeAttr('data-localization-menu-open');

            return;
        });

        fields.bind('localizationmenutoggle', function()
        {
            var field  = jQuery(this);
            var event = (field.attr('data-localization-menu-open')) ? 'localizationmenuclose' : 'localizationmenuopen';
            field.trigger( event );
        });

        fields.bind('localizationmenuposition', function()
        {
            var field   = jQuery(this);
            if (!field.attr('data-localization-menu-open'))
            {
                return;
            }

            var menu = field.data('localization-menu');

            var trigger        = field.data('localization-switch-trigger');

            var triggerOffset  = trigger.offset();

            menu.css({
                left:  triggerOffset.left + trigger.outerWidth() - menu.outerWidth() ,
                top :  triggerOffset.top + trigger.outerHeight()
            });

        });

        fields.find('.localization-switch .trigger').click(function()
        {
            jQuery(this).closest('.field.i18n').trigger('localizationmenutoggle');
        });


        fields.find('.localization-menu-items button').click(function()
        {
            var button = jQuery(this);
            var locale  = button.attr('data-locale');
            var menu    = button.closest('.localization-menu-items');
            var field   = menu.data('field');
            var localization_box = field.find('.localization[data-locale="' + locale + '"]');

            body.trigger('localizationmenucloseall');

            localization_box.trigger('localizationlocaleactivate');

        });


        fields.bind('localizationlocaleset', function( e, params )
        {
            var field = jQuery(this);

            var locale = params.locale;

            var localization_boxes = field.find('.localization[data-locale]');

            var target_box  = localization_boxes.filter('[data-locale="' + locale + '"]');
            var other_boxes = localization_boxes.not( target_box );

            target_box.addClass('active');
            other_boxes.removeClass('active');

            var trigger_label = field.find('.localization-switch .trigger .label');

            trigger_label.text( locale );
        });


        fields.find('.localization').bind('localizationlocaleactivate', function()
        {
            var localization_box = jQuery(this);
            var locale = localization_box.attr('data-locale');

            var form   = localization_box.closest('form');

            form.find('.field.i18n').trigger('localizationlocaleset', { locale : locale });

            body.trigger( 'settingssave', [ "releaf.i18n.locale", locale ] );
        });


        var input_selector = 'input[type!="hidden"],textarea,select';
        fields.find(input_selector).bind('focusprepare', function(e)
        {
            var localization_box = (jQuery(e.target).closest('.localization'));
            if (localization_box.length < 1)
            {
                return;
            }

            // focus target is inside a i18n localization box
            if (!localization_box.is('.active'))
            {
                localization_box.trigger('localizationlocaleactivate');
            }
        });


        fields.each(function()
        {
            var field = jQuery(this);

            var localization_switch = field.find('.localization-switch').first();

            field.data('localization-switch', localization_switch );

            field.data('localization-switch-trigger', localization_switch.find('.trigger').first() );

            var menu = localization_switch.find('menu').first();

            field.data('localization-menu', menu);

            menu.data('field', field);

        });


    });

    body.bind('localizationmenucloseall', function()
    {
        body.find('.field.i18n[data-localization-menu-open]').trigger('localizationmenuclose');
    });



    // attach localizationinit to all loaded content
    body.on('contentloaded', function(e)
    {
        // reinit localization for all content that gets replaced via ajax
        jQuery(e.target).trigger('localizationinit');

    });

});