web/data/cubicweb.preferences.js
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 23 Sep 2011 12:16:29 +0200
branchstable
changeset 7855 54283a5b7afc
parent 7667 600b407ae5c0
child 8185 864fc1f147a4
permissions -rw-r--r--
[web request] fix cookie 'expires' formating (closes #1953945) This was because cookie.expires wasn't processed in cw.etwist.http, though this code should had never existed, instead proper twisted method should be called. Also, move on the way to headers handling simplification and rewrite cw request.set_cookie / remove_cookie to directly use the Cookie class in cw.web.http_headers rather than going back and forth simple cookie <-> raw string <-> http_headers.Cookie IMO more on this should be done.

/**
 * toggle visibility of an element by its id & set current visibility status in a cookie
 *
 */

var prefsValues = {};

function togglePrefVisibility(elemId) {
    clearPreviousMessages();
    jQuery('#' + elemId).toggleClass('hidden');
}

function closeFieldset(fieldsetid) {
    var linklabel = _('open all');
    var linkhref = 'javascript:openFieldset("' + fieldsetid + '")';
    _toggleFieldset(fieldsetid, 1, linklabel, linkhref);
}

function openFieldset(fieldsetid) {
    var linklabel = _('close all');
    var linkhref = 'javascript:closeFieldset("' + fieldsetid + '")';
    _toggleFieldset(fieldsetid, 0, linklabel, linkhref);
}

function _toggleFieldset(fieldsetid, closeaction, linklabel, linkhref) {
    jQuery('#' + fieldsetid).find('div.openlink').each(function() {
        var link = A({
            'href': "javascript:noop();",
            'onclick': linkhref
        },
        linklabel);
        jQuery(this).empty().append(link);
    });
    jQuery('#' + fieldsetid).find('fieldset[id]').each(function() {
        var fieldset = jQuery(this);
        if (closeaction) {
            fieldset.addClass('hidden');
        } else {
            fieldset.removeClass('hidden');
            linkLabel = (_('open all'));
        }
    });
}

function validatePrefsForm(formid) {
    clearPreviousMessages();
    _clearPreviousErrors(formid);
    return validateForm(formid, null, submitSucces, submitFailure);
}

function submitFailure(result, formid, cbargs) {
    var $form = jQuery('#' + formid);
    var dom = DIV({'class': 'critical'}, _("please correct errors below"));
    $form.find('div.formsg').empty().append(dom);
    unfreezeFormButtons(formid);
    var descr = result[1];
    _displayValidationerrors(formid, descr[0], descr[1]);
    $form.find('span.error').next().focus();
    return false; // so handleFormValidationResponse doesn't try to display error
}

function submitSucces(result, formid, cbargs) {
    var $form = jQuery('#' + formid);
    setCurrentValues($form);
    var dom = DIV({'class': 'msg'}, _("changes applied"));
    $form.find('div.formsg').empty().append(dom);
    $form.find('input').removeClass('changed');
    checkValues(form, true);
    return;
}

function clearPreviousMessages() {
    jQuery('div#appMsg').addClass('hidden');
    jQuery('div.formsg').empty();
}

function checkValues(form, success) {
    var unfreezeButtons = false;
    jQuery(form).find('select').each(function() {
        unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
    });
    jQuery(form).find('[type=text]').each(function() {
        unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
    });
    jQuery(form).find('input[type=radio]:checked').each(function() {
        unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
    });

    if (unfreezeButtons) {
        unfreezeFormButtons(form.attr('id'));
    } else {
        if (!success) {
            clearPreviousMessages();
        }
        _clearPreviousErrors(form.attr('id'));
        freezeFormButtons(form.attr('id'));
    }
}

function _checkValue(input, unfreezeButtons) {
    var currentValue = prefsValues[input.attr('name')];
    if (currentValue != input.val()) {
        input.addClass('changed');
        unfreezeButtons = true;
    } else {
        input.removeClass('changed');
        jQuery('span[id="err-' + input.attr('id') + '"]').remove();
    }
    input.removeClass('error');
    return unfreezeButtons;
}

function setCurrentValues(form) {
    jQuery(form).find('[name^=value]').each(function() {
        var input = jQuery(this);
        var name = input.attr('name');
        if (input.attr('type') == 'radio') {
            // NOTE: there seems to be a bug with jQuery(input).attr('checked')
            //       in our case, we can't rely on its value, we use
            //       the DOM API instead.
            if (input[0].checked) {
                prefsValues[name] = input.val();
            }
        } else {
            prefsValues[name] = input.val();
        }
        jQuery(form).find('input[name="edits-' + name + '"]').val(prefsValues[name]);
    });
}

function initEvents() {
    jQuery('form').each(function() {
        var form = jQuery(this);
        //freezeFormButtons(form.attr('id'));
        form.find('.validateButton').attr('disabled', 'disabled');
        form.find('input[type=text]').keyup(function() {
            checkValues(form);
        });
        form.find('input[type=radio]').change(function() {
            checkValues(form);
        });
        form.find('select').change(function() {
            checkValues(form);
        });
        setCurrentValues(form);
    });
}

$(document).ready(function() {
    initEvents();
});