1 //@todo functions partially moved from tpl but still need an enclosure / cleanup
4 cj('.selector-rows').change(function () {
6 'url': CRM
.url('civicrm/ajax/batch')
9 cj("#Entry").ajaxSubmit(options
);
12 checkColumns(cj(this));
15 cj('input[name^="soft_credit_contact["]').change(function(){
16 var rowNum
= cj(this).attr('id').replace('soft_credit_contact_','');
17 var totalAmount
= cj('#field_'+rowNum
+'_total_amount').val();
18 //assign total amount as default soft credit amount
19 cj('#soft_credit_amount_'+ rowNum
).val(totalAmount
);
20 //assign soft credit type default value if any
21 cj('#field_'+rowNum
+'_soft_credit_type').val(cj('#sct_default_id').val());
27 //calculate the actual total for the batch
28 calculateActualTotal();
30 cj('input[id*="_total_amount"]').bind('keyup change', function () {
31 calculateActualTotal();
34 if (CRM
.batch
.type_id
== 1) {
35 // hide all dates if send receipt is checked
38 // hide the receipt date if send receipt is checked
39 cj('input[id*="][send_receipt]"]').change(function () {
40 showHideReceipt(cj(this));
45 cj('select[id^="member_option_"]').each(function () {
46 if (cj(this).val() == 1) {
47 cj(this).attr('disabled', true);
51 // set payment info accord to membership type
52 cj('select[id*="_membership_type_0"]').change(function () {
53 setPaymentBlock(cj(this), null);
56 cj('select[id*="_membership_type_1"]').change(function () {
57 setPaymentBlock(cj(this), cj(this).val());
62 // line breaks between radio buttons and checkboxes
63 cj('input.form-radio').next().after('<br />');
64 cj('input.form-checkbox').next().after('<br />');
66 //set the focus on first element
67 cj('#primary_contact_1').focus();
72 function updateContactInfo(blockNo
, prefix
) {
73 var contactHiddenElement
= 'input[name="' + prefix
+ 'contact_select_id[' + blockNo
+ ']"]';
74 var contactId
= cj(contactHiddenElement
).val();
76 var profileFields
= CRM
.contact
.fieldmap
;
78 CRM
.api('Contact', 'get', {
80 'contact_id': contactId
,
81 'return': CRM
.contact
.return },
82 { success: function (data
) {
83 cj
.each(data
.values
[0], function (key
, value
) {
85 var actualFldName
= profileFields
[key
];
86 if (key
== 'country' || key
== 'state_province') {
87 idFldName
= key
+ '_id';
88 value
= data
.values
[0][idFldName
];
90 setFieldValue(actualFldName
, value
, blockNo
)
93 // for membership batch entry based on contact we need to enable / disable
94 // add membership select
95 if(CRM
.batch
.type_id
== 2) {
96 CRM
.api('Membership', 'get', {
98 'contact_id': contactId
,
100 { success: function (data
) {
101 if (data
.count
> 0) {
102 //get the information on membership type
103 var membershipTypeId
= data
.values
[0].membership_type_id
;
104 var membershipJoinDate
= data
.values
[0].join_date
;
105 CRM
.api('MembershipType', 'get', {
107 'id': membershipTypeId
109 { success: function (data
) {
110 var memTypeContactId
= data
.values
[0].member_of_contact_id
;
111 cj('select[id="member_option_' + blockNo
+ '"]').removeAttr('disabled').val(2);
112 cj('select[id="field_' + blockNo
+ '_membership_type_0"]').val(memTypeContactId
).change();
113 cj('select[id="field_' + blockNo
+ '_membership_type_1"]').val(membershipTypeId
).change();
114 setDateFieldValue('join_date', membershipJoinDate
, blockNo
)
125 function setPaymentBlock(form
, memType
) {
126 var rowID
= form
.closest('div.crm-grid-row').attr('entity_id');
127 var dataUrl
= CRM
.url('civicrm/ajax/memType');
130 memType
= cj('select[id="field_' + rowID
+ '_membership_type_1"]').val();
133 cj
.post(dataUrl
, {mtype
: memType
}, function (data
) {
134 cj('#field_' + rowID
+ '_financial_type').val(data
.financial_type_id
);
135 cj('#field_' + rowID
+ '_total_amount').val(data
.total_amount
).change();
139 function hideSendReceipt() {
140 cj('input[id*="][send_receipt]"]').each(function () {
141 showHideReceipt(cj(this));
145 function showHideReceipt(elem
) {
146 var rowID
= elem
.closest('div.crm-grid-row').attr('entity_id');
147 if (elem
.prop('checked')) {
148 cj('.crm-batch-receipt_date-' + rowID
).hide();
151 cj('.crm-batch-receipt_date-' + rowID
).show();
155 function validateRow() {
156 cj('.selector-rows').each(function () {
157 checkColumns(cj(this));
161 function checkColumns(parentRow
) {
162 // show valid row icon if all required data is field
165 var errorExists
= false;
166 var rowID
= parentRow
.closest('div.crm-grid-row').attr('entity_id');
168 parentRow
.find('div .required').each(function () {
169 //special case to handle contact autocomplete select
170 var fieldId
= cj(this).attr('id');
171 if (fieldId
.substring(0, 16) == 'primary_contact_') {
172 // if display value is set then make sure we also check if contact id is set
173 if (!cj(this).val()) {
177 if (cj(this).val() && !cj('input[name="primary_contact_select_id[' + rowID
+ ']"]').val()) {
184 if (!cj(this).val()) {
188 if (cj(this).hasClass('error') && !cj(this).hasClass('valid')) {
198 // this means user has entered some data
200 parentRow
.find("div:first span").prop('class', 'batch-invalid');
203 if (inValidRow
== 0 && validRow
> 0) {
204 parentRow
.find("div:first span").prop('class', 'batch-valid');
207 parentRow
.find("div:first span").prop('class', 'batch-edit');
212 function calculateActualTotal() {
214 cj('input[id*="_total_amount"]').each(function () {
215 if (cj(this).val()) {
216 total
+= parseFloat(cj(this).val());
220 cj('.batch-actual-total').html(formatMoney(total
));
223 //money formatting/localization
224 function formatMoney(amount
) {
226 var t
= CRM
.setting
.monetaryThousandSeparator
;
227 var d
= CRM
.setting
.monetaryDecimalPoint
;
230 c
= isNaN(c
= Math
.abs(c
)) ? 2 : c
,
231 d
= d
== undefined ? "," : d
,
232 t
= t
== undefined ? "." : t
, s
= n
< 0 ? "-" : "",
233 i
= parseInt(n
= Math
.abs(+n
|| 0).toFixed(c
)) + "",
234 j
= (j
= i
.length
) > 3 ? j
% 3 : 0;
236 return s
+ (j
? i
.substr(0, j
) + t
: "") + i
.substr(j
).replace(/(\d{3})(?=\d)/g, "$1" + t
) + (c
? d
+ Math
.abs(n
- i
).toFixed(c
).slice(2) : "");
240 * This function is use to setdefault elements via ajax
242 * @param fname string field name
245 function setFieldValue(fname
, fieldValue
, blockNo
) {
246 var elementId
= cj('[name="field[' + blockNo
+ '][' + fname
+ ']"]');
248 if (elementId
.length
== 0) {
249 elementId
= cj('input[type=checkbox][name^="field[' + blockNo
+ '][' + fname
+ ']"][type!=hidden]');
252 // if element not found than return
253 if (elementId
.length
== 0) {
257 //check if it is date element
258 var isDateElement
= elementId
.attr('format');
260 // check if it is wysiwyg element
261 var editor
= elementId
.attr('editor');
263 //get the element type
264 var elementType
= elementId
.attr('type');
266 // set the value for all the elements, elements needs to be handled are
267 // select, checkbox, radio, date fields, text, textarea, multi-select
268 // wysiwyg editor, advanced multi-select ( to do )
269 if (elementType
== 'radio') {
271 elementId
.filter("[value=" + fieldValue
+ "]").prop("checked", true);
274 elementId
.removeProp('checked');
278 if (elementType
== 'checkbox') {
280 elementId
.removeProp('checked');
282 cj
.each(fieldValue
, function (key
, value
) {
283 cj('input[name="field[' + blockNo
+ '][' + fname
+ '][' + value
+ ']"]').prop('checked', true);
291 var elemtId
= elementId
.attr('id');
292 oEditor
= CKEDITOR
.instances
[elemtId
];
293 oEditor
.setData(htmlContent
);
296 var elemtId
= element
.attr('id');
297 tinyMCE
.get(elemtId
).setContent(htmlContent
);
301 case 'drupalwysiwyg':
304 elementId
.val(fieldValue
);
308 elementId
.val(fieldValue
);
313 // since we use different display field for date we also need to set it.
314 // also check for date time field and set the value correctly
315 if (isDateElement
&& fieldValue
) {
316 setDateFieldValue(fname
, fieldValue
, blockNo
)
320 function setDateFieldValue(fname
, fieldValue
, blockNo
) {
321 var dateValues
= fieldValue
.split(' ');
323 var actualDateElement
= cj('#field_' + blockNo
+ '_' + fname
);
324 var date_format
= actualDateElement
.attr('format');
325 var altDateFormat
= 'yy-mm-dd';
327 var actualDateValue
= cj
.datepicker
.parseDate(altDateFormat
, dateValues
[0]);
329 // format date according to display field
330 var hiddenDateValue
= cj
.datepicker
.formatDate('mm/dd/yy', actualDateValue
);
332 actualDateElement
.val(hiddenDateValue
);
334 var displayDateValue
= actualDateElement
.val();
335 if (date_format
!= 'mm/dd/yy') {
336 displayDateValue
= cj
.datepicker
.formatDate(date_format
, actualDateValue
);
339 cj('#field_' + blockNo
+ '_' + fname
+ '_display').val(displayDateValue
);
341 // need to fix time formatting
343 cj('#field_' + blockNo
+ '_' + fname
+ '_time').val(dateValues
[1].substr(0, 5));