var errorClass = "error";
var contextPath = "/srv/www";
var validationResponseOK = "status:OK";
var validationTargetUrl = "/buildSaving/validationAction.do?value=";
var birthNumberSeparator = "/";

//calculates age from date (entered as string) e.g. 25.7.1980
function calculateAge(bornDay){
	 if (bornDay==null) {
		 return null;
	 }
	 var firstDot = -1;
	 var lastDot = -1;
	 if ((firstDot=bornDay.indexOf("\."))==-1)
	 {
		 return;
	 }
	 if ((lastDot=bornDay.lastIndexOf("\."))==-1)
	 {
		return;
	 }
	 var bornDateDay = parseInt(bornDay.substring(0, firstDot),10);
	 var bornDateMonth = parseInt(bornDay.substring(firstDot+1, lastDot),10);
	 var bornDateYear = parseInt(bornDay.substring(lastDot+1, bornDay.length),10);
	 var now = new Date();
	 var currentMonth = now.getMonth()+1;
	 var currentDay = now.getUTCDate();
	 var years = now.getFullYear()-bornDateYear;
	 if (years<0)
	 {
		 return;
	 }
	 var birthday = false;
	 if ((currentMonth>bornDateMonth))
	 {
		  birthday = true;
	 }
	 else if ((currentMonth==bornDateMonth)&&(currentDay>=bornDateDay)) {
		  birthday = true;
	 }
	 if (!birthday&&years>0) {
		 years--;
	 }
	 if (years>100) {
		 years = 100;
	 }
	 return years;
}

function cleanUpMessages(component) {
	var jComponent = $(component);
	jComponent.parent().removeClass(errorClass);
	var messageContainer = jComponent.parent().find("span.inlineMessageContainer");
	messageContainer.find("span.helpmsg").show();
	messageContainer.find("span.errormsg").remove();
	messageContainer.find("span.noerrormsg").remove();
};

function cleanUpMessagesAndValue(component) {
	cleanUpMessages(component);
	$(component).val('');
};

function showErrorMessage(component, message) {
	var jComponent = $(component);
	jComponent.parent().addClass(errorClass);
	var messageContainer = jComponent.parent().find("span.inlineMessageContainer");
	messageContainer.find("span.helpmsg").hide();
	messageContainer.find("span.errormsg").remove();
	messageContainer.find("span.noerrormsg").remove();
	messageContainer.append("<span class=\"errormsg\">"+message+"</span>");
};

function removeErrorAndAddInfoMessage(component, message) {
	var jComponent = $(component);
	jComponent.parent().removeClass(errorClass);
	var messageContainer = jComponent.parent().find("span.inlineMessageContainer");
	messageContainer.find("span.helpmsg").hide();
	messageContainer.find("span.errormsg").remove();
	messageContainer.find("span.noerrormsg").remove();
	if (message=="") {
		message = "&nbsp;";
	}
	if (message!=null)
	{
		messageContainer.append("<span class=\"noerrormsg\">"+message+"</span>");
	}
};

function parseValidationResponse(responseText) {
	var resultArray = new Array(false, "");
	var messagePrefix = "message:";
	resultArray[0] = responseText.indexOf(validationResponseOK)==0;
	var index = responseText.indexOf(messagePrefix);
	if (index>0) {
		resultArray[1] = responseText.substr(index+messagePrefix.length, responseText.length);
	}
	return resultArray;
};

function checkCommon(sourceValue, jComponent, errorMessageHandler, infoMessageHandler, type, required) {
	var result = false;
	if (!required && (sourceValue==null || sourceValue == "")) {
		//perform messages cleanup for void and unused values
		cleanUpMessages(jComponent);
		return result;
	}
	var url = contextPath+ validationTargetUrl+sourceValue+"&type="+type;
	$.get(url,
		function(data)
		{
			var parsedResponse = parseValidationResponse(data);
			result =  parsedResponse[0];
			if (!result) {
				errorMessageHandler(jComponent, parsedResponse[1]);
			} else {
				infoMessageHandler(jComponent, parsedResponse[1]);				
			}
		});
	return result;
};

function checkMonthlyDeposit(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler, "monthlyDeposit", true);
}

function checkDate(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler, "date", true);
};

function checkIco(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"ico",  true);
};

function checkRequired(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler, "required", true);
//	if (jComponent.val()!=""&&jComponent.val()!=null) {
//		infoMessageHandler(jComponent,"");		
//	} else {
//		errorMessageHandler(jComponent, "Položku je nutné vyplnit.");
//	}
};

function checkIdentificationCard(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"identificationCard", true);
};

function checkIdentificationCardDate(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"identificationCardDate", true);
};

function checkPhoneNumber(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"phone", true);
};

function checkPhoneNumberNotRequired(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"phone", false);
};

function checkStreeNumber(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"streeNumber", true);
};

function checkPostCode(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"postCode", true);
};

function checkEmail(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"email", true);
};

function checkCaptcha(jComponent, errorMessageHandler, infoMessageHandler) {
	return checkCommon(jComponent.val(), jComponent, errorMessageHandler, infoMessageHandler,"captcha", true);
};

new function($) {
  $.fn.setCursorPosition = function(pos) {
    if ($(this).get(0).setSelectionRange) {
      $(this).get(0).setSelectionRange(pos, pos);
    } else if ($(this).get(0).createTextRange) {
      var range = $(this).get(0).createTextRange();
      range.collapse(true);
      range.moveEnd('character', pos);
      range.moveStart('character', pos);
      range.select();
    }
  }
}(jQuery);

function addSeparator() {
	var value = $(this).val();
	var length = value.length;
	if (value==birthNumberSeparator) {
		return;
	}
	if (value=="") {
		value = birthNumberSeparator;
	} else {
		var index = value.indexOf(value);
		if (index>=0) {
			value= value.replace(birthNumberSeparator,"");
			if (length<6) {
				value=value+birthNumberSeparator;
			} else {
				value = value.substr(0,6)+birthNumberSeparator+value.substr(6,length);
			}
		} else {
			value+= birthNumberSeparator;	
		}
	}
	$(this).val(value);
	if (value.length==2) {
		$(this).setCursorPosition(1);
	}	
};

function checkBirthNumber(sourceValue, jComponent, errorMessageHandler, infoMessageHandler) {
	var url = contextPath+ validationTargetUrl+sourceValue+"&type="+"birthNumber";
	var result = false;

	$.get(url,
		function(data)
		{
			var parsedResponse = parseValidationResponse(data);
			if (!parsedResponse[0]) {
				errorMessageHandler(jComponent, parsedResponse[1]);
				result = false;
			} else {
				result = true;
				var bornDate = parsedResponse[1];
				  if (bornDate!=null&&bornDate!="") {
					  var age = calculateAge(bornDate);
					  var message = "";
					  if (age<18) {
						  var yearStr = "let";
						  if (age==1) {
							  yearStr = "rok";
						  }
						  if (age>= 1 && age <=4) {
							  yearStr = "roky";
						  }
						  message = "Věk "+age+" "+yearStr+", musíte vyplnit údaje zákonného zástupce.";

						  $("#legalContactDependentOnAge").show();
						  $("#legalPersonalDataDependentOnAge").show();
						  $("#legalAddressDependentOnAge").show();
					  } else {
						  $("#legalContactDependentOnAge").hide();
						  $("#legalPersonalDataDependentOnAge").hide();
						  $("#legalAddressDependentOnAge").hide();

						  cleanUpMessagesAndValue("input#legalContactEmail");
						  cleanUpMessagesAndValue("input#legalContactPhone");
						  cleanUpMessagesAndValue("input#legalFirstName");
						  cleanUpMessagesAndValue("input#legalSurname");
						  cleanUpMessagesAndValue("input#legalBirthPlace");
						  cleanUpMessagesAndValue("input#legalBirthNumber");
						  $("input#legalBusinessUser").attr('checked', false);
						  cleanUpMessagesAndValue("input#legalIdentificationNumber");

						  cleanUpMessagesAndValue("input#legalClientStreet");
						  cleanUpMessagesAndValue("input#legalClientStreetNumber");
						  cleanUpMessagesAndValue("input#legalClientCity");
						  cleanUpMessagesAndValue("input#legalClientPostCode");
					  }
					  removeErrorAndAddInfoMessage(jComponent, message);					  
				  }
			}
		});
	return result;
};

function checkLegalBirthNumber(sourceValue, jComponent, errorMessageHandler, infoMessageHandler) {
	var url = contextPath+ validationTargetUrl+sourceValue+"&type="+"birthNumber";
	var result = false;

	$.get(url,
		function(data)
		{
			var parsedResponse = parseValidationResponse(data);
			if (!parsedResponse[0]) {
				errorMessageHandler(jComponent, parsedResponse[1]);
				result = false;
			} else {
				result = true;
				var bornDate = parsedResponse[1];
				if (bornDate!=null&&bornDate!="")
				{
				  var age = calculateAge(bornDate);
				  var message = "";
				  if (age<18) {
					  var yearStr = "let";
					  if (age==1) {
						  yearStr = "rok";
					  }
					  if (age>= 1 && age <=4) {
						  yearStr = "roky";
					  }
					  message = "Věk zástupce je "+age+" "+yearStr+", zástupce musí být zletilý.";
					  errorMessageHandler(jComponent, message);
				  } else {
					removeErrorAndAddInfoMessage(jComponent, message);
				  }
				}				
			}
		});
	return result;
};

function validateMothlyDeposit() {
	checkMonthlyDeposit($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateIdentificationCardDate() {
	checkIdentificationCardDate($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateEmail() {
	checkEmail($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validatePhoneNumber() {
	checkPhoneNumber($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validatePhoneNumberNotRequired() {
	checkPhoneNumberNotRequired($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateBirthNumber() {
	checkBirthNumber($(this).val(), $(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateLegalBirthNumber() {
	checkLegalBirthNumber($(this).val(), $(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateIco() {
	var jComponent = $(this);
	checkIco(jComponent, showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateRequiredCheckbox() {
	var jComponent = $(this);
	var value = "";
	if (jComponent.is(':checked')) {
		value = true;
	}
	checkCommon(value, jComponent, showErrorMessage, removeErrorAndAddInfoMessage,"required", true);
}

function validateCheckbox() {
	var jComponent = $(this);
	var value = "";
	if (jComponent.is(':checked')) {
		value = true;
	}
	checkCommon(value, jComponent,  null, removeErrorAndAddInfoMessage,"required", false);
}

function validateContractConditions() {
	var jComponent = $(this);
	var value = "";
	if (jComponent.is(':checked')) {
		value = true;
	}
	checkCommon(value, jComponent, showErrorMessage, removeErrorAndAddInfoMessage,"contractConditions", true);
}

function validateStreetNumber() {
	checkStreeNumber($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validatePostCode() {
	checkPostCode($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateRequiredField() {
	checkRequired($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateCaptcha() {
	checkCaptcha($(this), showErrorMessage, removeErrorAndAddInfoMessage);
};

function validateFormFields() {
	//perform form data live validation
	var n = $("p[class*='error']").length;
	if (n==0) {
		return true;
	} else {
		return false;
	}
};

//bind on keyup
function firstLetterToUpperCase() {
	var jComponent = $(this);
	var value = jComponent.val();
	if (value!="") {
		jComponent.val(value.substr(0,1).toUpperCase()+value.substr(1, value.length+1));
	}
};

function copyValue(sourcejComponent, targetjComponent)
{
	targetjComponent.val(sourcejComponent.val());
};

function copyAddress() {
	if ($(this).is(':checked')) {
		copyValue($("input#clientStreet"), $("input#legalClientStreet"));
		copyValue($("input#clientStreetNumber"), $("input#legalClientStreetNumber"));
		copyValue($("input#clientCity"), $("input#legalClientCity"));
		copyValue($("input#clientPostCode"), $("input#legalClientPostCode"));
	} else {
		cleanUpMessagesAndValue("input#legalClientStreet");
		cleanUpMessagesAndValue("input#legalClientStreetNumber");
		cleanUpMessagesAndValue("input#legalClientCity");
		cleanUpMessagesAndValue("input#legalClientPostCode");
	}
};
