{"size": 10215, "ext": "js", "max_stars_repo_path": "cms/static/cms/js/modules/cms.base.js", "max_stars_repo_name": "sofiareis/django-cms", "max_stars_repo_stars_event_min_datetime": null, "max_stars_repo_stars_event_max_datetime": null, "max_issues_repo_path": "cms/static/cms/js/modules/cms.base.js", "max_issues_repo_name": "sofiareis/django-cms", "max_issues_repo_issues_event_min_datetime": null, "max_issues_repo_issues_event_max_datetime": null, "max_forks_repo_path": "cms/static/cms/js/modules/cms.base.js", "max_forks_repo_name": "sofiareis/django-cms", "max_forks_repo_forks_event_min_datetime": null, "max_forks_repo_forks_event_max_datetime": null}
{"max_stars_count": null, "max_issues_count": null, "max_forks_count": null, "avg_line_length": 39.5930232558, "max_line_length": 116, "alphanum_fraction": 0.4087126774}
/*!
 * CMS.API.Helpers
 * Multiple helpers used accross all CMS features
 */

//##################################################################################################################
// #COMPATIBILITY#

// ensuring django namespace is set correctly
window.django = window.django || undefined;

// ensuring jQuery namespace is set correctly
window.jQuery = (window.django && window.django.jQuery) ? window.django.jQuery : window.jQuery || undefined;

// ensuring Class namespace is set correctly
window.Class = window.Class || undefined;

// ensuring CMS namespace is set correctly
var CMS = {
    $: (typeof window.jQuery === 'function') ? window.jQuery : undefined,
    Class: (typeof window.Class === 'function') ? window.Class : undefined,
    API: {}
};

//##################################################################################################################
// #CMS.API#
(function ($) {
    'use strict';
    // CMS.$ will be passed for $
    $(document).ready(function () {
        CMS.API.Helpers = {

            // redirects to a specific url or reloads browser
            reloadBrowser: function (url, timeout, ajax) {
                var that = this;
                // is there a parent window?
                var parent = (window.parent) ? window.parent : window;

                // if there is an ajax reload, prioritize
                if (ajax) {
                    parent.CMS.API.locked = true;
                    // check if the url has changed, if true redirect to the new path
                    // this requires an ajax request
                    $.ajax({
                        async: false,
                        type: 'GET',
                        url: parent.CMS.config.request.url,
                        data: {
                            model: parent.CMS.config.request.model,
                            pk: parent.CMS.config.request.pk
                        },
                        success: function (response) {
                            parent.CMS.API.locked = false;

                            if (response === '' && !url) {
                                // cancel if response is empty
                                return false;
                            } else if (parent.location.pathname !== response) {
                                // api call to the backend to check if the current path is still the same
                                that.reloadBrowser(response);
                            } else if (url === 'REFRESH_PAGE') {
                                // if on_close provides REFRESH_PAGE, only do a reload
                                that.reloadBrowser();
                            } else if (url) {
                                // on_close can also provide a url, reload to the new destination
                                that.reloadBrowser(url);
                            }
                        }
                    });

                    // cancel further operations
                    return false;
                }

                // add timeout if provided
                parent.setTimeout(function () {
                    if (url && url !== parent.location.href) {
                        // location.reload() takes precedence over this, so we
                        // don't want to reload the page if we need a redirect
                        parent.location.href = url;
                    } else {
                        // ensure page is always reloaded #3413
                        parent.location.reload();
                    }
                }, timeout || 0);
            },

            // disable multiple form submissions
            preventSubmit: function () {
                var forms = $('#cms-toolbar').find('form');
                forms.submit(function () {
                    // show loader
                    CMS.API.Toolbar._loader(true);
                    // we cannot use disabled as the name action will be ignored
                    $('input[type="submit"]').bind('click', function (e) {
                        e.preventDefault();
                    }).css('opacity', 0.5);
                });
            },

            // fixes csrf behaviour
            csrf: function (csrf_token) {
                $.ajaxSetup({
                    beforeSend: function (xhr) {
                        // set csrf_token
                        xhr.setRequestHeader('X-CSRFToken', csrf_token);
                    }
                });
            },

            // handles the tooltip for the plugins
            showTooltip: function (name, id) {
                var tooltip = $('.cms-tooltip');

                // change css and attributes
                tooltip.css('visibility', 'visible')
                    .data('plugin_id', id || null)
                    .show()
                    .find('span').html(name);

                // attaches move event
                // this sets the correct position for the edit tooltip
                $('body').bind('mousemove.cms', function (e) {
                    // so lets figure out where we are
                    var offset = 20;
                    var relX = e.pageX - $(tooltip).offsetParent().offset().left;
                    var relY = e.pageY - $(tooltip).offsetParent().offset().top;
                    var bound = $(tooltip).offsetParent().width();
                    var pos = relX + tooltip.outerWidth(true) + offset;

                    tooltip.css({
                        'left': (pos >= bound) ? relX - tooltip.outerWidth(true) - offset : relX + offset,
                        'top': relY - 12
                    });
                });

                // attach tooltip event for touch devices
                tooltip.bind('touchstart.cms', function () {
                    $('.cms-plugin-' + $(this).data('plugin_id')).trigger('dblclick');
                });
            },

            hideTooltip: function () {
                var tooltip = $('.cms-tooltip');

                // change css
                tooltip.css('visibility', 'hidden').hide();

                // unbind events
                $('body').unbind('mousemove.cms');
                tooltip.unbind('touchstart.cms');
            },

            // sends or retrieves a JSON from localStorage or the session if local storage is not available
            setSettings: function (settings) {
                var that = this;
                // merge settings
                settings = JSON.stringify($.extend({}, CMS.config.settings, settings));
                // set loader
                if (CMS.API.Toolbar) {
                    CMS.API.Toolbar._loader(true);
                }

                // use local storage or session
                if (window.localStorage) {
                    // save within local storage
                    localStorage.setItem('cms_cookie', settings);
                    if (CMS.API.Toolbar) {
                        CMS.API.Toolbar._loader(false);
                    }
                } else {
                    // save within session
                    CMS.API.locked = true;

                    $.ajax({
                        async: false,
                        type: 'POST',
                        url: CMS.config.urls.settings,
                        data: {
                            csrfmiddlewaretoken: this.config.csrf,
                            settings: settings
                        },
                        success: function (data) {
                            CMS.API.locked = false;
                            // determine if logged in or not
                            settings = (data) ? JSON.parse(data) : CMS.config.settings;
                            if (CMS.API.Toolbar) {
                                CMS.API.Toolbar._loader(false);
                            }
                        },
                        error: function (jqXHR) {
                            that.showError(jqXHR.response + ' | ' + jqXHR.status + ' ' + jqXHR.statusText);
                        }
                    });
                }

                // save settings
                CMS.settings = JSON.parse(settings);

                // ensure new settings are returned
                return CMS.settings;
            },

            getSettings: function () {
                var that = this;
                var settings;
                // set loader
                if (CMS.API.Toolbar) {
                    CMS.API.Toolbar._loader(true);
                }

                // use local storage or session
                if (window.localStorage) {
                    // get from local storage
                    settings = JSON.parse(localStorage.getItem('cms_cookie'));
                    if (CMS.API.Toolbar) {
                        CMS.API.Toolbar._loader(false);
                    }
                } else {
                    CMS.API.locked = true;
                    // get from session
                    $.ajax({
                        async: false,
                        type: 'GET',
                        url: CMS.config.urls.settings,
                        success: function (data) {
                            CMS.API.locked = false;
                            // determine if logged in or not
                            settings = (data) ? JSON.parse(data) : CMS.config.settings;
                            if (CMS.API.Toolbar) {
                                CMS.API.Toolbar._loader(false);
                            }
                        },
                        error: function (jqXHR) {
                            that.showError(jqXHR.response + ' | ' + jqXHR.status + ' ' + jqXHR.statusText);
                        }
                    });
                }

                if (!settings) {
                    settings = this.setSettings(CMS.config.settings);
                }

                // save settings
                CMS.settings = settings;

                // ensure new settings are returned
                return CMS.settings;
            }

        };

        // autoinits
        CMS.API.Helpers.preventSubmit();

    });
})(CMS.$);
