﻿//Requires fibutils.js

//Dynamic validators
function isControlKey(ev){
	var key;
	if(window.event) key = window.event.keyCode;
	else if(ev) key = ev.which;
	else return true;
	return (key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27);
}
function isNumber(ev, additional, nohint){
	var result;
	var hinttype;
	var hintmsg = addmsg='';
	ev = validator_getEvent(ev);
	var el = validator_getTarget(ev);
	var key = validator_getKey(ev);
	var keyChar = String.fromCharCode(key);
	if(typeof(hint_create) == 'function') hint_create(el, 'none');
	// control keys
	if(isControlKey(ev))  return true;
	
	if(additional) addmsg = " и символите: "+validator_formatAdditional(additional); 
	
	hintmsg = 'Позволени са само цифри'+addmsg;
	
	if((key>=48) && (key<=57)){
		return true;
	}else{
		if(validator_checkAdditional(keyChar, additional)) return true;
		else if(!nohint) if(typeof(hint_create) == 'function') hint_create(el, 'hint', hintmsg);
		return false;
	}
}

function isLatin(ev, additional, nohint){
	ev = validator_getEvent(ev);
	var el = validator_getTarget(ev);
	var key = validator_getKey(ev);
	var keyChar = String.fromCharCode(key);
	var msg='';
	
	if(additional) msg = " и символите: "+validator_formatAdditional(additional);
	msg = "Позволени са само букви на латиница"+msg+"!";

	if(isControlKey(ev))  return true;
	
	if(('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ').indexOf(keyChar) > -1) return true
	else if(additional){
		if(typeof(additional.indexOf)=='function'){
		 	if(additional.indexOf(keyChar) > -1) return true;
		 	else{
		 	 if(!nohint) if(typeof(hint_create) == 'function') hint_create(el, 'hint', msg);
		 	 return false;
		 	}
		}else return true;
	}	else {
		if(!nohint) if(typeof(hint_create) == 'function') hint_create(el, 'hint', msg);
		return false;	
	}
}

function isCyrilic(ev, additional, nohint){
	ev = validator_getEvent(ev);
	var el = validator_getTarget(ev);
	var key = validator_getKey(ev);
	var keyChar = String.fromCharCode(key);
	var msg='';
	
	if(additional) msg = " и символите: "+validator_formatAdditional(additional)
	msg = "Позволени са само букви на кирилица"+msg+"!";

	if(isControlKey(ev))  return true;
	
	if(('абвгдежзийклмнопрстуфхцчшщъьюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯ').indexOf(keyChar) > -1) return true
	else if(additional){
		if(typeof(additional.indexOf)=='function'){
		 	if(additional.indexOf(keyChar) > -1) return true;
		 	else{
		 	 if(!nohint) if(typeof(hint_create) == 'function') hint_create(el, 'hint', msg);
		 	 return false;
		 	}
		}else return true;
	}	else {
		if(!nohint) if(typeof(hint_create) == 'function') hint_create(el, 'hint', msg);
		return false;	
	}	
}

function isAlpha(ev, additional, nohint){
	var result = isLatin(ev, additional, true) || isCyrilic(ev, additional, true);
	ev = validator_getEvent(ev);
	var el = validator_getTarget(ev);
	var comma, addmsg;
	if(additional!=''){
		addmsg = ' и символите: '+validator_formatAdditional(additional);
		comma = ', ';
	}else{
		addmsg = '';
		comma = ' и ';
	}
	var msg = 'Позволени са букви на кирилица'+comma+'латиница'+addmsg;
	if(!result && !nohint) if(typeof(hint_create) == 'function') hint_create(ev, 'hint', msg);
	return result;
}

function isLatinNum(ev, additional, nohint){
	var result = isLatin(ev, additional, true) || isNumber(ev, additional, true);
	ev = validator_getEvent(ev);
	var el = validator_getTarget(ev);
	var comma, addmsg;
	if(additional!=''){
		addmsg = ' и символите: '+validator_formatAdditional(additional);
		comma = ', ';
	}else{
		addmsg = '';
		comma = ' и ';
	}
	var msg = 'Позволени са букви на латиница'+comma+'цифри'+addmsg;
	if(!result && !nohint) if(typeof(hint_create) == 'function') hint_create(el, 'hint', msg);
	return result;
}

function isCyrilicNum(ev, additional, nohint){
	var result = isCyrilic(ev, additional, true) || isNumber(ev, additional, true);
	ev = validator_getEvent(ev);
	var el = validator_getTarget(ev);
	var comma, addmsg;
	if(additional!=''){
		addmsg = ' и символите: '+validator_formatAdditional(additional);
		comma = ', ';
	}else{
		addmsg = '';
		comma = ' и ';
	}
	var msg = 'Позволени са букви на латиница'+comma+'цифри'+addmsg;
	if(!result && !nohint) if(typeof(hint_create) == 'function') hint_create(ev, 'hint', msg);
	return result;
}

function isAlphaNum(ev, additional, nohint){
	/*var alphabet = isAlpha(ev, additional, true);
	var num = isNumber(ev, restrictDec, true);
	
	
	var result = alphabet || num;*/
	var result = (isAlpha(ev, additional, true) || isNumber(ev, additional, true));
	ev = validator_getEvent(ev);
	var el = validator_getTarget(ev);
	var comma, addmsg;
	
	if(additional){
		addmsg = ' и символите: '+validator_formatAdditional(additional);
		comma = ', ';
	}else{
			addmsg = '';
			comma = ' и ';
	}
	var msg = 'Позволени са букви на кирилица, латиница'+comma+'цифри'+addmsg;
	if(!result && !nohint) if(typeof(hint_create) == 'function') hint_create(el, 'hint', msg);
	return result;
}

// IMPORTANT!!!
//Use the following functions in OnKeyUp event
function validateEGN(el){
	if(el.value.length < 10){
		validator_setStatus(el, 'NONE');
		return;
	}
	if(el.value.length > 10) el.value = el.value.substr(0,10);
	if(checkEGN(el.value)){
		validator_setStatus(el, 'OK');
		return true;
	}else validator_setStatus(el, 'FAIL');
	
	
}
function validateEIK(el){
	if(el.value.length != 9 && el.value.length != 13){
		validator_setStatus(el, 'NONE');
		return;
	}
	if(checkEIK(el.value)) validator_setStatus(el, 'OK');
	else validator_setStatus(el, 'FAIL');
}
function validateIBAN(el, country, bank){
	var str = el.value.toUpperCase();
	if(str.length < 22){
		if(el.getAttribute('required') == 'false' && str.length == 0){
			validator_setStatus(el, 'OK');	
			return;
		}
		validator_setStatus(el, 'NONE');
		return;
	}
	if(checkIBAN(str)){
		if(str.substr(0,2) == 'BG' && str.substr(4,8) == 'FINV9150'){
			validator_setStatus(el, 'OK');
		}else{
			validator_setStatus(el, 'FAIL');
		}
	}else validator_setStatus(el, 'FAIL');
}
function validateLength(el, min, max, setFailOnFail){
	var tooltip = el.getAttribute('tooltip');
	var len = el.value.length;
	if(el.value == tooltip) len=0;
	var minOK = true;
	var maxOK = true;
	if(typeof(min) != 'number') return true;

	if(min > 0)	minOK = len >= min;
	if(typeof(max) == 'number'){
		if(max > min) maxOK = len <= max;
	}
	if(minOK && maxOK){
		validator_setStatus(el, 'OK');
		return true;
	}else	if(minOK && !maxOK) el.value = el.value.substr(0,max);
	else validator_setStatus(el, 'NONE');
}
function validateNotEmpty(el, setFailOnFail){
	var tooltip = el.getAttribute('tooltip');
	if(el.value != '' && el.value != tooltip){
		validator_setStatus(el, 'OK');
	}else{
		if(setFailOnFail) validator_setStatus(el, 'FAIL');
		else validator_setStatus(el, 'NONE');
	}
}
function validateNotZeroIndex(el, setFailOnFail){
	if(typeof(el.selectedIndex)=='number'){
		if(el.selectedIndex >= 1) 	validator_setStatus(el, 'OK');
		else if(setFailOnFail) 	validator_setStatus(el, 'FAIL');
		else 	validator_setStatus(el, 'NONE');
	}else validator_setStatus(el, 'NONE');
}
function validateDate(el, setFailOnFail){
	if(check_splitDate(el.value)){
		validator_setStatus(el, 'OK');
	}else{
		if(el.value.length == 10)
			if(setFailOnFail){
				validator_setStatus(el, 'FAIL');
			}
			else 	validator_setStatus(el, 'NONE');
		else {
			if(el.value.length == 0 && el.getAttribute('required') == 'false')
				validator_setStatus(el, 'OK');
			else
				validator_setStatus(el, 'NONE');
		}
	}
}
function validateChecked(holder, allChecked, setFailOnFail, itype){
	
	var checks = holder.getElementsByTagName('INPUT');
	var allsuccess = true;
	var onesuccess = success = false;
	var stat;
	
	if(itype != 'radio') itype = 'checkbox';
	
	for(var i=0; i<checks.length; i++){
		if(checks[i].type==itype){
			allsuccess = allsuccess && checks[i].checked;
			onesuccess = onesuccess || checks[i].checked;
		}
	}
	if(allChecked) success = allsuccess;
	else success = onesuccess;
	if(success){
		stat = 'OK';
		holder.style.border = "1px solid rgb(202, 240, 202)";
		holder.style.color = "rgb(0,160,0)";
	}else{
		if(setFailOnFail){
			stat = 'FAIL';
			holder.style.border = "1px solid rgb(240, 202, 202)";
			holder.style.color = "rgb(200,0,0)";
		}else{
			stat='NONE';
			holder.style.border = "";
			holder.style.color = '';
		}
	}
	for(i=0; i<checks.length; i++) if(checks[i].type==itype) validator_setStatus(checks[i], stat);
}
//Static validators
function check_splitDate(str){
	var strd, strm, stry;
	
	if(!validator_checkAdditional(str.substr(2,1),'-/.') || !validator_checkAdditional(str.substr(5,1),'-/.')) return false;
	
	strd = str.substr(0,2);
	strm = str.substr(3,2);
	stry = str.substr(6,4);
	return checkDate(strd, strm, stry);
}
function checkDate(strd, strm, stry){
	if(stry.length <4) return false
	var d = new Date(strm+'/'+strd+'/'+stry);
	return (d.getDate() == strd) && (d.getMonth()+1 == strm) && (d.getFullYear()==stry);
}
function checkEGN(str){
	var stry = str.substr(0,2);
	var strm = str.substr(2,2);
	var strd = str.substr(4,2);
	
	if((strm >= 21) && (strm <=32)){
		stry = 1800 + 1*stry;
		strm = 1*strm-20;
	}else	if((strm >= 41) && (strm <=52)){
		stry = 2000 + 1*stry;
		strm = 1*strm-40;
	}else{
		stry = 1900 + 1*stry;
	}
	if(!checkDate(strd, strm, stry)) return false;

	var csum = 	str.substr(0,1)*2+
							str.substr(1,1)*4+
							str.substr(2,1)*8+
							str.substr(3,1)*5+
							str.substr(4,1)*10+
							str.substr(5,1)*9+
							str.substr(6,1)*7+
							str.substr(7,1)*3+
							str.substr(8,1)*6;

	var cdigit = csum - 11*Math.floor(csum/11);
	if(cdigit==10) cdigit = 0;
	return cdigit == str.substr(9,1);
}
function checkEIK(str){
	str = str+'';
	if(str.length != 9 && str.length != 13) return false;
	var sum = 	str.substr(0,1)*1+
							str.substr(1,1)*2+
							str.substr(2,1)*3+
							str.substr(3,1)*4+
							str.substr(4,1)*5+
							str.substr(5,1)*6+
							str.substr(6,1)*7+					
							str.substr(7,1)*8;
	//var sum = str[0]*1 + 2*str[1] + 3*str[2] + 4*str[3] + 5*str[4] + 6*str[5] + 7*str[6] + 8*str[7];
	var mod = sum % 11;
	if(mod == 10){
		sum = str.substr(0,1)*3+
					str.substr(1,1)*4+
					str.substr(2,1)*5+
					str.substr(3,1)*6+
					str.substr(4,1)*7+
					str.substr(5,1)*8+
					str.substr(6,1)*9+
					str.substr(7,1)*10;
		mod = sum % 11;
		if(mod == 10) mod = 0;
	}
	var cd = str.substr(8,1)*1;
	if(mod != cd){
		 return false;
	}
	
	if(str.length == 9){
		 return true; 
	}
	else{
		sum = str.substr(8,1)*2+
					str.substr(9,1)*7+
					str.substr(10,1)*3+
					str.substr(11,1)*5;

		mod = sum % 11;
		if(mod == 10){
			sum = str.substr(8,1)*4+
						str.substr(9,1)*9+
						str.substr(10,1)*5+
						str.substr(11,1)*7;
			mod = sum % 11;
			if(mod == 10) mod = 0;
		}
		cd = str.substr(12,1);
		return mod == cd;
	}
}
function checkIBAN(str, bank){
	str = str.toUpperCase();
	var rstr = str.substr(4) + str.substr(0,4);
	var tstr ='';
	var dbgr = $('overdrafts.debugger');
	var cc;
	for(var i=0; i<rstr.length; i++){
		cc = rstr.charCodeAt(i);
		if(cc >= 48 && cc <= 57) tstr += rstr.substr(i,1);
		else if(cc >= 65 && cc <= 90) tstr += (cc-55);
		else return false;
	}
	
	var a = 1;
	var sum = 0;
	var d;
	for(var i=tstr.length-1; i>=0; i--){
		d = tstr.substr(i,1)*1;
		sum += d*a;
		a = (a*10) % 97;
	}
	var mod = sum % 97;

	return mod == 1;	
}
//Misc function
function validator_checkAdditional(tester, addstr){
	if(addstr){
		if(typeof(addstr.indexOf) == 'function'){
			return addstr.indexOf(tester)>-1;
		}else return true;
	}else return false;
}
function validator_formatAdditional(addstr){
	if(!addstr) return '';
	var _char = '';
	var str = comma ='';
	
	for(i=0; i<addstr.length; i++){
		_char = addstr.substr(i,1);
		if(_char==' ') _char = 'интервал';
		if(_char==',') _char = 'запетайка';
		if(_char=='.') _char = 'точка';
		if(_char=='-') _char = 'тире';
		str += comma+_char;
		
		if(i == addstr.length-2) comma = " и ";
		else comma = ", ";
	}
	return str;
}
function validator_getEvent(ev){
	if(window.event) return window.event;
	else return ev;
}
function validator_getKey(ev){
	if(ev.keyCode) return ev.keyCode;
	else return ev.which;
}
function validator_getTarget(ev){
	if(ev.srcElement) return ev.srcElement;
	else return ev.target;
}
function validator_setStatus(el, vstatus, no_hint, no_autohide){
	
	//if($(el.getAttribute('hintViewer'))) el = $(el.getAttribute('hintViewer'));
	el.vstatus = vstatus;
	var msg;
	switch(vstatus){
		case 'OK':
			el.style.backgroundColor = "rgb(242, 255, 242)";
			el.style.border = "1px solid rgb(0, 140, 0)";
			msg = el.getAttribute('okMsg');
			if(typeof(hint_create) == 'function') hint_create(el, 'none');
			break;
		case 'FAIL':
			el.style.backgroundColor = "rgb(255, 242, 242)";
			el.style.border = "1px solid rgb(200, 0, 0)";
			msg = el.getAttribute('failMsg');
			if(!no_hint && msg) if(typeof(hint_create) == 'function') hint_create(el, 'err', msg, no_autohide);
			break;
		default:
			if(el.type != 'submit'){
				el.vstatus = 'NONE';
				el.style.backgroundColor = "#FFF";
				el.style.border = "1px solid rgb(221,221,221)";
			}
	}
}
function validator_getCaretPos(el){
	var caret_pos;
	if(document.all){
		var range = document.selection.createRange();
		var bookmark = range.getBookmark();
		caret_pos = bookmark.charCodeAt(2) - 2;
	}else{
		caret_pos = el.selectionStart;
	}
	return caret_pos;
}
