// http://civicrm.org/licensing
(function($, _) {
// FIXME: Much of this code is redundant with CRM.loadForm
var ajaxFormParams = {
dataType:'json',
beforeSubmit: function(arr, $form, options) {
$form.block();
},
success: requestHandler,
error: errorHandler
};
function crmFormInline(o) {
var data = o.data('edit-params');
if (o.is('.crm-edit-ready .crm-inline-edit') && data) {
o.animate({height: '+=50px'}, 200);
data.snippet = 6;
data.reset = 1;
var width = o.width();
$('.crm-edit-ready').removeClass('crm-edit-ready');
o.block().addClass('form').css('width', '' + width + 'px');
$.getJSON(CRM.url('civicrm/ajax/inline', data))
.fail(errorHandler)
.done(function(response) {
o.unblock();
o.css('overflow', 'hidden').wrapInner('
').append(response.content);
// Needed to accurately measure box width
$('.crm-container-snippet', o).css('display', 'inline-block');
// Smooth resizing
var newHeight = $('.crm-container-snippet', o).height(),
speed = newHeight - parseInt(o.css('height'), 10),
animation = {height: '' + newHeight + 'px'};
// Animation speed is set relative to how much the box needs to grow
if (speed < 0) {
speed = 0 - speed;
}
// Horizontal growth
var newWidth = $('.crm-container-snippet', o).width();
if (newWidth > width) {
animation.width = '' + newWidth + 'px';
// Slow down animation if we have lots of horizontal growth to do
if (newWidth - width > speed) {
speed = newWidth - width;
}
} else {
newWidth = width;
}
$('.crm-container-snippet', o).css('display', '');
o.animate(animation, speed, function() {
o.css({height: '', width: '', minWidth: '' + newWidth + 'px'});
});
$('form', o).validate(CRM.validate.params);
ajaxFormParams.data = data;
$('form', o).ajaxForm(ajaxFormParams);
o.trigger('crmLoad').trigger('crmFormLoad');
});
}
}
function reloadBlock(el) {
return $(el).each(function() {
var data = $(this).data('edit-params');
if (data) {
data.snippet = data.reset = 1;
data.class_name = data.class_name.replace('Form', 'Page');
data.type = 'page';
$(this).closest('.crm-summary-block').load(CRM.url('civicrm/ajax/inline', data), function() {
$(this).trigger('crmLoad');
});
}
});
}
function requestHandler(response) {
var o = $('div.crm-inline-edit.form');
$('form', o).ajaxFormUnbind();
if (response.status == 'success' || response.status == 'cancel') {
o.trigger('crmFormSuccess', [response]).removeAttr('style');
$('.crm-inline-edit-container').addClass('crm-edit-ready');
var data = o.data('edit-params');
var dependent = $((o.data('dependent-fields') || []).join(','));
// Clone the add-new link if replacing it, and queue the clone to be refreshed as a dependent block
if (o.hasClass('add-new') && response.addressId) {
data.aid = response.addressId;
var clone = o.closest('.crm-summary-block').clone();
o.data('edit-params', data);
$('form', clone).remove();
if (clone.hasClass('contactCardLeft')) {
clone.removeClass('contactCardLeft').addClass('contactCardRight');
}
else if (clone.hasClass('contactCardRight')) {
clone.removeClass('contactCardRight').addClass('contactCardLeft');
}
var cl = $('.crm-inline-edit', clone);
var clData = cl.data('edit-params');
var locNo = clData.locno++;
cl.attr('id', cl.attr('id').replace(locNo, clData.locno)).removeClass('form');
o.closest('.crm-summary-block').after(clone);
dependent = dependent.add($('.crm-inline-edit', clone));
}
$('a.ui-notify-close', '#crm-notification-container').click();
// Delete an address
if (o.hasClass('address') && !o.hasClass('add-new') && !response.addressId) {
o.parent().remove();
CRM.status(ts('Address Deleted'));
}
else {
// Reload this block plus all dependent blocks
reloadBlock(dependent.add(o));
CRM.status(ts('Saved'));
}
}
else {
// Handle formRule error
$('.crm-container-snippet', o).replaceWith(response.content);
$('form', o).validate(CRM.validate.params);
$('form', o).ajaxForm(ajaxFormParams);
o.trigger('crmFormError', [response]).trigger('crmFormLoad').trigger('crmLoad');
}
}
/**
* Configure optimistic locking mechanism for inplace editing
*
* options.ignoreLabel: string, text for a button
* options.reloadLabel: string, text for a button
*/
$.fn.crmFormContactLock = function(options) {
var form = this;
// AFTER ERROR: Render any "Ignore" and "Restart" buttons
return this.on('crmFormError', function(event, obj, status) {
var o = $(event.target);
var data = o.data('edit-params');
var errorTag = o.find('.update_oplock_ts');
if (errorTag.length > 0) {
$('')
.addClass('crm-lock-button css_right')
.appendTo(errorTag);
var buttonContainer = o.find('.crm-lock-button');
$('