
/*******************************************************************************
 ********************************* SEBFinMath **********************************
 ******************************************************************************/
 
function SEBFinMath() {
	this.roundFloat = roundFloatFun;
}

function roundFloatFun(value, precision) {
	var coef = 1;
	while (precision > 0) {
		coef *= 10;
		precision--;
	}
	
	var result = Math.round(value * coef) / coef;
	return result;
}

/*******************************************************************************
 ****************************** SEBFinValidation *******************************
 ******************************************************************************/
function SEBFinValidation() {
	// Main functions
	this.isEmpty = isEmptyFun;
	this.isInt = isIntFun;
	this.isPositiveInt = isPositiveIntFun;
	this.isIntInRange = isIntInRangeFun;
	this.getIntValue = getIntValueFun;
	this.isFloat = isFloatFun;
	this.isFloatInRange = isFloatInRangeFun;
	this.getFloatValue = getFloatValueFun;
	this.setFloatValue = setFloatValueFun;
	
	this.isAlphabet = isAlphabetFun;
	this.isValidEmail = isValidEmailFun;
	this.isValidPersonCode = isValidPersonCodeFun;
	this.isValidPhone = isValidPhoneFun;
	
	// Help functions
	this.trim = trimFun;
	this.floatValueStr = floatValueStrFun;
	this.floatStr = floatStrFun;
}

/** Main / Public functions */
function isEmptyFun(field) {
	var value = this.trim(field.val());
	if (value.length == 0) {
		return true;
	}
	return false;
}

function isIntFun(field) {
	var value = field.val();
	value = this.trim(value);
	field.val(value);
	
	var parsedValue = parseInt(value, 10);
	if (isNaN(parsedValue) || parsedValue != value) {
		return false;
	}
	return true;
}

function isPositiveIntFun(field) {
	if (!this.isInt(field)) {
		return false;
	}
	
	var value = parseInt(field.val(), 10);
	if (value >= 0) {
		return true;
	}
	return false;
}

function isIntInRangeFun(field, from, till) {
	if (!this.isInt(field)) {
		return false;
	}
	
	var value = parseInt(field.val(), 10);
	if (value >= from && value <= till) {
		return true;
	}
	return false;
}

function getIntValueFun(field) {
	if (!this.isInt(field)) {
		return null;
	}

	var value = this.trim(field.val());
	var parsedValue = parseInt(value, 10);
	return parsedValue;
}

function isFloatFun(field) {
	var value = field.val();
	value = this.trim(value);
	value = value.replace(".", ",");
	field.val(value);

	value = value.replace(",", ".");
	var parsedValue = parseFloat(value);
	if (isNaN(parsedValue) || parsedValue != value) {
		return false;
	}
	return true;
}

function isFloatInRangeFun(field, from, till){
	if (!this.isFloat(field)) {
		return false;
	}
	
	var value = field.val();
	value = parseFloat(value.replace(",", "."));
	if (value >= from && value <= till) {
		return true;
	}
	return false;
}

function getFloatValueFun(field) {
	if (!this.isFloat(field)) {
		return null;
	}

	var value = this.trim(field.val());
	value = value.replace(",", ".");
	var parsedValue = parseFloat(value);
	return parsedValue;
}

function setFloatValueFun(field, value) {
	value = "" + value;
	
	if (isNaN(parseFloat(value))) {
		return;
	}
	field.val(value.replace(".", ","));
}

function isAlphabetFun(field){
	var alphaExp = /^[a-zA-ZąčęėįšųūžĄČĘĖĮŠŲŪŽ ]+$/;
	if(field.val().match(alphaExp)) {
		field.val(this.trim(field.val()));
		return true;
	}
	return false;
}

function isValidEmailFun(field){
	var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
	if(field.val().match(emailExp)) {
		field.val(this.trim(field.val()));
		return true;
	}
	return false;
}

function isValidPersonCodeFun(field) {
	var personCode = this.trim(field.val());
	
	if (!this.isPositiveInt(field) || personCode == null || personCode.length != 11 ) {
		return false;
	}

	var code = new Array();
	for (var i = 0; i < personCode.length; i++) {
		code[i] = parseInt(personCode.charAt(i));
	}
        
	var i = 0;
	var l = (code[i++] * 1 + code[i++] * 2 + code[i++] * 3 + code[i++] * 4 + code[i++] * 5 + code[i++] * 6 +
				code[i++] * 7 + code[i++] * 8 + code[i++] * 9 + code[i++] ) % 11; 

	if (l != 10) {
		return code[10] == l;
	} else {
		i = 0;
		l = (code[i++] * 3 + code[i++] * 4 + code[i++] * 5 + code[i++] * 6 + code[i++] * 7 + code[i++] * 8 + code[i++] * 9 +
				code[i++] * 1 + code[i++] * 2 + code[i++] * 3) % 11; 
		l = (l == 10 ) ? 0 : l;
	}
	return code[10] == l;
}

function isValidPhoneFun(field) {
    var alphaExp = /^[0-9( )\-\+]+$/;
	if(field.val().match(alphaExp)) {
		field.val(this.trim(field.val()));
		return true;
	}
	return false;
} 

/** Help / Private functions */
function trimFun(txt) {
	while (txt.charAt(0) == ' ') {
		txt = txt.substring(1, txt.length);
	}
	while (txt.charAt(txt.length - 1) == ' ') {
		txt=txt.substring(0, txt.length - 1);
	}
	return txt;
}

function floatValueStrFun(value) {
	if (value == null || isNaN(value))  {
		return null;
	}	
	value = "" + value;

	groups = value.split('.');
	num = groups[0];
	comma = groups.length > 1 ? ',' + groups[1] : "";
	var rgx = /(\d+)(\d{3})/;
	
	while (rgx.test(num)) {
		num = num.replace(rgx, '$1' + '.' + '$2');
	}
	return num + comma;
}

function floatStrFun(param, commaPos) {
	var value = this.floatValueStr(param);
	var comma = "";
	if (value.indexOf(",") == -1) {
		comma = ",";
	} else {
		var commaPart = value.substring(value.indexOf(",") + 1);
		commaPos = commaPos - commaPart.length;
	}
	for (var i = 0; i < commaPos; i++) {
		comma += "0";
	}
	return value + comma;
}

/*******************************************************************************
 **************************** SEBFinFormValidation *****************************
 ******************************************************************************/
function SEBFinFormValidation(errString, emptyErrString) {
	this.fieldValidation = new SEBFinValidation();
	this.emptyErrStr = emptyErrString;
	this.errStr = errString;
	
	this.validateFormField = validateFormFieldFun;
	this.hideErrors = hideErrorsFun;
	
	this.isNotEmptyField = isNotEmptyFieldFun;
	this.isAlphabetField = isAlphabetFieldFun;
	this.isPhoneField = isPhoneFieldFun;
	this.isEmailField = isEmailFieldFun;
	this.isEmailFieldNoErr = isEmailFieldNoErrFun;
	this.isFloatField = isFloatFieldFun;
	this.isFloatInRangeField = isFloatInRangeFieldFun;
	this.isIntInRangeField = isIntInRangeFieldFun;
	this.isSelectedRadio = isSelectedRadioFun;
	this.isSelectedValue = isSelectedValueFun;
	this.isEmailOrPhone = isEmailOrPhoneFun;
	this.isEqualsField = isEqualsFieldFun;
	this.isNotEqualsField = isNotEqualsFieldFun;
}

function validateFormFieldFun(mainField, required, isValid) {
	var errField = $("#" + mainField[0].id + this.errStr);
	if (errField.length == 0) {
		errField = $("#" + mainField[0].name + this.errStr);
	}

	var emptyErrField = $("#" + mainField[0].id + this.emptyErrStr);
	if (emptyErrField.length == 0) {
		emptyErrField = $("#" + mainField[0].name + this.emptyErrStr);
	}
	var empty = this.fieldValidation.isEmpty(mainField);

	if (required && empty) {
		isValid = false;
	}
	if (!required && empty) {
		isValid = true;
	}

	if (!isValid) {
		if (empty) {
			errField.hide();
			emptyErrField.show();
		} else {
			emptyErrField.hide();
			errField.show();
		}
	} else {
		this.hideErrors(mainField);
	}

	return isValid;
}

function hideErrorsFun(field) {
	var errField = $("#" + field[0].id + this.errStr);
	if (errField.length == 0) {
		errField = $("#" + field[0].name + this.errStr);
	}

	var emptyErrField =	$("#" + field[0].id + this.emptyErrStr);
	if (emptyErrField.length == 0) {
		emptyErrField = $("#" + field[0].name + this.emptyErrStr);
	}
	
	errField.hide();
	emptyErrField.hide();
}

function isNotEmptyFieldFun(field) {
	var isValid = this.validateFormField(field, true, true);
	return isValid;
}

function isAlphabetFieldFun(field, required) {
	var isValid = this.fieldValidation.isAlphabet(field);
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isPhoneFieldFun(field, required) {
	var isValid = this.fieldValidation.isValidPhone(field);
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isEmailFieldFun(field, required) {
	var isValid = this.fieldValidation.isValidEmail(field);
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isEmailFieldNoErrFun(field) {
	var isValid = this.fieldValidation.isValidEmail(field);
	return isValid;
}

function isFloatFieldFun(field, required) {
	var isValid = this.fieldValidation.isFloat(field);
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isFloatInRangeFieldFun(field, from, till, required){
	var isValid = this.fieldValidation.isFloatInRange(field, from, till);
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isIntInRangeFieldFun(field, from, till, required) {
	var isValid = this.fieldValidation.isIntInRange(field, from, till);
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isSelectedRadioFun(fieldName, required) {
	var isValid = $("input[name=" + fieldName + "]:checked").length > 0 ? true : false;
	var errField = $("#" + fieldName + this.emptyErrStr);
	
	if (!isValid && required) {
		errField.show();		
	} else {
		errField.hide();
	}
	return isValid;
}

function isSelectedValueFun(field, chooseVal, required) {
	var isValid = field.val() != chooseVal ? true : false;
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isEmailOrPhoneFun(field, required) {
	var isValid = this.fieldValidation.isValidEmail(field);
	if (!isValid) {
		isValid = this.fieldValidation.isValidPhone(field);
	}
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isEqualsFieldFun(field, required, requiredValue) {
	var isValid = field.val() == requiredValue
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}

function isNotEqualsFieldFun(field, required, requiredValue) {
	var isValid = field.val() != requiredValue
	isValid = this.validateFormField(field, required, isValid);
	return isValid;
}