/**
 * trac_Donate_Js.resource
 * @description Main Javascript resource file for trac_Donate page
 * @author Alex Kong, Traction on Demand
 * @date 2015-05-27
 */


var formValidated = false;
//var edaNum;
//var toppedUp = false;
//
function stage0Binding() {
    stage1Binding();
}

function stage1Binding() {
  postMessageToParent('stage1Binding');
    
    console.log('Called stage1Binding()');       
    
    if (j$('#campNumSearch')){
        j$('#campNumSearch').on('click', function(){
            Visualforce.remoting.Manager.invokeAction(
                remoteMethods.campNumSearch,
                j$('#campNumSearchQuery').val(),
                function(result, event){
                    console.log('campNumSearchQuery: ' + j$('#campNumSearchQuery').val());
                    console.log('campNumSearch result: ', result);
                    if (event.status) {
                        j$('input.overrideCampaignId').val(result[0]);
                        j$('#campaignLookup').attr('src', '/apex/trac_DonateCampaignLookup?cmp=' + encodeURIComponent(result[1]) + '&cmpId=' + result[0]);
                    } else if (event.type === 'exception') {
                        console.log('exception: ', result, event);
                    } else {
                        console.log('unknown error: ', result, event);
                    }
                }
            );
        });
    }
    
    if (j$('input[id$="donationAmount"]').val()){
        j$('label[id$="topUpAmountLabel"]').html(lang == 'fr' ? ('Couvrir les frais de transaction qui nous sont factur&eacute;s (ce qui modifiera le montant de votre don de ' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())).replace('.', ',') + ' $' + '. Ce montant suppl&eacute;mentaire est inclus dans votre plafond annuel de contributions politiques)') : ('Cover the transaction fees we are charged (adds ' + '$' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())) + ' to your donation, which is included against your maximum annual political contribution limit)'));
        
    }
    
    j$('.btn-amount').on('click', function(){
        if (stage == 0 && j$('input[id$="address"]').prop('disabled')){	
            return false;
        }
        
        j$('.btn-amount').removeClass('btn-amount-active');
        j$('.btn-amount').find('.check-icon').removeClass('glyphicon glyphicon-ok');
        j$(this).addClass('btn-amount-active');
        j$(this).find('.check-icon').addClass('glyphicon glyphicon-ok');
        var amt = j$(this).text();
        amt = amt.replace(/[^0-9\.]/g, '');
        if (flow == 'laurier club' && parseFloat(amt) < 800)
            amt = parseFloat(amt) * 12;
        //amt = amt.replace('$', '');
        j$('input[id$="donationAmount"]').val(amt).trigger('change');
        if (j$('input[id$="topUp"]').is(':checked')){
            j$('input[id$="topUpAmount"]').val(calculateTopUp(new Number(j$('input[id$="donationAmount"]').val())));
            j$('input[id$="donationAmount"]').val(addToppedUpAmount(new Number(j$('input[id$="donationAmount"]').val()), new Number(j$('input[id$="topUpAmount"]').val())));
            //toppedUp = true;
        }
        j$('label[id$="topUpAmountLabel"]').html(lang == 'fr' ? ('Couvrir les frais de transaction qui nous sont factur&eacute;s (ce qui modifiera le montant de votre don de ' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())).replace('.', ',') + ' $' + '. Ce montant suppl&eacute;mentaire est inclus dans votre plafond annuel de contributions politiques)') : ('Cover the transaction fees we are charged (adds ' + '$' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())) + ' to your donation, which is included against your maximum annual political contribution limit)'));
        j$('#amount-other').val('');
        //j$('form[id$=form-amount]').valid();
        console.log('amount: ', j$('input[id$="donationAmount"]').val());

        calculateTaxCredit( j$('input[id$="donationAmount"]').val() );
        //amount = j$('input[id$="donationAmount"]').val();

        if (formValidated) {
            validateAmountForm();
        }
    });

    j$('#btn-next-2').on('click', function(){
       stage1Submitted();
    });
    
    if (j$("#amountLabel").html()){
        j$("#amountLabel").html(lang == 'fr' ? (j$("#amountLabel").html().replace('.',',') + ' $') : ('$' + j$("#amountLabel").html())); 

    }
      
    j$('input[id$=topUp]').change(function() {
        if (this.checked) {
            j$('input[id$="topUpAmount"]').val(calculateTopUp(new Number(j$('input[id$="donationAmount"]').val())));
            j$('input[id$="donationAmount"]').val(addToppedUpAmount(new Number(j$('input[id$="donationAmount"]').val()), new Number(j$('input[id$="topUpAmount"]').val())));
        } else {
            j$('input[id$="donationAmount"]').val(removeToppedUpAmount(new Number(j$('input[id$="donationAmount"]').val()), new Number(j$('input[id$="topUpAmount"]').val())));
            j$('input[id$="topUpAmount"]').val('0');
        }
        calculateTaxCredit( j$('input[id$="donationAmount"]').val() );
        console.log('amount: ', j$('input[id$="donationAmount"]').val());
        //alert( 'amount: ' + j$('input[id$="donationAmount"]').val() );
        
        if (j$('.amount-text')){
        	j$('.amount-text').text(lang == 'fr' ? (parseFloat(j$('input[id$="donationAmount"]').val()).toFixed(2).replace('.', ',').replace(',00', '') + ' $') : ('$' + parseFloat(j$('input[id$="donationAmount"]').val()).toFixed(2).replace('.00', '')));
        }  
    });


    
    // jQuery validate on form-amount for all flows except Victory Fund
    if (flow != 'victory fund') {
        j$('form[id$=form-amount]').validate({
            ignore: "",
            errorClass: "error",
            errorPlacement: function(error, element) {
                console.log('errorPlacement element: ', element);
                if (element.attr('id').match(/donationAmount$/)) {
                    if (error.length > 0) {
                        console.log('inserting general form amount error B: ', error);
                        j$('.general-error').empty().append(error).show();
                    } else {
                        j$('.general-error').hide().empty();
                    }
                } else {
                    console.log('inserting regular form field error B');
                    error.insertAfter( element );
                }
            },
            success: function(error) {
                console.log('form validation success B');
                j$('.general-error').hide().empty();
            }
        });

        // make donationAmount field required
        j$('input[id$=donationAmount]').rules('add', {
            required: true,
            min: 5,
            max: flow == 'eda one-time' ? new Number( j$('input[id$=edaLimit]').val() ) : new Number( j$('input[id$=natLimit]').val() ),
            messages: {
                required: errorMessages.selectAmount,
                min: errorMessages.donationRange,
                max: errorMessages.donationRange,
            }
        });
    }

    // check if amount is already set (e.g. came back from stage 2)
    var checkAmount = new Number( j$('input[id$=donationAmount]').val() );
    console.log('checkAmount', checkAmount);
    if (typeof checkAmount != 'undefined' && j$.isNumeric(checkAmount) && checkAmount > 0.00) {
        console.log('setting donationAmount to: ', checkAmount);
        j$('input[id$="amount-other"]').val(checkAmount);
    }

    if (flow == 'national one-time') {
        stage1NationalOneTimeBinding();
    } else if (flow == 'laurier club') {
        stage1LaurierClubBinding();
    } else if (flow == 'eda one-time') {
        stage1RidingOneTimeBinding();
    }
    
}

function stage1NationalOneTimeBinding() {
  postMessageToParent('stage1NationalOneTimeBinding');
    
    console.log('Called stage1NationalOneTimeBinding()');

    bindAmountOtherDynamicFilter();

    j$('#amount-other').on('keypress', function(e){
        if (e.which == 13) {
            e.preventDefault();
            j$('#btn-next-2').click();
        }
    });
}

function stage1LaurierClubBinding() {
    postMessageToParent('stage1LaurierClubBinding');
    
    console.log('Called stage1LaurierClubBinding()');
        

    /**
     *
     * Javascript for first page Laurier Club located in liberal_laurier_club.js
     *
     */
    
    lc_amount.initSelectLists();
    lc_amount.initFormListeners();
    lc_amount.set_is_under_35();
    j$('input[name$=schedule]').trigger('change');
    //if (term) {
      j$('.input-group.date').datepicker({
          autoclose: true,
          language: lang.toLowerCase()
      });
      
      j$('.btn-amount').each(function( index ) {
          var amtParsed = formatLCamount(parseFloat(j$(this).html().replace('$', '').replace(' ', '')), j$('input[name$=schedule]:checked').val() == 'monthly');
          if (lang.toLowerCase() == 'fr') 
              j$(this).html(amtParsed + '$');
          else
              j$(this).html('$' + amtParsed);
          
      });
        
      j$('input[id$="birthdate"]').on('change', function(){       
          var enablePricing35 = false;
          var birthdate = j$('input[id$="birthdate"]').val();
          if (typeof birthdate != 'undefined' && birthdate != null && birthdate != '') {
              console.log('birthdate: ' + birthdate);
              var chunks = birthdate.split('/');
              if (chunks.length >= 3) {
                  var year = parseInt(chunks[2]);
                  var cutoffYear = parseInt( new Date().getFullYear() ) - 35;
                  var cutoffYearMin = parseInt( new Date().getFullYear() ) - 14;
                  console.log('year: ' + year + '; cutoffYear: ' + cutoffYear);
                  if (year > cutoffYear && year < cutoffYearMin) {
                      enablePricing35 = true;
                  }
              }
          }
          console.log('enablePricing35: ', enablePricing35);
          if (enablePricing35) {
              if (!j$('#amount-age-35').is(":visible")) {
                  j$('#amount-age-35').show();
              }
          } else {
              if (j$('#amount-age-35').is(":visible")) {
                  if (j$('#amount-age-35 a').hasClass('btn-amount-active')) {
                      j$('#amount-age-35 a').removeClass('btn-amount-active');
                      j$('#amount-age-35 a').find('.check-icon').removeClass('glyphicon glyphicon-ok');
                      j$('input[id$="donationAmount"]').val('');
                  }
                  j$('#amount-age-35').hide();
              }
          }

      });
      
      j$('select[id$="dob-year"], select[id$="dob-month"], select[id$="dob-day"]').on('change', function(){  
        update_laurier_donation_input(j$('input[name$=schedule]:checked').val()); 
          
          if (j$('input[id$="topUp"]').is(':checked')){
              j$('input[id$="topUpAmount"]').val(calculateTopUp(new Number(j$('input[id$="donationAmount"]').val())));
              j$('input[id$="donationAmount"]').val(addToppedUpAmount(new Number(j$('input[id$="donationAmount"]').val()), new Number(j$('input[id$="topUpAmount"]').val())));
              //toppedUp = true;
          }
          j$('label[id$="topUpAmountLabel"]').html(lang == 'fr' ? ('Couvrir les frais de transaction qui nous sont factur&eacute;s (ce qui modifiera le montant de votre don de ' + displayLCTopUp(new Number(j$('input[id$=donationAmount]').val()), j$('input[name$=schedule]:checked').val() == 'monthly').replace('.', ',') + ' $' + '. Ce montant suppl&eacute;mentaire est inclus dans votre plafond annuel de contributions politiques)') : ('Cover the transaction fees we are charged (adds ' + '$' + displayLCTopUp(new Number(j$('input[id$=donationAmount]').val()), j$('input[name$=schedule]:checked').val() == 'monthly').replace('$', '').replace(' ', '') + ' to your donation, which is included against your maximum annual political contribution limit)'));
          
          j$('.amount-text').text(lang == 'fr' ? (parseFloat(j$('input[id$="donationAmount"]').val()).toFixed(2).replace('.', ',').replace(',00', '') + ' $') : ('$' + parseFloat(j$('input[id$="donationAmount"]').val()).toFixed(2).replace('.00', '')));
          
          calculateTaxCredit( j$('input[id$="donationAmount"]').val() );

    });
    
      j$('input[name$=schedule]').on('change', function(){
        update_laurier_donation_input(j$('input[name$=schedule]:checked').val());
          console.log('schedule dropdown changed: ', jQuery(this).val());
          if (jQuery(this).val() == 'monthly') {            
              j$('#schedule-more-info').html( customLabels.scheduleMonthlyText );
          } else {
              j$('#schedule-more-info').html('');
          }
          
          //alert(j$('input[name$=donationAmount]').val());
          j$('.btn-amount').each(function( index ) {
              var amtParsed = formatLCamount(parseFloat(j$(this).html().replace('$', '').replace(' ', '')), j$('input[name$=schedule]:checked').val() == 'monthly');
              if (lang.toLowerCase() == 'fr') 
                  j$(this).html(amtParsed + '$');
              else
                  j$(this).html('$' + amtParsed);
              
          });
          //alert((j$('input[id$=donationAmount]').val()));
          
          if (j$('input[id$="topUp"]').is(':checked')){
              j$('input[id$="topUpAmount"]').val(calculateTopUp(new Number(j$('input[id$="donationAmount"]').val())));
              j$('input[id$="donationAmount"]').val(addToppedUpAmount(new Number(j$('input[id$="donationAmount"]').val()), new Number(j$('input[id$="topUpAmount"]').val())));
              //toppedUp = true;
          }
          j$('label[id$="topUpAmountLabel"]').html(lang == 'fr' ? ('Couvrir les frais de transaction qui nous sont factur&eacute;s (ce qui modifiera le montant de votre don de ' + displayLCTopUp(new Number(j$('input[id$=donationAmount]').val()), j$('input[name$=schedule]:checked').val() == 'monthly').replace('.', ',') + ' $' + '. Ce montant suppl&eacute;mentaire est inclus dans votre plafond annuel de contributions politiques)') : ('Cover the transaction fees we are charged (adds ' + '$' + displayLCTopUp(new Number(j$('input[id$=donationAmount]').val()), j$('input[name$=schedule]:checked').val() == 'monthly').replace('$', '').replace(' ', '') + ' to your donation, which is included against your maximum annual political contribution limit)'));

          j$('.amount-text').text(lang == 'fr' ? (parseFloat(j$('input[id$="donationAmount"]').val()).toFixed(2).replace('.', ',').replace(',00', '') + ' $') : ('$' + parseFloat(j$('input[id$="donationAmount"]').val()).toFixed(2).replace('.00', '')));
          
          calculateTaxCredit( j$('input[id$="donationAmount"]').val() );

      });

      j$('input[name$=schedule]').rules('add', {required: true});
    
    //}
    
}

function stage1Submitted() {
     //if (j$('input[id$=donationAmount]').valid()) {
        if (validateAmountForm()) {
            if (!term && typeof(window.fbq) == "function"){
                console.log('InitiateCheckout');
                fbq('track', 'InitiateCheckout');
            }
            console.log('form is valid');
            console.log( 'donationAmount: ', j$('input[id$=donationAmount]').val() );
            
            // Send donation amount to parent
            //postAbandonedCartDataMessageToParent('donate_amount', j$('input[id$=donationAmount]').val());

            if (stage != 0)
                submitStage1();
            formValidated = false;
        } else {
            console.log('form is invalid');
            j$('input[id$=donationAmount]').valid();
            if (j$('.general-error').text().trim() == '') {
                j$('.general-error').hide().empty();
            }
            formValidated = true;
        }
}

function formatLCamount(amtParsed, isMonthly){
    if (amtParsed >= 800 && isMonthly) {
        amtParsed = amtParsed / 12;
    } else if (amtParsed < 800) {
        amtParsed = amtParsed * 12;
    }
    return amtParsed.toFixed(2).replace('.00', '');
}

function stage1RidingOneTimeBinding() {
    postMessageToParent('stage1RidingOneTimeBinding');
    
    console.log('Called stage1RidingOneTimeBinding()');

    bindAmountOtherDynamicFilter();

    j$('#amount-other').on('keypress', function(e){
        if (e.which == 13) {
            e.preventDefault();
            j$('#btn-next-2').click();
        }
    });

    j$('select[id$="edaNumber"]').rules('add', {required: true});
    if (getQSParameterByName('eda', window.location.href))
        j$('select[id$="edaNumber"]').val(getQSParameterByName('eda', window.location.href));

}

function stage2Binding() {
  postMessageToParent('stage2Binding');
    callParentWindowForFLEP();
    populateFLEPFromSessionStorage();

    j$('[data-toggle="tooltip"]').tooltip();
    
    if (flow == 'laurier club') {
      //if (!term) {
        lc_amount.render_summary();
      //}
      j$('input[id$="laurierReferred"]').on('change', function(){
          console.log('laurier referred changed: ', j$(this).is(':checked'));
          if (j$(this).is(':checked')) {
            j$('#laurier-referrer-container').slideDown( "slow", function() {
                // Animation complete.
              });
          } else {
            j$('#laurier-referrer-container').slideUp( "slow", function() {
                // Animation complete.
              });
          }
      });
    }

    j$('#btn-next-3').on('click', function(){
        
        console.log('#btn-next-3 clicked');
		stage2Submitted();
        
    });
 

    j$('#btn-back-1').on('click', function(){
        console.log('#btn-back-1 clicked');
        backTo1();
    });
    
    j$('#invalidateParamsLink').attr('href', (window.location.href.indexOf('?') != -1 ? (window.location.href + '&invalidateParams=1') : (window.location.href + '?invalidateParams=1')));  
                
    // logic to set billToFirstName, billToLastName, and billToEmail
    j$('input[id$="firstname"]').on('blur', function(e){
        if (billToFirstName == '' && j$(this).val() != '') {
            console.log('setting billToFirstName to ' + j$(this).val());
            billToFirstName = j$(this).val();
        }
    });
    j$('input[id$="lastname"]').on('blur', function(e){
        if (billToLastName == '' && j$(this).val() != '') {
            console.log('setting billToLastName to ' + j$(this).val());
            billToLastName = j$(this).val();
        }
    });
    j$('input[id$="email"]').on('blur', function(e){
        if (billToEmail == '' && j$(this).val() != '') {
            console.log('setting billToEmail to ' + j$(this).val());
            billToEmail = j$(this).val();
        }
    });

    // contact form validation
    if (!term) {
      // custom phone validation; prevents non numeric char entry
      j$('input[id$="phone"]').on('change keyup', function(e){
          var val = j$(this).val();
          if (val.match(/[^0-9\.]/g)) {
              val = val.replace(/[^0-9\.]/g, '');
              j$(this).val( val );
          }
      });
      
        // custom email regex
        j$.validator.addMethod("emailregex", function(value, element) {
            return this.optional(element) || /^[_A-Za-z0-9-&+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$/.test(value);
        }, errorMessages.invalidEmail);
        

      // custom postal code regex
      j$.validator.addMethod("cdnPostal", function(value, element) {
          return this.optional(element) || value.match(/[a-zA-Z][0-9][a-zA-Z]([ ]?)[0-9][a-zA-Z][0-9]/);
      }, errorMessages.invalidFormat);
    }
    j$('form[id$=form-contact]').validate({
        errorPlacement: function(error, element) {
            if (element.attr('id').match(/isCdn$/)) {
                var tempLabel = j$('label[id$=lbl_isCdn]');
                error.insertAfter(tempLabel);
            } else if (element.attr('id').match(/isInternational$/)) {
                var tempLabel = j$('label[id$=lbl_isInternational]');
                error.insertAfter(tempLabel);
            } else {
                error.insertAfter(element);
            }
        }
    });
    

    j$('select[id$=province]').change(function() {
      if (j$('select[id$=province]').val() == 'Outside Canada')
          window.location.href = carryOverFormData(window.location.href.indexOf('?') != -1 ? (window.location.href + '&eiae=1') : (window.location.href + '?eiae=1'), false, amount);
    });
    
    j$('select[id$=ddlCountries]').change(function() {
        if (j$('select[id$=ddlCountries]').val() == 'Canada'){
            window.location.href = carryOverFormData(window.location.href.replace('&eiae=1', ''), true, amount);
        } 
          
    });
    
    
    
    j$('input[id$=firstname]').rules('add', {required: true});
    j$('input[id$=lastname]').rules('add', {required: true});
    j$('input[id$=address]').rules('add', {required: true});
    j$('input[id$=city]').rules('add', {required: true});
    
    if (!getQSParameterByName('eiae', window.location.href))
      j$('select[id$=province]').rules('add', {required: true});
    if (!term && !getQSParameterByName('eiae', window.location.href)) {
      j$('input[id$=postalcode]').rules('add', {required: true, cdnPostal: true});
      //j$('input[id$=email]').rules('add', {required: true, emailregex: true});
    }
    
    if (!getQSParameterByName('eiae', window.location.href))
      j$('input[id$=postalcode]').rules('add', {required: true});
    j$('input[id$=email]').rules('add', {required: !term});    
    
    if (!getQSParameterByName('eiae', window.location.href))
      j$('input[id$=phone]').rules('add', {required: true});
    
    j$('input[id$=isCdn]').rules('add', {required: true});
    
    
    if (getQSParameterByName('eiae', window.location.href)){
      j$('input[id$=isInternational]').rules('add', {required: true});
      j$('input[id$=postalcodeIntl]').rules('add', {required: true});
      j$('select[id$=ddlCountries]').rules('add', {required: true});
      j$('input[id$=phoneIntl]').rules('add', {required: true});
    } else {
    
        // Canada Post AddressComplete dynamic binding
        //var addressCompleteMarkup = '<link rel="stylesheet" type="text/css" href="https://ws1.postescanada-canadapost.ca/css/addresscomplete-2.30.min.css?key=ud64-nw35-za57-hc93" /><script type="text/javascript" src="https://ws1.postescanada-canadapost.ca/js/addresscomplete-2.30.min.js?key=ud64-nw35-za57-hc93"></script>';
        var addressCompleteMarkup = '<script type="text/javascript" src="https://ws1.postescanada-canadapost.ca/js/addresscomplete-2.40.min.js?key=ud64-nw35-za57-hc93"></script>';
        j$('body').prepend(addressCompleteMarkup);
    }
        
    j$('#btn-gpay').on('click', function(){
        
          j$('div[id$=pnlQDflow]').hide();
          j$('div[id$=captchaPanel]').hide();
          j$('#ccInputContainer').slideUp();
          j$('#cvd_panel').slideUp();
          j$('input[id$=paymentMethod]').val('Google Pay');
        
        if (stage == 0 && j$('input[id$="address"]').prop('disabled')){
          j$('#gpay_button_stage0').show();
          j$('#btn-next-4').hide();
        }

    });
    j$('#btn-creditcard').on('click', function(){
          j$('div[id$=pnlQDflow]').show();
       	  j$('#gpay_panel').hide();
          j$('#ccInputContainer').slideDown();
          j$('#cvd_panel').slideDown();
          j$('input[id$=paymentMethod]').val('Credit Card');
          j$('#gpay_button_stage0').hide();
          j$('div[id$=captchaPanel]').show();
          j$('#btn-next-4').show();
        
        if (j$('#ccSelectorLabel').is(':visible')){
            j$('#ccInputContainer').hide();
            j$('form[id$=form-payment] a.btn-ccNum:first').addClass('btn-amount-active');
            j$('form[id$=form-payment] a.btn-ccNum:first').find('.check-icon').addClass('glyphicon glyphicon-ok');
            var cardNum = j$('form[id$=form-payment] a.btn-ccNum:first').text();
            cardNum = cardNum.replace(/[^0-9\.]/g, '').trim();
            j$('input[id$="selectedCardNum"]').val(cardNum).trigger('change');
            console.log('selected card num: ', j$('input[id$="selectedCardNum"]').val());
    
        }
    });
        
}

function stage2Submitted(){
        
        // send first name, last name, email, id to parent. will need to grab id from URL if present
        var frame_donate_user_data_json = {email: j$('input[id$="email"]').val(), first_name : j$('input[id$="firstname"]').val(), last_name : j$('input[id$="lastname"]').val()};
        var frame_donate_user_data_json_string = JSON.stringify(frame_donate_user_data_json);
        //var frame_donate_user_data_json_string = j$('input[id$="email"]') + ' ' + j$('input[id$="firstname"]') + ' ' + j$('input[id$="lastname"]');
        //postAbandonedCartDataMessageToParent('donate_user_data', frame_donate_user_data_json_string);
        /*if (stage == 0){
            stage2trigger();
        } else {
            if (j$('input[id$="chkQDoptout"]') && j$('input[id$="chkQDoptout"]').is(':checked')){
                j$('#QD_optout_info_modal').modal();
            
                j$("html, body").animate({ scrollTop: j$("#QD_optout_info_modal").offset().top }, 200);
            } else {
                stage2trigger();
            }
        }*/
    	stage2trigger();
}


function stage2trigger(){
    if (j$('form[id$=form-contact]').valid()) {
        console.log('form-contact is valid');
        if (!term && typeof(window.fbq) == "function"){
            console.log('AddPaymentInfo');
            fbq('track', 'AddPaymentInfo');
        }
        if (stage != 0){	
        	showSpinner();
        	submitStage2();
        }
    }
}

function carryOverFormData(url, isIntl, amount){
    if (url.indexOf('?') != -1) {
        if (url.indexOf('?eiae=1') != -1 && isIntl){
            url = url.replace('?eiae=1', '?');
        } else
          url += '&';
    } else
        url += '?';
    
    if (url.indexOf('firstname=') == -1 && url.indexOf('first_name=') == -1)
        url += '&firstname=' + j$('input[id$="firstname"]').val() + '&';
    else
        url = url.replace(('firstname=' + getQSParameterByName('firstname', url)), ('firstname=' + j$('input[id$="firstname"]').val())).replace(('first_name=' + getQSParameterByName('first_name', url)), ('first_name=' + j$('input[id$="firstname"]').val()));
    
    if (url.indexOf('lastname=') == -1 && url.indexOf('last_name=') == -1)
        url += 'lastname=' + j$('input[id$="lastname"]').val() + '&';
    else
        url = url.replace(('lastname=' + getQSParameterByName('lastname', url)), ('lastname=' + j$('input[id$="lastname"]').val())).replace(('last_name=' + getQSParameterByName('last_name', url)), ('last_name=' + j$('input[id$="lastname"]').val()));
    
    if (url.indexOf('address=') == -1 && url.indexOf('addr1=') == -1)
        url += 'address=' + j$('input[id$=address]').val() + '&';
    else
        url = url.replace(('address=' + getQSParameterByName('address', url)), ('address=' + j$('input[id$=address]').val())).replace(('addr1=' + getQSParameterByName('addr1', url)), ('addr1=' + j$('input[id$=address]').val()));
    
    if (url.indexOf('city=') == -1)
        url += 'city=' + j$('input[id$=city]').val() + '&';
    else
        url = url.replace(('city=' + getQSParameterByName('city', url)), ('city=' + j$('input[id$=city]').val()));
    
    if (url.indexOf('province=') == -1 && url.indexOf('state_cd=') == -1 && isIntl)
        url += 'province=' + j$('input[id$=provinceIntl]').val() + '&';
    else
        url = url.replace(('province=' + getQSParameterByName('province', url)), ('province=' + j$('input[id$=provinceIntl]').val())).replace(('state_cd=' + getQSParameterByName('state_cd', url)), ('state_cd=' + j$('input[id$=provinceIntl]').val()));
    
    if (url.indexOf('postal_code=') == -1 && url.indexOf('zip=') == -1)
        url += 'postal_code=' + (isIntl ? j$('input[id$=postalcodeIntl]').val() : j$('input[id$=postalcode]').val()) + '&';
    else
        url = url.replace(('postal_code=' + getQSParameterByName('postal_code', url)), ('postal_code=' + (isIntl ? j$('input[id$=postalcodeIntl]').val() : j$('input[id$=postalcode]').val()))).replace(('zip=' + getQSParameterByName('zip', url)), ('zip=' + (isIntl ? j$('input[id$=postalcodeIntl]').val() : j$('input[id$=postalcode]').val())));
    
    if (url.indexOf('email=') == -1)
        url += 'email=' + j$('input[id$="email"]').val() + '&';
    else
        url = url.replace(('email=' + getQSParameterByName('email', url)), ('email=' + j$('input[id$="email"]').val()));
    
    if (url.indexOf('phone=') == -1)
        url += 'phone=' + (isIntl ? j$('input[id$=phoneIntl]').val() : j$('input[id$=phone]').val()) + '&';
    else
        url = url.replace(('phone=' + getQSParameterByName('phone', url)), ('phone=' + (isIntl ? j$('input[id$=phoneIntl]').val() : j$('input[id$=phone]').val())));
    
   /*if (url.indexOf('eda=') == -1)
      url += 'eda=' + edaNum + '&';
     else
        url = url.replace(('eda=' + getQSParameterByName('eda', url)), ('eda=' + edaNum));*/
    
    if (url.indexOf('&a=') == -1 && url.indexOf('?a=') == -1)
      url += 'a=' + amount;
    else
        url = url.replace(('?a=' + getQSParameterByName('a', url)), ('?a=' + amount)).replace(('&a=' + getQSParameterByName('a', url)), ('&a=' + amount));
    
    return url;
}

function stage3Binding() {
    if (j$('#captchaContainer').is(':visible'))
        j$("#captchaContainer").append(j$("#captchaWorkaround").children(":first"));
    
  	postMessageToParent('stage3Binding');
     
    j$('[data-toggle="tooltip"]').tooltip();
    
    j$('#btn-next-4').on('click', function(){
        console.log('#btn-next-4 clicked'); 
        
        if (stage == 0){
            if (j$('input[id$=paymentMethod]').val() == 'Google Pay'){
                
                if (j$('form[id$=form-amount]').valid()){//force display validation error messages
                } else {
        				j$("html, body").animate({ scrollTop: j$(".general-error").offset().top }, 200);
                } 
                  
                if (j$('form[id$=form-contact]').valid()){} //force display validation error messages
                    
                  if (j$('form[id$=form-amount]').valid() && j$('form[id$=form-contact]').valid()) {
                      showSpinner();
                      submitStage01gp();
                  }
            } else { //else if (j$('input[id$=paymentMethod]').val() == 'Credit Card'){
                if (j$('form[id$=form-amount]').valid()){//force display validation error messages
                } else {
        				j$("html, body").animate({ scrollTop: j$(".general-error").offset().top }, 200);
                } 
                  
                if (j$('form[id$=form-contact]').valid()){} //force display validation error messages
                if (j$('form[id$=form-payment]').valid()){} //force display validation error messages
    
                console.log('stage ' + stage);
                if (j$('form[id$=form-amount]').valid() && j$('form[id$=form-contact]').valid() && j$('form[id$=form-payment]').valid()) {
                    j$('.paymentMethod-error').hide().empty();
                    
                    /*if (j$('input[id$="chkQDoptout"]') && j$('input[id$="chkQDoptout"]').is(':checked')){
                        j$('#QD_optout_info_modal').modal();
                    
                        j$("html, body").animate({ scrollTop: j$("#QD_optout_info_modal").offset().top }, 200);
                    } else {*/
                        showSpinner();
                        console.log('entire form valid');
                        submitStage01();
                        console.log('submitStage0() called');
                    //}
                }
            }
            //} else {
            //    alert('Please select a payment method (TO-DO: replace this alert with an on-form validation error)');
            //}
        } else {
            
            if (j$('form[id$=form-payment]').valid()) {
                showSpinner();
                submitStage3();
            }
        }
       
        
    });

    if (j$('#ccSelectorLabel').is(':visible')){
        j$('#ccInputContainer').hide();
        j$('form[id$=form-payment] a.btn-ccNum:first').addClass('btn-amount-active');
        j$('form[id$=form-payment] a.btn-ccNum:first').find('.check-icon').addClass('glyphicon glyphicon-ok');
        var cardNum = j$('form[id$=form-payment] a.btn-ccNum:first').text();
        cardNum = cardNum.replace(/[^0-9\.]/g, '').trim();
        j$('input[id$="selectedCardNum"]').val(cardNum).trigger('change');
        console.log('selected card num: ', j$('input[id$="selectedCardNum"]').val());

    }
    j$('#ccInputDisplay').on('click', function(){
      j$('#ccInputContainer').slideDown( "slow" );
        j$('.btn-ccNum').removeClass('btn-amount-active');
        j$('.btn-ccNum').find('.check-icon').removeClass('glyphicon glyphicon-ok');
        j$('a[id$="ccInputDisplay"]').hide();
        j$('#lnkQDoptout').hide();
        //j$('input[id$="selectedCardNum"]').val('');
    });
    
    j$('.btn-ccNum').on('click', function(){
        j$('input[id$=ccNumber]').val('');
        j$('a[id$="ccInputDisplay"]').show();
        j$('.btn-ccNum').removeClass('btn-amount-active');
        j$('.btn-ccNum').find('.check-icon').removeClass('glyphicon glyphicon-ok');
        j$(this).addClass('btn-amount-active');
        j$(this).find('.check-icon').addClass('glyphicon glyphicon-ok');
        var cardNum = j$(this).text();
        cardNum = cardNum.replace(/[^0-9\.]/g, '').trim();
        j$('input[id$="selectedCardNum"]').val(cardNum).trigger('change');
        j$('#ccInputContainer').slideUp( "slow" );
        j$('#lnkQDoptout').show();
        console.log('selected card num: ', j$('input[id$="selectedCardNum"]').val());

    });
    
    console.log('Called stage3Binding()');
    if (flow == 'laurier club') {
      //if (!term) {
        lc_amount.render_summary();
      //}
    }
    hideSpinner();
    if (stage != 0)
    	j$("html, body").animate({ scrollTop: j$("#stage3container").offset().top }, 200);
    
    
    if (j$("#amountLabel").html()){
        j$("#amountLabel").html(lang == 'fr' ? (j$("#amountLabel").html().replace('.',',') + ' $') : ('$' + j$("#amountLabel").html())); 
    }
    

    j$('form[id$=form-payment]').validate({
        errorPlacement: function(error, element) {
            if (element.attr('name').match(/paymentMethod$/)) {
                if (error.length > 0) {
                    j$('.paymentMethod-error').empty().append(error).show();
                } else {
                    j$('.paymentMethod-error').hide().empty();
                }
            } else {
                error.insertAfter( element );
            }
        },
        success: function(error) {
            j$('.paymentMethod-error').hide().empty();
        },
        rules: {
            paymentMethod: {
              required: j$('#btn-gpay').is(":visible")
            }
          }
    });
    
    j$('input[id$=ccNumber]').rules('add', {required: true});
    j$('select[id$=expMonth]').rules('add', {required: true});
    j$('select[id$=expYear]').rules('add', {required: true});
    j$("input[id$=ccSecurityCode]").rules('add', {required: window.location.href.indexOf('/apex') == -1, number: true, minlength: 3, maxlength: 4});
      
    j$('#btn-back-2').on('click', function(){
        console.log('#btn-back-2 clicked');
        backTo2();
    });
    
    j$('#lnkQDoptout').on('click', function(){
        j$('#QD_optout_info_modal').modal();
        
        j$("html, body").animate({ scrollTop: j$("#QD_optout_info_modal").offset().top }, 200);
  
    });
}
function handleQDoptout() {
    showSpinner();
    if (!cid)
        cid = j$('input[id$="cid"]').val();
    var stage = getQSParameterByName('stage', window.location.href);
    var isStage0 = stage == '0';
    if (stage == 0)
        amount = j$('input[id$="donationAmount"]').val();
    
    if (isStage0){
        Visualforce.remoting.Manager.invokeAction(remoteMethods.processStage0QDoptout, cid, amount, isStage0, function(result, event){
            hideSpinner();    
            j$('#ccInputContainer').show();
            j$('a[id$="ccInputDisplay"]').hide();
            j$('#lnkQDoptout').hide();
            j$('#tokenSelector').hide();
            if (isStage0){
      
                var redirectUrl = window.location.href;
                if (redirectUrl.indexOf('#') != -1)
                    redirectUrl = redirectUrl.replace('#', '');
                var results = result.split('|');
                if (getQSParameterByName('id', redirectUrl) == ''){
                    redirectUrl += (redirectUrl.indexOf('?') != -1 ? '&id=' : '?id=') + results[0];
                } else {
                    if (redirectUrl.indexOf('&id=') != -1)
                        redirectUrl = redirectUrl.replace(('&id=' + getQSParameterByName('id', redirectUrl)), ('&id=' + results[0]));
                    else
                        redirectUrl = redirectUrl.replace(('?id=' + getQSParameterByName('id', redirectUrl)), ('?id=' + results[0]));
                }
                if (results[1] != ''){
                    if (getQSParameterByName('a', redirectUrl) == ''){
                        redirectUrl += (redirectUrl.indexOf('?') != -1 ? '&a=' : '?a=') + results[1];
                    } else {
                        if (redirectUrl.indexOf('&a=') != -1)
                            redirectUrl = redirectUrl.replace(('&a=' + getQSParameterByName('a', redirectUrl)), ('&a=' + results[1]));
                        else
                            redirectUrl = redirectUrl.replace(('?a=' + getQSParameterByName('a', redirectUrl)), ('?a=' + results[1]));
                    }
                }
                window.location.href = redirectUrl;
            } 
        });
    } else {
        
        Visualforce.remoting.Manager.invokeAction(remoteMethods.processQDoptout, cid, function(result, event){
            hideSpinner();    
            j$('#ccInputContainer').show();
            j$('a[id$="ccInputDisplay"]').hide();
            j$('#lnkQDoptout').hide();
            j$('#tokenSelector').hide();
            setQDoptout();
        });
    }
}

function displayGPayButton() {
    hideSpinner();
    amount = j$('input[id$="donationAmount"]').val();
    cid = j$('input[id$="cid"]').val();
    j$('#gpay_panel').show();
    j$('#btn-next-4').hide();
    j$(".btn-amount").each(function() {
        if (j$(this).hasClass('btn-amount-active'))
            j$(this).removeClass('btn-amount');
    });
    
    
    j$(".btn-amount").hover(function() {
        j$(this).css("background-color","transparent");
        j$(this).css("color","#d71920");
    });
    j$("form[id$=form-amount] :input").prop("disabled", true);
    j$("form[id$=form-contact] :input").prop("disabled", true);
    j$('#gpay_button_stage0').show();
    j$('#changeDonationLink').show();
}
function reopenGpay() {
    if (getQSParameterByName('id', window.location.href) != '')
        window.location.reload();
    else
        window.location.href = window.location.href + '&id=' + cid;
}

function validateAmountForm() {
    var retval = false;
    console.log('inside validateAmountform; form-amount is ' + j$('form[id$=form-amount]').val());
    if (j$('form[id$=form-amount]').valid()) {
        console.log('form-amount is valid');
        j$('.general-error').hide().empty();
        retval = true;
    } else {
        console.log('form-amount is invalid');
    }
    return retval;
}

function calculateTaxCredit(donation_amt) {
    // logic to calculate the tax credit amount
        var tax_savings_amt = 0;
    
        if (j$('input[name$=schedule]'))
            if (j$('input[name$=schedule]:checked').val() == 'monthly')
                donation_amt = parseFloat(donation_amt * 12);

          if (donation_amt <= 400) {
            tax_savings_amt = donation_amt * 0.75;
          } else if (donation_amt > 400 && donation_amt <= 750) {
            tax_savings_amt = ((donation_amt - 400) * 0.5) + 300;
          } else if (donation_amt > 750) {
            tax_savings_amt = ((donation_amt - 750) * 0.3333) + 475;
            if (tax_savings_amt > 650) {
              tax_savings_amt = 650;
            }
          }
    
    	j$('.tax-savings-amount').text(lang=='fr'? tax_savings_amt.toFixed(2).replace('.',',').replace(',00', '') + ' $' : '$' + tax_savings_amt.toFixed(2).replace('.00', ''));
      
      	j$('.donation-tax-savings-text').slideDown( "slow", function() {});
 
}

function displayLCTopUp(amtParsed, isMonthly){
    if (j$('input[id$="topUpAmount"]').val())
        if (j$('input[id$="topUpAmount"]').val() != '0')
            return j$('input[id$="topUpAmount"]').val();
    
    return calculateTopUp(amtParsed);            
}


function displayTopUp(amount) {
    j$('#pnlTopUp').show();
    if (j$('input[id$="topUpAmount"]').val())
        if (j$('input[id$="topUpAmount"]').val() != '0' && j$('input[id$="topUpAmount"]').val() != '0.00'){
            return j$('input[id$="topUpAmount"]').val();
        }
    
    var toppedUpAmount = (amount * 1.02 + 0.10).toFixed(2);
    var topUp = toppedUpAmount - amount;
    if (topUp < 0.50)
        topUp = 0.50
    else {
        var yearlyLimit = 'eda one-time' ? new Number( j$('input[id$=edaLimit]').val() ) : new Number( j$('input[id$=natLimit]').val() );
        if (amount <= yearlyLimit && (amount + topUp) > yearlyLimit ){
            topUp = yearlyLimit - amount; 
        } else if (amount > yearlyLimit){
            topUp = 0;
        }
    }
    if (topUp == 0){
        j$('#pnlTopUp').hide();
    }
    return topUp.toFixed(2);
}

function calculateTopUp(amount) {
    var isMonthly = false;
    if (j$('input[name$=schedule]'))
        if (j$('input[name$=schedule]:checked').val() == 'monthly') {
            isMonthly = true;
        }
    if (isMonthly)
        amount = amount * 12;
    var toppedUpAmount = (amount * 1.02 + 0.10).toFixed(2);
    var topUp = toppedUpAmount - amount;
    var yearlyLimit = 'eda one-time' ? new Number( j$('input[id$=edaLimit]').val() ) : new Number( j$('input[id$=natLimit]').val() );
    if (amount <= yearlyLimit && (amount + topUp) > yearlyLimit ){
        topUp = yearlyLimit - amount; 
    }
    if (isMonthly)
        topUp = Math.floor(topUp / 12 * 100) / 100;
        
    return topUp < 0.50 ? 0.50 : topUp.toFixed(2);
}

function addToppedUpAmount(amount, topUp) {
    /*if (j$('input[name$=schedule]'))
        if (j$('input[name$=schedule]:checked').val() == 'monthly'){
            var monthlyInstalment = parseFloat(amount / 12);
            //alert(monthlyInstalment + parseFloat(calculateTopUp(monthlyInstalment)));
          return (monthlyInstalment + parseFloat(calculateTopUp(monthlyInstalment))).toFixed(2);
        }     */     
    //reduce top up if together with amount it exceeds the yearly limit
    var yearlyLimit = 'eda one-time' ? new Number( j$('input[id$=edaLimit]').val() ) : new Number( j$('input[id$=natLimit]').val() );
    if (amount <= yearlyLimit && (amount + topUp) > yearlyLimit ){
        topUp = yearlyLimit - amount; 
             
        j$('input[id$="topUpAmount"]').val(topUp.toFixed(2));
    }
          
    return (amount + topUp).toFixed(2);
}

function removeToppedUpAmount(amount, topUp) {
    return (amount - topUp).toFixed(2);
}

function bindAmountOtherDynamicFilter() {
    console.log('Inside bindAmountOtherDynamicFilter()');
    j$('#amount-other').on('change keyup', function(e){
        var val = j$(this).val();
        j$('.btn-amount').removeClass('btn-amount-active');
        j$('.btn-amount').find('.check-icon').removeClass('glyphicon glyphicon-ok');
        if (val.match(/[^0-9\.]/g)) {
            val = val.replace(/[^0-9\.]/g, '');
            j$(this).val( val );
        }
        if (j$('input[id$="donationAmount"]').val() != val) {
            j$('input[id$="donationAmount"]').val( j$(this).val() ).trigger('change');
        }
        
        if (j$('input[id$="topUp"]').is(':checked')){
            j$('input[id$="topUpAmount"]').val(calculateTopUp(new Number(j$('input[id$="donationAmount"]').val())));
            j$('input[id$="donationAmount"]').val(addToppedUpAmount(new Number(j$('input[id$="donationAmount"]').val()), new Number(j$('input[id$="topUpAmount"]').val())));
        }
        j$('label[id$="topUpAmountLabel"]').html(lang == 'fr' ? ('Couvrir les frais de transaction qui nous sont factur&eacute;s (ce qui modifiera le montant de votre don de ' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())).replace('.', ',') + ' $' + '. Ce montant suppl&eacute;mentaire est inclus dans votre plafond annuel de contributions politiques)') : ('Cover the transaction fees we are charged (adds ' + '$' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())) + ' to your donation, which is included against your maximum annual political contribution limit)'));
        console.log('amount: ', j$('input[id$="donationAmount"]').val());
        // calculate and display tax credit
        calculateTaxCredit( j$('input[id$="donationAmount"]').val() );
    });
    if (j$('#amount-other-riding').length) {
        j$('#amount-other-riding').on('change keyup', function(e){
            var val = j$(this).val();
            j$('.btn-amount-riding').removeClass('btn-amount-active');
            j$('.btn-amount-riding').find('.check-icon').removeClass('glyphicon glyphicon-ok');
            if (val.match(/[^0-9\.]/g)) {
                val = val.replace(/[^0-9\.]/g, '');
                j$(this).val( val );
            }
            if (j$('input[id$="donationAmountRiding"]').val() != val) {
                j$('input[id$="donationAmountRiding"]').val( j$(this).val() ).trigger('change');
            }
            
            if (j$('input[id$="topUp"]').is(':checked')){
              j$('input[id$="topUpAmount"]').val(calculateTopUp(new Number(j$('input[id$="donationAmountRiding"]').val())));
              j$('input[id$="donationAmountRiding"]').val(addToppedUpAmount(new Number(j$('input[id$="donationAmountRiding"]').val()), new Number(j$('input[id$="topUpAmount"]').val())));
                //toppedUp = true;
            }
          j$('label[id$="topUpAmountLabel"]').html(lang == 'fr' ? ('Couvrir les frais de transaction qui nous sont factur&eacute;s (ce qui modifiera le montant de votre don de ' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())).replace('.', ',') + ' $' + '. Ce montant suppl&eacute;mentaire est inclus dans votre plafond annuel de contributions politiques)') : ('Cover the transaction fees we are charged (adds ' + '$' + displayTopUp(new Number(j$('input[id$="donationAmount"]').val())) + ' to your donation, which is included against your maximum annual political contribution limit)'));
            console.log('amountRiding: ', j$('input[id$="donationAmountRiding"]').val());
          calculateTaxCredit( j$('input[id$="donationAmount"]').val() );
        });
    }
}

function showSpinner() {
    j$('#spinner-overlay').show();
    var offset = Math.round( j$('#spinner').width() / 2 );
    j$('#spinner').css('left', ((window.innerWidth / 2) - offset) + 'px' ).show();
}

function hideSpinner() {
    console.log('hideSpinner() called');
    j$('#spinner').hide();
    j$('#spinner-overlay').hide();
}

function victoryFundStage1Binding() {
    stage2Binding();
}

function victoryFundStage2Binding() {
    stage1Binding();
}

function victoryFundStage3Binding() {
    stage3Binding();
}


  var update_laurier_donation_input = function(donationFlow) {
    if (donationFlow) {
      var donation_input_amount;
      if (is_under_35) {
        switch (donationFlow) {
          case 'monthly':
            // 12 X 62.50 = 800. The backend divides the donation amount by 12 if the schedule is 'monthly'. The annual amount is needed. 
            donation_input_amount = Math.ceil(800 / 12 * 100) / 100; //multiplying by 100, rounding up and dividing by 100 ensures we round up to the nearest 2 decimal point
            break;
          case 'onetime':
            donation_input_amount = 800;
            break;
          case 'annually':
            donation_input_amount = 800;
            break;
        }
      } else {
        switch (donationFlow) {
          case 'monthly':
            // 12 X 125 = 1600. The backend divides the donation amount by 12 if the schedule is 'monthly'. The annual amount is needed. 
            donation_input_amount = Math.ceil(1600 / 12 * 100) / 100; //multiplying by 100, rounding up and dividing by 100 ensures we round up to the nearest 2 decimal point

            break;
          case 'onetime':
            donation_input_amount = 1600;

            break;
          case 'annually':
            donation_input_amount = 1600;

            break;
        }
      }

      j$('input[id$=donationAmount]').val(donation_input_amount.toFixed(2));
    }
  };