Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | {* |
2 | +--------------------------------------------------------------------+ | |
819d0d41 | 3 | | CiviCRM version 4.5 | |
6a488035 | 4 | +--------------------------------------------------------------------+ |
819d0d41 | 5 | | Copyright CiviCRM LLC (c) 2004-2014 | |
6a488035 TO |
6 | +--------------------------------------------------------------------+ |
7 | | This file is a part of CiviCRM. | | |
8 | | | | |
9 | | CiviCRM is free software; you can copy, modify, and distribute it | | |
10 | | under the terms of the GNU Affero General Public License | | |
11 | | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. | | |
12 | | | | |
13 | | CiviCRM is distributed in the hope that it will be useful, but | | |
14 | | WITHOUT ANY WARRANTY; without even the implied warranty of | | |
15 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | | |
16 | | See the GNU Affero General Public License for more details. | | |
17 | | | | |
18 | | You should have received a copy of the GNU Affero General Public | | |
19 | | License and the CiviCRM Licensing Exception along | | |
20 | | with this program; if not, contact CiviCRM LLC | | |
21 | | at info[AT]civicrm[DOT]org. If you have questions about the | | |
22 | | GNU Affero General Public License or the licensing of CiviCRM, | | |
23 | | see the CiviCRM license FAQ at http://civicrm.org/licensing | | |
24 | +--------------------------------------------------------------------+ | |
25 | *} | |
26 | {if $products} | |
27 | <div id="premiums" class="premiums-group"> | |
28 | {if $context EQ "makeContribution"} | |
29 | <fieldset class="crm-group premiums_select-group"> | |
30 | {if $premiumBlock.premiums_intro_title} | |
31 | <legend>{$premiumBlock.premiums_intro_title}</legend> | |
32 | {/if} | |
33 | {if $premiumBlock.premiums_intro_text} | |
34 | <div id="premiums-intro" class="crm-section premiums_intro-section"> | |
35 | {$premiumBlock.premiums_intro_text} | |
b2603e29 | 36 | </div> |
6a488035 TO |
37 | {/if} |
38 | {/if} | |
39 | ||
40 | {if $context EQ "confirmContribution" OR $context EQ "thankContribution"} | |
41 | <div class="crm-group premium_display-group"> | |
42 | <div class="header-dark"> | |
43 | {if $premiumBlock.premiums_intro_title} | |
44 | {$premiumBlock.premiums_intro_title} | |
45 | {else} | |
46 | {ts}Your Premium Selection{/ts} | |
47 | {/if} | |
48 | </div> | |
49 | {/if} | |
50 | ||
51 | {if $preview} | |
52 | {assign var="showSelectOptions" value="1"} | |
53 | {/if} | |
54 | ||
55 | {strip} | |
56 | <div id="premiums-listings"> | |
57 | {if $showPremium AND !$preview AND $premiumBlock.premiums_nothankyou_position EQ 1} | |
58 | <div class="premium premium-no_thanks" id="premium_id-no_thanks" min_contribution="0"> | |
59 | <div class="premium-short"> | |
60 | <input type="checkbox" disabled="disabled" /> {$premiumBlock.premiums_nothankyou_label} | |
61 | </div> | |
62 | <div class="premium-full"> | |
63 | <input type="checkbox" checked="checked" disabled="disabled" /> {$premiumBlock.premiums_nothankyou_label} | |
64 | </div> | |
65 | </div> | |
b2603e29 | 66 | {/if} |
6a488035 TO |
67 | {foreach from=$products item=row} |
68 | <div class="premium {if $showPremium}premium-selectable{/if}" id="premium_id-{$row.id}" min_contribution="{$row.min_contribution}"> | |
69 | <div class="premium-short"> | |
70 | {if $row.thumbnail}<div class="premium-short-thumbnail"><img src="{$row.thumbnail}" alt="{$row.name}" /></div>{/if} | |
71 | <div class="premium-short-content">{$row.name}</div> | |
72 | <div style="clear:both"></div> | |
73 | </div> | |
74 | ||
75 | <div class="premium-full"> | |
76 | <div class="premium-full-image">{if $row.image}<img src="{$row.image}" alt="{$row.name}" />{/if}</div> | |
77 | <div class="premium-full-content"> | |
78 | <div class="premium-full-title">{$row.name}</div> | |
79 | <div class="premium-full-disabled"> | |
b77dcf46 | 80 | {ts 1=$row.min_contribution|crmMoney}You must contribute at least %1 to get this item{/ts}<br/> |
d6cada7c | 81 | <input type="button" value="{ts 1=$row.min_contribution|crmMoney}Contribute %1 Instead{/ts}" amount="{$row.min_contribution}" /> |
6a488035 TO |
82 | </div> |
83 | <div class="premium-full-description"> | |
84 | {$row.description} | |
85 | </div> | |
86 | {if $showSelectOptions } | |
87 | {assign var="pid" value="options_"|cat:$row.id} | |
88 | {if $pid} | |
89 | <div class="premium-full-options"> | |
90 | <p>{$form.$pid.html}</p> | |
91 | </div> | |
92 | {/if} | |
93 | {else} | |
94 | <div class="premium-full-options"> | |
b2603e29 | 95 | <p><strong>{$row.options}</strong></p> |
6a488035 TO |
96 | </div> |
97 | {/if} | |
98 | {if ( ($premiumBlock.premiums_display_min_contribution AND $context EQ "makeContribution") OR $preview EQ 1) AND $row.min_contribution GT 0 } | |
99 | <div class="premium-full-min">{ts 1=$row.min_contribution|crmMoney}Minimum: %1{/ts}</div> | |
100 | {/if} | |
101 | <div style="clear:both"></div> | |
102 | </div> | |
103 | </div> | |
104 | <div style="clear:both"></div> | |
105 | </div> | |
106 | {/foreach} | |
107 | {if $showPremium AND !$preview AND $premiumBlock.premiums_nothankyou_position EQ 2} | |
108 | <div class="premium premium-no_thanks" id="premium_id-no_thanks" min_contribution="0"> | |
109 | <div class="premium-short"> | |
110 | <input type="checkbox" disabled="disabled" /> {$premiumBlock.premiums_nothankyou_label} | |
111 | </div> | |
112 | <div class="premium-full"> | |
113 | <input type="checkbox" checked="checked" disabled="disabled" /> {$premiumBlock.premiums_nothankyou_label} | |
114 | </div> | |
115 | </div> | |
b2603e29 | 116 | {/if} |
6a488035 TO |
117 | </div> |
118 | {/strip} | |
119 | ||
120 | {if $context EQ "makeContribution"} | |
121 | </fieldset> | |
122 | {elseif ! $preview} {* Close premium-display-group div for Confirm and Thank-you pages *} | |
123 | </div> | |
124 | {/if} | |
125 | </div> | |
b2603e29 | 126 | |
6a488035 TO |
127 | {if $context EQ "makeContribution"} |
128 | {literal} | |
b2603e29 | 129 | <script> |
3cc60a06 | 130 | CRM.$(function($) { |
6a488035 TO |
131 | var is_separate_payment = {/literal}{if $membershipBlock.is_separate_payment}{$membershipBlock.is_separate_payment}{else}0{/if}{literal}; |
132 | ||
133 | // select a new premium | |
b2603e29 | 134 | function select_premium(premium_id) { |
6a488035 TO |
135 | if(cj(premium_id).length) { |
136 | // hide other active premium | |
137 | cj('.premium-full').hide(); | |
138 | cj('.premium-short').show(); | |
139 | // show this one | |
140 | cj('.premium-short', cj(premium_id)).hide(); | |
141 | cj('.premium-full', cj(premium_id)).show(); | |
142 | // record this one | |
143 | var id_parts = premium_id.split('-'); | |
144 | cj('#selectProduct').val(id_parts[1]); | |
145 | } | |
146 | } | |
147 | ||
148 | // click premium to select | |
149 | cj('.premium-short').click(function(){ | |
150 | select_premium( '#'+cj(cj(this).parent()).attr('id') ); | |
151 | }); | |
152 | ||
153 | // select the default premium | |
154 | var premium_id = cj('#selectProduct').val(); | |
155 | if(premium_id == '') premium_id = 'no_thanks'; | |
156 | select_premium('#premium_id-'+premium_id); | |
157 | ||
158 | // get the current amount | |
159 | function get_amount() { | |
160 | var amount; | |
161 | ||
c13cb8db | 162 | if (typeof totalfee !== "undefined") { |
163 | return totalfee; | |
164 | } | |
165 | ||
6a488035 TO |
166 | // see if other amount exists and has a value |
167 | if(cj('.other_amount-content input').length) { | |
168 | amount = Number(cj('.other_amount-content input').val()); | |
169 | if(isNaN(amount)) | |
170 | amount = 0; | |
171 | } | |
172 | ||
173 | function check_price_set(price_set_radio_buttons) { | |
c13cb8db | 174 | if (!amount) { |
6a488035 | 175 | cj(price_set_radio_buttons).each(function(){ |
8539f25d | 176 | if (cj(this).prop('checked')) { |
6a488035 | 177 | amount = cj(this).attr('data-amount'); |
c13cb8db | 178 | if (typeof amount !== "undefined") { |
6a488035 | 179 | amount = Number(amount); |
c13cb8db | 180 | } |
181 | else { | |
182 | amount = 0; | |
6a488035 TO |
183 | } |
184 | } | |
185 | }); | |
186 | } | |
187 | } | |
188 | ||
189 | // check for additional contribution | |
190 | var additional_amount = 0; | |
191 | if(is_separate_payment) { | |
192 | additional_amount = amount; | |
193 | amount = 0; | |
194 | } | |
195 | ||
6a488035 TO |
196 | // make sure amount is a number at this point |
197 | if(!amount) amount = 0; | |
198 | ||
c13cb8db | 199 | // next, check for membership/contribution level price set |
200 | check_price_set('#priceset input[type="radio"]'); | |
201 | ||
6a488035 TO |
202 | // account for is_separate_payment |
203 | if(is_separate_payment && additional_amount) { | |
204 | amount += additional_amount; | |
205 | } | |
206 | ||
207 | return amount; | |
208 | } | |
209 | ||
210 | // update premiums | |
211 | function update_premiums() { | |
212 | var amount = get_amount(); | |
213 | ||
214 | cj('.premium').each(function(){ | |
215 | var min_contribution = cj(this).attr('min_contribution'); | |
216 | if(amount < min_contribution) { | |
217 | cj(this).addClass('premium-disabled'); | |
218 | } else { | |
219 | cj(this).removeClass('premium-disabled'); | |
220 | } | |
221 | }); | |
222 | } | |
223 | cj('.other_amount-content input').change(update_premiums); | |
c13cb8db | 224 | cj('input, #priceset').change(update_premiums); |
6a488035 TO |
225 | update_premiums(); |
226 | ||
227 | // build a list of price sets | |
228 | var amounts = []; | |
229 | var price_sets = {}; | |
c13cb8db | 230 | cj('input, #priceset select,#priceset').each(function(){ |
231 | if (this.tagName == 'SELECT') { | |
232 | var selectID = cj(this).attr('id'); | |
233 | var selectvalues = JSON.parse(cj(this).attr('price')); | |
234 | Object.keys(selectvalues).forEach(function (key) { | |
235 | var option = selectvalues[key].split(optionSep); | |
236 | amount = Number(option[0]); | |
237 | price_sets[amount] = '#' + selectID + '-' + key; | |
238 | amounts.push(amount); | |
239 | }); | |
240 | } | |
241 | else { | |
242 | var amount = Number(cj(this).attr('data-amount')); | |
243 | if (!isNaN(amount)) { | |
244 | amounts.push(amount); | |
6a488035 | 245 | |
c13cb8db | 246 | var id = cj(this).attr('id'); |
247 | price_sets[amount] = '#'+id; | |
248 | } | |
6a488035 TO |
249 | } |
250 | }); | |
251 | amounts.sort(function(a,b){return a - b}); | |
252 | ||
253 | // make contribution instead buttons work | |
254 | cj('.premium-full-disabled input').click(function(){ | |
255 | var amount = Number(cj(this).attr('amount')); | |
c13cb8db | 256 | if (price_sets[amount]) { |
257 | if (!cj(price_sets[amount]).length) { | |
258 | var option = price_sets[amount].split('-'); | |
259 | cj(option[0]).val(option[1]); | |
260 | cj(option[0]).trigger('change'); | |
261 | } | |
262 | else if (cj(price_sets[amount]).attr('type') == 'checkbox') { | |
8539f25d | 263 | cj(price_sets[amount]).prop("checked",true); |
c13cb8db | 264 | if ((typeof totalfee !== 'undefined') && (typeof display == 'function')) { |
265 | if (totalfee > 0) { | |
266 | totalfee += amount; | |
267 | } | |
268 | else { | |
269 | totalfee = amount; | |
270 | } | |
271 | display(totalfee); | |
272 | } | |
273 | } | |
274 | else { | |
275 | cj(price_sets[amount]).click(); | |
276 | cj(price_sets[amount]).trigger('click'); | |
277 | } | |
6a488035 TO |
278 | } else { |
279 | // is there an other amount input box? | |
280 | if(cj('.other_amount-section input').length) { | |
281 | // is this a membership form with separate payment? | |
282 | if(is_separate_payment) { | |
283 | var current_amount = 0; | |
284 | if(cj('#priceset input[type="radio"]:checked').length) { | |
285 | current_amount = Number(cj('#priceset input[type="radio"]:checked').attr('data-amount')); | |
286 | if(!current_amount) current_amount = 0; | |
287 | } | |
288 | var new_amount = amount - current_amount; | |
289 | cj('.other_amount-section input').val(new_amount.toFixed(2)); | |
290 | } else { | |
291 | cj('.other_amount-section input').click(); | |
292 | cj('.other_amount-section input').val(cj(this).attr('amount')); | |
293 | } | |
294 | } else { | |
295 | // find the next best price set | |
296 | var selected_price_set = false; | |
297 | for(var i in amounts) { | |
298 | if(amounts[i] >= amount) { | |
299 | selected_price_set = amounts[i]; | |
300 | break; | |
301 | } | |
302 | } | |
303 | if(!selected_price_set) { | |
304 | selected_price_set = amounts[amounts.length-1]; | |
305 | } | |
c13cb8db | 306 | |
307 | if (!cj(price_sets[selected_price_set]).length) { | |
308 | var option = price_sets[selected_price_set].split('-'); | |
309 | cj(option[0]).val(option[1]); | |
310 | cj(option[0]).trigger('change'); | |
311 | } | |
84495646 | 312 | else if (cj(price_sets[selected_price_set]).attr('type') == 'checkbox') { |
8539f25d | 313 | cj(price_sets[selected_price_set]).prop("checked",true); |
c13cb8db | 314 | if ((typeof totalfee !== 'undefined') && (typeof display == 'function')) { |
315 | if (totalfee > 0) { | |
316 | totalfee += amount; | |
317 | } | |
318 | else { | |
319 | totalfee = amount; | |
320 | } | |
321 | display(totalfee); | |
322 | } | |
323 | } | |
324 | else { | |
84495646 | 325 | cj(price_sets[selected_price_set]).click(); |
326 | cj(price_sets[selected_price_set]).trigger('click'); | |
c13cb8db | 327 | } |
6a488035 TO |
328 | } |
329 | } | |
330 | update_premiums(); | |
331 | }); | |
332 | ||
333 | // validation of premiums | |
334 | var error_message = '{/literal}{ts escape="js"}You must contribute more to get that item{/ts}{literal}'; | |
335 | cj.validator.addMethod('premiums', function(value, element, params){ | |
336 | var premium_id = cj('#selectProduct').val(); | |
337 | var premium$ = cj('#premium_id-'+premium_id); | |
338 | if(premium$.length) { | |
339 | if(premium$.hasClass('premium-disabled')) { | |
340 | return false; | |
341 | } | |
342 | } | |
343 | return true; | |
344 | }, error_message); | |
b2603e29 | 345 | |
6a488035 TO |
346 | // add validation rules |
347 | CRM.validate.functions.push(function(){ | |
348 | cj('#selectProduct').rules('add', 'premiums'); | |
349 | }); | |
b2603e29 | 350 | |
6a488035 TO |
351 | // need to use jquery validate's ignore option, so that it will not ignore hidden fields |
352 | CRM.validate.params['ignore'] = '.ignore'; | |
353 | }); | |
354 | </script> | |
355 | {/literal} | |
356 | ||
357 | {else} | |
358 | {literal} | |
359 | <script> | |
3cc60a06 | 360 | CRM.$(function($) { |
6a488035 TO |
361 | cj('.premium-short').hide(); |
362 | cj('.premium-full').show(); | |
363 | }); | |
364 | </script> | |
365 | {/literal} | |
366 | {/if} | |
367 | {/if} | |
368 |