batiste/django-page-cms

View on GitHub
pages/static/pages/javascript/pages.js

Summary

Maintainability
D
2 days
Test Coverage
/* Common stuff used in pages_list.js as well as in pages_form.js */

// http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
$(document).ajaxSend(function(event, xhr, settings) {
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
        // Only send the token to relative URLs i.e. locally.
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
    }
});

var pages = {};

pages.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};


pages.fade_color = function (elem, o) {
    o = $.extend({
        duration: 2000,     // Time [ms] the animation should last
        frame: 50,          // Time [ms] a frame lasts
        color1: 'FFFFBB',   // Color to start the animation with
        color2: 'FFFFFF',   // Color to end the animation with
        css: 'background-color', // What CSS property the color affects
        keep: false // Should the CSS property be kept or removed on the element once the animation is finished
    }, o);

    function c2d(c,i) { return parseInt(c.substr(i,2),16); }    // Color to decimal (RRGGBB => 255)
    function d2c(d) { return d.toString(16); }                  // Decimal to color (255 => FF)
    function c2a(c) { return [c2d(c,0), c2d(c,2), c2d(c,4)]; }  // Color to array (RRGGBB => [255,255,255])
    function a2c(c) { return d2c(c[0])+d2c(c[1])+d2c(c[2]); }   // Array to color ([255,255,255] => RRGGBB)

    var c = [];
    var c1 = c2a(o.color1);
    var c2 = c2a(o.color2);
    var elapsed = 0;
    var interval = setInterval(function () {
        if ((elapsed += o.frame) >= o.duration) {
            clearInterval(interval);
            elem.css(o.css, o.keep ? '#'+o.color2 : '');
        } else {
            for (var i = c1.length; i--;)
                c[i] = Math.round(c1[i]+(c2[i]-c1[i])*elapsed/o.duration);
            elem.css(o.css, '#'+a2c(c));
        }
    }, o.frame);
};


pages.update_published_icon = function (url, select, img, change_status) {
    var opt = { 0: 'draft', 1: 'published', 2: 'expired', 3: 'hidden' };
    var select_val = opt[$(select).val()];
    img.attr({
        'src': img.attr('src').replace(/icons\/.*/, 'loading.gif'),
        'alt': 'Loading'
    });
    if (change_status) {
        if (!url) {
            url = window.location.pathname.replace('/change/', '/')
        }
        $.post(url+'change-status/', {'status':$(select).val()}, function(val) {
            img.attr({
                'src': img.attr('src').replace('loading.gif', 'icons/'+select_val+'.svg'),
                'alt': select_val
            });
        });
    } else {
        img.attr({
            'src': img.attr('src').replace('loading.gif', 'icons/'+select_val+'.svg'),
            'alt': select_val
        });
    }
};


$(function () {
    // Ignore clicks on help popups, just hide the help message
    $('a.popup .help, .popup a .help').click(function (e) {
        var help = $(this).css('display', 'none')
        help.closest('a').mouseout(function() {
            help.css('display', '');
        });
        e.stopPropagation();
        return false;
    });
});