'use strict';

var currentPage = 1;

(function () {
	'use strict';

	//initialize popover
	$(function () {
		$('[data-toggle="popover"]').popover()
	});

	setPage1Validator();

	var page1Validator = $('#d400form_page1').validate({ // initialize form page 1
		errorClass: "is-invalid",
		validClass: "is-valid",		
		errorPlacement: function (error, element) {
			error.insertAfter(element).wrap('<div class="invalid-feedback"><i class="glyphicon glyphicon-exclamation-sign"></i>');
		},
		rules: {
			periodbegindate: {
				periodBeginDateRegex: "#periodenddate",
			},
			periodenddate: {
				periodEndDateRegex: "#periodbegindate",
			},
			primaryfirstname: {
				required: true,
				primaryFirstNameRegex: true,
			},
			primarymiddleinit: {
				required: false,
				primaryInitRegex: true,
			},
			primarylastname: {
				required: true,
				primaryLastNameRegex: true,
			},
			primaryssn: {
				required: true,
				ssnRegex: true,
				invalidSSNRegex: true,
				notSequenceSSN: true,
			},
			secondaryfirstname: {
				required: true,
				primaryFirstNameRegex: true,
			},
			secondarymiddleinit: {
				required: false,
				primaryInitRegex: true,
			},
			secondarylastname: {
				required: true,
				primaryLastNameRegex: true,
			},
			secondaryssn: {
				required: true,
				ssnRegex: true,
				invalidSSNRegex: true,
				notSequenceSSN: true,
				notEqual: "#primaryssn",
			},
			address1: {
				required: true,
				minlength: 2,
				addressRegex: true,
			},
			address2: {
				required: false,
                minlength: 2,
				addressRegex: true,
			},
			city: {
				required: true,
                minlength: 2,
                cityUSARegex: {
                     depends: function(element) {
         	              return ($("#country").val() === "USA");
                     }
                }, 
            },
			zipcode: {
				required: {
					depends: function (element) {
						return ($("#country").val() === "USA" || $("#country").val() === "CANADA");
					}
				},
				maxlength: {
					param: function (element) {
						if ($("#country").val() === "USA") {
							return 10;
						} else if ($("#country").val() === "CANADA") {
							return 7;
						}
					},
					depends: function (element) {
						return ($("#country").val() === "USA" || $("#country").val() === "CANADA");
					},
				},
				zipcodeRegex: {
					depends: function (element) {
						return $("#country").val() === "USA";
					}
				},
				zipcodeCanadaRegex: {
					depends: function (element) {
						return $("#country").val() === "CANADA";
					}
				},
				normalizer: function (value) {
					if ($("#country").val() === "CANADA" && value.length < 7) {
						return value;
					} else {
						return $.trim(value);
					}
				}
			},
			name: {
				required: true,
				contactRegex: true,
			},
			phone: {
				required: true,
				phoneRegex: true,
			},
			email: {
				required: true,
				normalizer: function (value) {
					// Update the value of the element
					this.value = $.trim(value);
					// Use the trimmed value for validation
					return this.value;
				},
				email: true,
			},
		},
		messages: {
			address1: {
				minlength: jQuery.validator.format("This field should contain at least {0} numbers or characters."),
			},
			email: {
                email: jQuery.validator.format("Please enter a valid email address."),
			}
		}
	});

	$("#periodbegindate").on("dp.change", function (e) {
		//invoke validation on periodenddate field when periodbegindate field changes
		page1Validator.element("#periodenddate");
	});

	$("#periodenddate").on("dp.change", function (e) {
		//invoke validation on periodbegindate field when periodenddate field changes
		page1Validator.element("#periodbegindate");
	});

	$('#nextButton').click(function (event) {
		if ($('#d400form_page1').valid()) {
			// code to reveal step 2 and hide step 1
			currentPage++;
			document.getElementById("fset1").setAttribute("style", "display: none");
			document.getElementById("fset2").setAttribute("style", null);
			document.getElementById("fset3").setAttribute("style", "display: none");
			$('#step1').removeClass("pageActive").addClass("pageFilled");
			$('#step2').removeClass("pageDisabled pageFilled").addClass("pageActive");

			let payorfile = document.getElementById("paymentType").value;
			if (payorfile === "NONE") {
				$('#fset22').hide();
				$('#fset21').hide();
				$('#type').hide();
			} else {

				if ($('#type').val() === "ACH") {
					$('#fset22').hide();
					$('#fset21').show();
				}
				if ($('#type').val() === "CC") {
					$('#fset21').hide();
					$('#fset22').show();
				}
			}
		}
	});

	setPage2Validator();

	var page2Validator = $('#d400form_page2').validate({ // initialize form 2
		errorClass: "is-invalid",
		validClass: "is-valid",
		errorPlacement: function (error, element) {
			error.insertAfter(element).wrap('<div class="invalid-feedback"><i class="glyphicon glyphicon-exclamation-sign"></i>');
		},
		rules: {
			cardamount: {
				required: true,
				amountRegex: true,
				greaterThan0: true,
                cardTotalLimit: true,
			},
			bankamount: {
				required: true,
				amountRegex: true,
				greaterThan0: true,
				bankamountLimit: true,
			},
			routingNumber: {
				required: true,
				normalizer: function (value) {
					return $.trim(value);
				},
				digits: true,
				minlengthReg: {length: 9, value: "routing number"},
			},
			account: {
				required: true,
				normalizer: function (value) {
					return $.trim(value);
				},
				digits: true,
				minlengthReg: {length: 5, value: "account number"},
                maxlength: 17,
			},
			accountTwo: {
				required: true,
				normalizer: function (value) {
					return $.trim(value);
				},
				digits: true,
				minlengthReg: {length: 5, value: "account number"},
				maxlength: 17,
				equalTo: "#account",
			},
			creditcardnumber: {
				required: true,
				normalizer: function (value) {
					return $.trim(value);
				},
				digits: true,
				minlengthReg: {length: 16, value: "credit card number"},
			},
			cardzip: {
				required: true,
				normalizer: function (value) {
					return $.trim(value);
				},
				digits: true,
				minlengthReg: {length: 5, value: "zip code"},
			},
			expmonth: {
				cardExpired: true,
			},
			taxLiability: {
			    minTaxAmount: 0,
			},
			paymentsForYear: {
				minTaxAmount: 0,
			},
            settlementdate: {
                settlementDateInvalid: true,
            },
		},
       messages: {
          accountTwo: {
             equalTo: jQuery.validator.format("The account numbers don’t match, please reenter."),
          },
       }
	});

	$("#expyear").bind("change", function (e) {
		//invoke validation on month field when year field changes
		page2Validator.element("#expmonth");
	});
		
	$("#cardamount").bind("change", function (e) {
		var amount = document.getElementById("cardamount").value.replace(/,/g, "");

		if ($.isNumeric(amount)) {
            setCreditCardFields(parseFloat(amount)); 
			page2Validator.element("#cardtotal");
		}
	});

	// handles the subtraction of the payments for the year from the tax liability and places value in the total due field
	$(function () {
		$("#taxLiability, #paymentsForYear").on("change", subtract);


		function subtract() {

			var amount = document.getElementById("taxLiability").value;
			var payment = document.getElementById("paymentsForYear").value;
			var totaldue = document.getElementById("totaldue").value;
 

            
			if (!amount) {
				amount = "0";
			}
			if (!payment) {
				payment = "0";
			}
			if (!totaldue) {
				totaldue = "0"
			}

            amount = amount.replace(/,/g, "");
            payment = payment.replace(/,/g, "");
		    totaldue = totaldue.replace(/,/g, "");			
			
			if ($.isNumeric(amount) && $.isNumeric(payment) && $.isNumeric(totaldue)) {			

				$("#taxLiability").val(parseInt(amount.replace(/,/g, ""), 10).toString().replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,"));
				$("#paymentsForYear").val(parseInt(payment.replace(/,/g, ""), 10).toString().replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,"));
	   
                totaldue = amount - payment;			

				if (totaldue < 0) {
					totaldue = "0";
				}

				var total = totaldue.toString();
				$("#totaldue").val(total.replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,"));
                $("#bankamount").val(totaldue.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,'));
                $("#cardamount").val(totaldue.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,'));
           }

		}
    });



	$('#nextPaymentButton').click(function (event) {
		if ($('#d400form_page2').valid()) {
            window.scrollTo(0, 0);
			// code to reveal step 2 and hide step 1
			currentPage++;
			document.getElementById("fset1").setAttribute("style", "display: none");
			document.getElementById("fset2").setAttribute("style", "display: none");
			$('#step2').removeClass("pageActive").addClass("pageFilled");
			$('#step3').removeClass("pageDisabled pageFilled").addClass("pageActive");

			var theTemplateScript = $("#templateCommonPayment").html();
			// Compile the template
			var theTemplate = Handlebars.compile(theTemplateScript);
			// Define our data object
			var context = {};


			if (document.getElementById("paymentType")) {

				context.paymentType = document.getElementById("paymentType").value;
			}


			let payorfile = document.getElementById("paymentType").value;
            let type = document.getElementById("type").value;
			if (type === "ACH") {
				document.getElementById("fset21").setAttribute("style", "display: none");
				setACHContext(context);
			}
			if (type === "CC") {
				document.getElementById("fset22").setAttribute("style", "display: none");
				setCCContext(context);
			}

			if (payorfile === "NONE") {

				resetPaymentContext(context);
			}

			//show 3rd page of the form
			document.getElementById("fset3").removeAttribute("style");

			if (document.getElementById("totaldue")) {
				context.totaldue = document.getElementById("totaldue").value;
			}

			// Pass our data to the template
			theCompiledHtml = theTemplate(context);
			// Add the compiled html to the page
			$('.payment').html(theCompiledHtml);

			//Use Handlebar to display common info
			theTemplateScript = $("#templateCommon").html();

			// Compile the template
			theTemplate = Handlebars.compile(theTemplateScript);
			// Define our data object
			context = {};
		    var radioValue = $("input[name='yearOption']:checked").val();     
            if (radioValue === "Fiscal Year") {           
              if (document.getElementById("periodbegindate")) {
                  context.periodBeginDate = document.getElementById("periodbegindate").value;
              }
              if (document.getElementById("periodenddate")) {
                  context.periodEndDate = document.getElementById("periodenddate").value;
              }
            } else {
                context.year = document.getElementById("yearOption").value;
            }
		
			if (document.getElementById("yearOption")) {
				context.year = document.getElementById("yearOption").value;
			}
			if (document.getElementById("periodbegindate")) {
				context.periodBeginDate = document.getElementById("periodbegindate").value;
			}
			if (document.getElementById("periodenddate")) {
				context.periodEndDate = document.getElementById("periodenddate").value;
			}
			if (document.getElementById("outOfCountry")) {
				context.outOfCountry = document.getElementById("outOfCountry").value;
			}
            setCommonContext(context);
		
			if (document.getElementById("taxLiability")) {
				context.taxLiability = document.getElementById("taxLiability").value;
			}
			if (document.getElementById("paymentsForYear")) {
				context.paymentsForYear = document.getElementById("paymentsForYear").value;
			}
			if (document.getElementById("totaldue")) {
   			    context.totaldue = document.getElementById("totaldue").value;
			}


			// Pass our data to the template
			var theCompiledHtml = theTemplate(context);
			// Add the compiled html to the page
			$('.paymentCommon').html(theCompiledHtml);
		}
	});

	$('#dorSubmitButton').click(function (event) {
		var dataArray = $('#d400form_page1').serializeArray().concat($('#d400form_page2').serializeArray());

		if (!event.isDefaultPrevented()) {
			event.preventDefault();
			$('#dorSubmitButton').attr("disabled", true);
			$('#cancelLinkReviewButton').attr("disabled", true);
            $('#toPage2Button').attr("disabled", true);
			var successFormJSONObject = {};
			successFormJSONObject.title = "D-410: Extension for Filing Individual Income Tax Return";
            var radioValue = $("input[name='yearOption']:checked").val();       
            if (radioValue === "Fiscal Year") {
                 successFormJSONObject.periodBeginDate = $('#periodbegindate').val();
			     successFormJSONObject.periodEndDate = $('#periodenddate').val();
            } else {
                 successFormJSONObject.year = $('#yearOption').val();
            }
			successFormJSONObject.outOfCountry = $('#outOfCountry').val();
			successFormJSONObject.filingStatus = $('#filingstatus').val();
			successFormJSONObject.primaryFirstName = $('#primaryfirstname').val();
			successFormJSONObject.primaryLastName = $('#primarylastname').val();
			successFormJSONObject.primaryMiddleInit = $('#primarymiddleinit').val();
			successFormJSONObject.primarySSN = $('#primaryssn').val().replace(/-/g, "");
			successFormJSONObject.address1 = $('#address1').val();
			successFormJSONObject.address2 = $('#address2').val();
			successFormJSONObject.city = $('#city').val();
			if ($('#country').val() === "USA" || $('#city').val() === "CANADA") {
				successFormJSONObject.state = $('#state').val();
			} else {
				successFormJSONObject.state = $('#foreignState').val();
			}
			successFormJSONObject.zipCode = $('#zipcode').val();
			successFormJSONObject.phone = $('#phone').val().replace(/-/g, "");;
			successFormJSONObject.name = $('#name').val();
			if ($('#filingstatus').val() === "Married Filing Jointly") {
				successFormJSONObject.secondaryFirstName = $('#secondaryfirstname').val();
				successFormJSONObject.secondaryLastName = $('#secondarylastname').val();
				successFormJSONObject.secondaryMiddleInit = $('#secondarymiddleinit').val();
				successFormJSONObject.secondarySSN = $('#secondaryssn').val().replace(/-/g, "");
			}

			var ajaxJSONString = "";
			var JSONString = "";

            if (radioValue.trim() !== "Fiscal Year") {
                 dataArray.push({"name": "year", "value": $("#yearOption").val()});
            }
            var filteredArray = dataArray.map(function(item) {                   
                 if (item.name.trim() === 'periodbegindate' || item.name.trim() === 'periodenddate' ) {                     
                   if (radioValue.trim() === "Fiscal Year") {               
     			        item.value = moment(item.value).format("MM/DD/YYYY");  
                   } else {
                        item.value = ""; 
                   }
                 }         
                 return item;                                           
           });
		   //remove fields with empty values
		   filteredArray = dataArray.filter(function (item) {
				if (!!item.value) {
					return item
				}
			});
           
			var zipArray = filteredArray.filter(function (item) {
				if (item.name === 'zipcode') {
					return item
				}
			});
			if (zipArray.length === 0) {
				filteredArray.push({
					"name": "zipcode",
					"value": ""
				});
			}

			filteredArray = filteredArray.filter(function (item) {
				if (item.name !== "foreignState") {
					return item
				}
			});
			if (!($('#country').val() === "USA" || $('#city').val() === "CANADA")) {
				filteredArray = filteredArray.map(function (item) {
					if (item.name === "state") {
						item.value = "NN";
					}
					return item;
				});
			}


			if ($('#paymentType').val() === "NONE") {
				successFormJSONObject.taxLiability = $('#taxLiability').val();
				successFormJSONObject.paymentsForYear = $('#paymentsForYear').val();
				successFormJSONObject.totaldue = $('#totaldue').val();
				successFormJSONObject.paymentType = $('#paymentType').val();
				successFormJSONObject.paymentType = "NONE";
				//	successFormJSONObject.type = $('#type').val();

				filteredArray.push({
					"name": "type",
					"value": "NONE"
				});

			} else {
				var type = jQuery.grep(filteredArray, function (item) {
					if (item.name === 'type') {
						return item
					}
				})[0];
				var finalAmount;
				var bankAmount;
				var cardAmount;
				if (type.value === 'ACH') {
					filteredArray = filteredArray.filter(function (item) {
						if (item.name.trim() !== 'creditcardtype') {
							return item
						}
					});
					finalAmount = jQuery.grep(filteredArray, function (item) {
						if (item.name === 'bankamount') {
							return item
						}
					})[0];
					bankAmount = finalAmount.value.replace(/,/g, "");
					filteredArray.push({
						"name": "amount",
						"value": bankAmount
					});
					successFormJSONObject.bankamount = bankAmount;
					successFormJSONObject.account = $('#account').val();
					successFormJSONObject.routingNumber = $('#routingNumber').val();
					successFormJSONObject.paymentType = "ACH";
					successFormJSONObject.settlementDate = $('#settlementdate').val();
                    var bankdraftdate = moment(new Date($('#settlementdate').val())).prevBusinessDay().format("MM/DD/YYYY")
                    filteredArray.push({"name": "bankdraftdate", "value": bankdraftdate});
				} else {
					filteredArray.push({
						"name": "settlementdate",
						"value": moment(defaultDraftDate).format("MM/DD/YYYY")
					});
					finalAmount = jQuery.grep(filteredArray, function (item) {
						if (item.name === 'cardamount') {
							return item
						}
					})[0];
					cardAmount = finalAmount.value.replace(/,/g, "");
					filteredArray.push({
						"name": "amount",
						"value": cardAmount
					});
					filteredArray.push({
						"name": "cardtotal",
						"value": $('#cardtotal').val().replace(/,/g, "")
					});
					successFormJSONObject.cardtotal = $('#cardtotal').val();
					successFormJSONObject.cardamount = cardAmount;
					successFormJSONObject.fee = $('#fee').val();
					successFormJSONObject.creditCardNumber = $('#creditcardnumber').val();
					successFormJSONObject.cardzip = $('#cardzip').val();
					successFormJSONObject.creditCardType = $('#creditcardtype').val();
					successFormJSONObject.paymentType = "CC";
				}

				successFormJSONObject.taxLiability = $('#taxLiability').val();
				successFormJSONObject.paymentsForYear = $('#paymentsForYear').val();
				successFormJSONObject.totaldue = $('#totaldue').val();

			}

			var newDataArray = filteredArray.map(function (item) {
				if (item.name.trim() === 'settlementdate' || item.name.trim() === 'bankdraftdate') {
					item.value = moment(item.value).format("MM/DD/YYYY");
				}
				if (item.name.trim() === 'bankamount' || item.name.trim() === 'cardamount' || item.name.trim() === 'fee' || item.name.trim() === 'totaldue' || item.name.trim() === 'paymentsForYear' || item.name.trim() === 'taxLiability' ) {
					item.value = item.value.replace(/,/g, "");
				}
				if (item.name.trim() === 'primaryssn' || item.name.trim() === 'secondaryssn' || item.name.trim() === 'phone') {
					item.value = item.value.replace(/-/g, "");
				}
				return item;
			});



			var JSONString = '{"formtype":"D410",' +
				' "formfields":' + JSON.stringify(newDataArray) + '}';

			JSONString = JSONString.replace(/,\s*$/, "");
                        var timeout = parseInt(15);
			$.ajax({
				url: '/ncdorformhandler/formhandler/process',
				type: 'post',
				async: true,
				dataType: 'json',
				contentType: 'application/json',
				data: JSONString,
                timeout: timeout * 1000,
				success: function (ajaxJSONString) {
					var theData = JSON.parse(ajaxJSONString);
					if (theData) {
						successFormJSONObject.confirmationNumber = theData.confirmationNumber
						successFormJSONObject.formName = "D410";
						successFormJSONObject.submittedform = window.location.pathname;
						$('#formJson').val(JSON.stringify(successFormJSONObject));
						$('#paramName').val("formJson");
						$('#successForm').submit();
                        var pageURL = $(location).attr("href");                          
                        var count = 0;
                        setInterval(function() {
                            pageURL = $(location).attr("href");                            
                            if (!pageURL.includes("ncdorconfirmation")) {
                              count ++;
                            };
                            if (count === timeout) {                              
                                $('#submissionTimeoutModal').modal('show');
                            };
                        }, 1000);        
					} else {
                        var errorCodeName = "UNKNOWN";
                        $('.eachErrors').css('visibility', 'hidden');                     
                        $("#" + errorCodeName + "").clone().appendTo(".errorMessage");
				        $(".errorMessage #" + errorCodeName + "").css('visibility', 'visible');
                    }
				},
				error: function (jqXHR, textStatus, errorThrown) {
					var errorCodeName = "";
                    if (jqXHR.readyState === 4 && jqXHR.responseJSON) {
				         var errorRes = JSON.parse(jqXHR.responseJSON);
				         errorCodeName = errorRes.errorCode.toUpperCase();
				         $(".errMessage").html("");
				         errorCodeName = errorCodeName + "_" + successFormJSONObject.paymentType;           
				         $('.eachErrors').css('visibility', 'hidden');                     
                         $("#" + errorCodeName + "").clone().appendTo(".errorMessage");
				         $(".errorMessage #" + errorCodeName + "").css('visibility', 'visible');
                    } else {
                           if (textStatus === "timeout") {                               
                              $('#submissionTimeoutModal').modal('show');
                           } else {                                
                              errorCodeName = "UNKNOWN";
                              $('.eachErrors').css('visibility', 'hidden');                     
                              $("#" + errorCodeName + "").clone().appendTo(".errorMessage");
				              $(".errorMessage #" + errorCodeName + "").css('visibility', 'visible');
                           }
                    }
				},
			});
		}
	})
})();

// on load set the title of the content into the header
$(document).ready(function () {
	$("#formTitleSpan").html(
		"D-410"
	);
    window.scrollTo(0, 0);
});
