web/data/cubicweb.preferences.js
author Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
Thu, 12 Nov 2009 18:27:59 +0100
branchstable
changeset 3834 e3e64352063d
parent 2162 14088bb1a103
child 4280 15d541321a8c
permissions -rw-r--r--
[javascript] fid form / onfailure behaviour If onfailure is specified, it should be done _before_ any default / standard CW action is done. The callback signature should be the same as the onsuccess one. If the onfailure callback returns true, the default actions will still take place afterwards, otherwise (i.e. return false), the processing stops directly after the callback.

/* toggle visibility of an element by its id
 * & set current visibility status in a cookie
 * XXX whenever used outside of preferences, don't forget to
 *     move me in a more appropriate place
 */

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(formid){
    var form = jQuery('#'+formid);
    var dom = DIV({'class':'critical'},
		  _("please correct errors below"));
    jQuery(form).find('div.formsg').empty().append(dom);
    // clearPreviousMessages()
    jQuery(form).find('span.error').next().focus();
}

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

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

function clearPreviousErrors(formid) {
    jQuery('#err-value:' + formid).remove();
}

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('input.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();
});