/home/tuzdhajd/crossroadschristiancenter.net/wp-content/themes/AllWhite/js/color-scheme-control.js
/**
 * Add a listener to the Color Scheme control to update other color controls to new values/defaults.
 * Also trigger an update of the Color Scheme CSS when a color is changed.
 */

(function (api) {
    function onFirstReady(func) {
        var doOnce = function () {
            wp.customize.previewer.unbind('ready', doOnce);
            func();
        };
        wp.customize.previewer.bind('ready', doOnce);
    }

    // Generate the CSS for the current Color Scheme.
    function updateColorsCSS() {
        var colorsArray = {
            bgColor: api('color_background')(),
            bodyColors: [api('color_white_contrast')(), api('color_shading_contrast')()],
            colors: [api('color_1')(), api('color_2')(), api('color_3')(), api('color_4')(), api('color_5')()],
            customColors: nicepageThemeSettings && nicepageThemeSettings.colorScheme && nicepageThemeSettings.colorScheme.customColors
        };

        var win = wp.customize.previewer.targetWindow();

        var colorSchemeName = ColorSchemes.createPaletteFromColorArray(colorsArray);
        var colorSchemeObject = ColorSchemes.getColorSchemeByName(colorSchemeName);
        var styleName = win.jQuery('style[color-style]').attr('color-style');
        var colorStyleObject = ColorStyles.getColorStyleByName(styleName);
        if (!colorSchemeObject.palettes) {
            ColorLab.createPalettes(colorSchemeObject);
        }
        var colorSchemeCss = ColorLab.getCss(colorSchemeObject, colorStyleObject);

        colorSchemeCss = colorSchemeCss.replace('id="color-scheme"', 'id="theme-customized-color-scheme"');
        api('colors_css').set(colorSchemeCss);
        api.previewer.send('update-color-scheme-css', colorSchemeCss);
    }

    var colorProps = ['color_1', 'color_2', 'color_3', 'color_4', 'color_5', 'color_background', 'color_white_contrast', 'color_shading_contrast'];

    _.each(colorProps, function (prop) {
        api(prop, function (setting) {
            setting.bind(updateColorsCSS);
        });
    });

    function changeColorScheme(name, setDefaultsOnly) {
        var scheme = ColorSchemes.getColorSchemeByName(name);
        colorProps.forEach(function (prop) {
            var value = getPropertyFromColorScheme(prop, scheme);
            if (value && !setDefaultsOnly) {
                api(prop).set(value);
            }
            // change default color
            jQuery('#customize-control-' + prop)
                .find('[data-default-color]')
                .attr('data-default-color', value)
                .data('defaultColor', value)
                .data('wpWpColorPicker').options.defaultColor = value;
        });
    }

    api('color_scheme', function (setting) {
        setting.bind(function (name) {
            changeColorScheme(name);
        });
    });

    jQuery(function () {
        jQuery('[id*=customize-control-color_]').addClass('disable-control');

        onFirstReady(function () {
            var win = wp.customize.previewer.targetWindow();
            var computedStyle = win.getComputedStyle(win.document.querySelector('.u-body'));

            var customizedStyle = win.jQuery('[color-style]').eq(1);
            customizedStyle.detach();

            var get = function (_var) {
                return (computedStyle.getPropertyValue('--' + _var) || '').trim();
            };

            // create default scheme
            ColorSchemes.createPaletteFromColorArray(nicepageThemeSettings.colorScheme);
            // set name and move to first
            var defaultScheme = ColorSchemes.pop();
            defaultScheme.isDefault = true;
            defaultScheme.name = 'default';
            ColorSchemes.unshift(defaultScheme);

            win.jQuery('head').append(customizedStyle);

            api('color_1').set(get('palette-1-base'));
            api('color_2').set(get('palette-2-base'));
            api('color_3').set(get('palette-3-base'));
            api('color_4').set(get('palette-4-base'));
            api('color_5').set(get('palette-5-base'));
            api('color_background').set(get('bg-color'));
            api('color_white_contrast').set(get('white-contrast'));
            api('color_shading_contrast').set(get('shading-contrast'));

            var schemesSelect = jQuery('#customize-control-color_scheme select');

            ColorSchemes.forEach(function (scheme) {
                if (scheme.isDefault) {
                    schemesSelect.append('<option value="' + scheme.name + '">' + (scheme.name === 'default' ? 'Theme Colors' : capitalize(scheme.name)) + '</option>');
                }
            });

            changeColorScheme(api('color_scheme')(), true);
            schemesSelect.val(api('color_scheme')());

            jQuery('[id*=customize-control-color_]').removeClass('disable-control');
        });
    });

    function getPropertyFromColorScheme(prop, scheme) {
        switch (prop) {
            case 'color_background':
                return scheme.bgColor;
            case 'color_white_contrast':
                return scheme.bodyColors[0];
            case 'color_shading_contrast':
                return scheme.bodyColors[1];
            default:
                var idx = parseInt(prop.replace('color_', ''));
                return scheme.colors[idx - 1];
        }
    }


    function updateFontsCSS() {
        var fontsArray = {
            name: '',
            fonts: {
                heading: api('font_heading')(),
                text: api('font_text')()
            }
        };

        var schemeName = PageFontSchemes.createFontScheme(fontsArray);
        var scheme = PageFontSchemes.getFontSchemeByName(schemeName);
        var fontSchemeCss = FontLab.getCss(scheme);
        var fonts = FontsToLink.getThemeList(scheme.name);
        var subsetParam = FontsToLink.getSubsetParam(scheme.name);
        var subset = subsetParam ? '&' + subsetParam : '';
        var fontSchemeLink = '';
        if (fonts && fonts.length) {
            fontSchemeLink = '<link id="custom-google-font" rel="stylesheet" href="https://fonts.googleapis.com/css?family=' + fonts.join('|') + subset + '" />';
        }

        fontSchemeCss = fontSchemeCss.replace('id="font-scheme"', 'id="theme-customized-font-scheme"');
        api('fonts_css').set(fontSchemeCss);
        api('fonts_link').set(fontSchemeLink);
        api.previewer.send('update-font-scheme-css', fontSchemeCss);
        api.previewer.send('update-font-scheme-link', fontSchemeLink);
    }

    api('font_heading', function (setting) {
        setting.bind(updateFontsCSS);
    });
    api('font_text', function (setting) {
        setting.bind(updateFontsCSS);
    });

    function changeFontScheme(name) {
        var scheme = PageFontSchemes.getFontSchemeByName(name);
        api('font_heading').set(scheme.fonts.heading);
        api('font_text').set(scheme.fonts.text);
    }

    api('font_scheme', function (setting) {
        setting.bind(function (name) {
            changeFontScheme(name);
        });
    });

    jQuery(function () {
        jQuery('[id*=customize-control-font_]').addClass('disable-control');

        onFirstReady(function () {
            var win = wp.customize.previewer.targetWindow();

            // create default scheme
            var defaultStyle = win.jQuery('#theme-font-scheme');
            var defaultScheme = PageFontSchemes.parseFontSchemeFromDom(defaultStyle);
            defaultScheme.name = 'default';
            PageFontSchemes.unshift(defaultScheme);

            // create current scheme
            var currentStyle = win.jQuery('#theme-customized-font-scheme');
            if (!currentStyle.length) {
                currentStyle = defaultStyle;
            }
            var currentScheme = PageFontSchemes.parseFontSchemeFromDom(currentStyle);

            var foundScheme = PageFontSchemes.find(function (scheme) {
                return scheme.fonts.heading === currentScheme.fonts.heading &&
                    scheme.fonts.text === currentScheme.fonts.text;
            });

            var schemesSelect = jQuery('#customize-control-font_scheme select');
            if (!foundScheme) {
                currentScheme.name = 'current';
                PageFontSchemes.unshift(currentScheme);
                foundScheme = currentScheme;
            }

            PageFontSchemes.forEach(function (scheme) {
                schemesSelect.append('<option value="' + scheme.name + '">' +
                    (scheme.name === 'default' ? 'Theme Fonts (' : scheme.name === 'current' ? 'Current (' : '') +
                    scheme.fonts.headingTitle + ' - ' + scheme.fonts.textTitle +
                    (scheme.name === 'default' ? ')' : scheme.name === 'current' ? ')' : '') +
                    '</option>');
            });
            schemesSelect.val(foundScheme.name);

            api('font_heading').set(currentScheme.fonts.heading);
            api('font_text').set(currentScheme.fonts.text);

            var allFonts = AllFonts.get(),
                headingFontSelect = jQuery('#customize-control-font_heading select'),
                textFontSelect = jQuery('#customize-control-font_text select');
            allFonts.forEach(function (font) {
                var optionHtml = '<option value="' + AllFonts.classNameToFontFamily(font.className) + '">' + font['font-family'].replace(/:.*/g, '') + '</option>';
                headingFontSelect.append(optionHtml);
                textFontSelect.append(optionHtml);
            });

            headingFontSelect.val(api('font_heading')());
            textFontSelect.val(api('font_text')());

            jQuery('[id*=customize-control-font_]').removeClass('disable-control');
        });
    });


    jQuery(function () {
        jQuery('[id*=customize-control-typography_]').addClass('disable-control');

        onFirstReady(function () {
            var win = wp.customize.previewer.targetWindow();
            var schemesSelect = jQuery('#customize-control-typography_scheme select');
            schemesSelect.append('<option value="default">Theme Typography</option>');

            PageTypographies.forEach(function (scheme) {
                schemesSelect.append('<option value="' + scheme.name + '">' + scheme.name + '</option>');
            });
            schemesSelect.val(api('typography_scheme')());
            var baseFontSize = parseInt(win.jQuery('html').css('font-size'));
            jQuery('#customize-control-typography_base_size input').val(baseFontSize);

            jQuery('[id*=customize-control-typography_]').removeClass('disable-control');
        });
    });

    function setTypographyCss(css) {
        css = css.replace(/id="[^"]*?"/g, 'id="theme-customized-typography"');
        api('typography_css').set(css);
        api.previewer.send('update-typography-scheme-css', css);
    }

    api('typography_scheme', function (setting) {
        setting.bind(function (name) {
            var win = wp.customize.previewer.targetWindow();
            if (name === 'default') {
                setTypographyCss('');
            } else {
                var scheme = PageTypographies.getTypoByName(name);

                var typographyCss = TypographyLab.getCss(scheme, undefined, {
                    colorScheme: win.jQuery('style[color-scheme]').last().attr('color-scheme'),
                    colorStyle: win.jQuery('style[color-style]').last().attr('color-style')
                });
                setTypographyCss(typographyCss);

                setTimeout(function () {
                    api('typography_base_size').set(scheme.htmlBaseSize || 16);
                    api('typography_heading_weight').set(scheme.h1['font-weight'] || 400);
                }, 0);
            }
        });
    });

    api('typography_base_size', function (setting) {
        setting.bind(function (size) {
            api.previewer.send('update-base-font-size', size);
        });
    });

    api('typography_heading_weight', function (setting) {
        setting.bind(function (weight) {
            var win = wp.customize.previewer.targetWindow();
            var style = win.jQuery('#theme-customized-typography')[0] || win.jQuery('#theme-typography')[0];
            if (!style) {
                return;
            }
            var css = style.outerHTML;
            css = css.replace(/(--(title|subtitle|h\d)-font-weight: )[^;]*?;/g, '$1' + weight + ';');

            setTypographyCss(css);
        });
    });

    function updateResolvedCss() {
        var win = wp.customize.previewer.targetWindow();
        var siteStyleCss = jQuery('<div>')
            .append(api('colors_css').get() || win.jQuery('style[color-scheme]').last().clone())
            .append(api('typography_css').get() || win.jQuery('style[typography]').last().clone())
            .append(api('fonts_css').get() || win.jQuery('style[font-scheme]').last().clone())
            .html();

        var css = PublishNPCssCreator.create(nicepageStyleTemplate, siteStyleCss);
        api('resolved_css').set(css);
    }

    ['colors_css', 'typography_css', 'fonts_css'].forEach(function (prop) {
        api(prop, function (setting) {
            setting.bind(updateResolvedCss);
        });
    });


    api.bind('ready', function () {
        // Inject additional heading into the menu_options section's head container.
        api.section('menu_options', function (section) {
            section.headContainer.prepend(
                wp.template('nav-menu-theme-options-header')(api.Menus.data)
            );
        });
    });

    var dependency = function (controlSelector, checkboxProperty) {
        var update = function () {
            jQuery(controlSelector).toggleClass('disable-control', !api(checkboxProperty)());
        };

        api.bind('ready', update);
        api(checkboxProperty, function (value) {
            value.bind(update);
        });
    };

    dependency('#customize-control-excerpt_words', 'excerpt_auto');
    dependency('#customize-control-excerpt_min_remainder', 'excerpt_auto');
    dependency('#customize-control-excerpt_allowed_tags', 'excerpt_use_tag_filter');
    dependency('#customize-control-morelink_template', 'show_morelink');

    dependency('#customize-control-menu_trim_len', 'menu_trim_title');
    dependency('#customize-control-submenu_trim_len', 'menu_trim_title');
    dependency('#customize-control-menu_allowed_tags', 'menu_use_tag_filter');

    function capitalize(str) {
        return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
    }
})(wp.customize);