/**
 * kontroluje platnost vloženého data - alternativa k PHP fci checkdate()
 */
function checkDate(day, month, year)
{
	var myDate=new Date();

	myDate.setFullYear(year,month-1,day);
	if (myDate.getDate() != day) return false;
	if (myDate.getMonth() != month-1) return false;
	if (myDate.getFullYear() != year) return false;

	return true;
}


/**
 * kontroluje rozdíl dvou dat
 */
function checkDateRange(check, valDateArr, compDateArr)
{
	var valDate=new Date();
	valDate.setFullYear(valDateArr[2],valDateArr[1]-1,valDateArr[0]);
	var compDate=new Date();
	compDate.setFullYear(compDateArr[2],compDateArr[1]-1,compDateArr[0]);

	switch (check) {
		case 'dateMin': return (valDate >= compDate);
		case 'dateMax': return (valDate <= compDate);
	}
	return false;
}


/**
 * kontroluje rezdíl dat dvou datových inputů (QuickForm Date)
 */
function checkDateInputRange(check, valDateArr, compDateArr)
{
	if (!valDateArr || !compDateArr) return true;
	if (valDateArr[0] == '' || valDateArr[1] == '' || valDateArr[2] == '' ||
		compDateArr[0] == '' || compDateArr[1] == '' || compDateArr[2] == '') {
		return true; //necheckujeme
	}

	return checkDateRange(check, valDateArr, compDateArr);
}

/**
 * vrací array s datumem zadaným inputem, pokud jsou zadány všechny hodnoty, jinak false
 */
function dateInpVal(frm, el)
{
	if (!frm.elements[el+'[d]'].value) return false;
	if (!frm.elements[el+'[F]'].value) return false;
	if (!frm.elements[el+'[Y]'].value) return false;
	return Array(frm.elements[el+'[d]'].value, frm.elements[el+'[F]'].value, frm.elements[el+'[Y]'].value);
}


/**
 * vrací datum, identifikované z rč
 * vstupem jsou jednotlivá dvojčíslí (poslední může mít jen jedno místo) - viz regulárka v checkRC(v)
 */
function getDatumFromRC(regs)
{
	var Y = regs[1]*1 + ((regs[5].length == 1 || (regs[5].length == 2 && regs[1]*1 >= 54))?1900:2000);
	var F = regs[2]*1 > 50?regs[2]-50:regs[2]; //ženy mají měsíc +50
	var d = regs[3]*1;
	return Array(d, F, Y);
}


/**
 * kontoluje platnost rč regulárkou, na platné datum a případnou dělitelnost 11
 */
function checkRC(v)
{
	var re = new RegExp("^([0-9]{2})([0-9]{2})([0-9]{2})/{0,1}([0-9]{2})([0-9]{1,2})$");
	var regs = v.match(re);
	if (!regs) return false;

	//platné datum
	var datum = getDatumFromRC(regs);

	if (!checkDate(datum[0], datum[1], datum[2])) return false;

	//kontrola dělitelnosti nulou - pro datum > 1954 (10 míst)
	if (regs[5].length == 2) //10 míst
	{
		rc = regs[1] + regs[2] + regs[3]+ regs[4] + regs[5];
		if (rc % 11 !== 0) return false;
	}
	return true;
}

function validateRegexp(element, regexp) {
	if ($("#" + element.id + ":reallyvisible").length
		&& element.value.length > 0) {
		var re = new RegExp(regexp);
		if (!re.test(element.value)) {
			return false;
		}
	}
	return true;
}

/**
 * kontrola VIN: max 17 znaku, pouze pismena a cislice, mala pismena se prevadeji na velka
 * a O => 0 (pismeno O na "nula")
 */
function validateVin(element)
{
	element.value = element.value.toUpperCase();
	element.value = element.value.replace(/O/g,"0");
	element.value = element.value.replace(/\ /g,"");
	if (!validateRegexp(element, "^[A-Z0-9]{17}$")) {
		showElementError(element.id, "Může obsahovat pouze velká písmena a číslice a musí být dlouhý 17 znaků.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
 * kontrola SPZ: mala pismena se prevadeji na velka, mazou se mezery
 */
function validateSpz(element)
{
	element.value = element.value.toUpperCase();
	element.value = element.value.replace(/\ /g, "");
	if (!validateRegexp(element, "^[A-Z0-9]+$")) {
		showElementError(element.id, "Může obsahovat pouze velká písmena a číslice.");
		return false;
	}
	hideElementError(element.id);
	return true;

}


/**
 *
 * kontrola telefonniho cisla: pouze cislice a na zacatku znamenko plus
 */
function validatePhone(element)
{
	element.value = element.value.replace(/\ /g,"");
	if (!validateRegexp(element, "^[+]?[0-9]{6,}$|^[+]{1}420{1}$")) {
		showElementError(element.id, "Může začínat znakem plus a dále musí pokračovat jen číslicemi (bez mezer), v délce alespoň 6 cifer.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
 *
 * u kontaktnich telefonu je jina validace
 * @see ALL44335
 */
function validateContactPhone(element)
{
	element.value = element.value.replace(/\ /g,"");
	var elmVal = element.value;

	if (elmVal.substr(0,4) == '+420') {
		if (!validateRegexp(element, "^(\\+420)?[0-9]{9}$")) {
			showElementError(element.id, "Správný formát telefoního čísla je +420 a 9 číslic, například: +420123456789.");
			$('#id_' + element.id).addClass('error');
			return false;
		} else {
			$('#id_' + element.id).removeClass('error');
		}
	} else if (elmVal.substr(0,1) == '+') {
		hideElementError(element.id);
		return true;
	} else {
		if (!validateRegexp(element, "^[0-9]{9}$")) {
			showElementError(element.id, "Může obsahovat přesně 9 číslic.");
			return false;
		}
	}

	hideElementError(element.id);
	return true;
}

/**
 *
 * kontrola  cisla: pouze cislice
 */
function validateNumber(element)
{
	element.value = element.value.replace(/\ /g,"");
	if (!validateRegexp(element, "^[0-9]*$")) {
		showElementError(element.id, "Může obsahovat pouze číslice.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
 *
 * kontrola cisla: pouze cislice, kladné číslo
 */
function validatePositiveNumber(element)
{
	element.value = element.value.replace(/\ /g,"");
	if (!validateRegexp(element, "^[0-9]*$")) {
		showElementError(element.id, "Může obsahovat pouze číslice.");
		return false;
	}
	if (element.value <= 0) {
		showElementError(element.id, "Musí obsahovat kladnou hodnotu.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
 * kontrola  cisla: pouze cislice
 */
function validateFloat(element)
{
	element.value = element.value.replace(/\ /g,"");
	if (!validateRegexp(element, "^[0-9]+([,][0-9]{0,2})?$")) {
		showElementError(element.id, "Musí být číslo (bez mezer) s maximálně 2 desetinnými místy oddělenými čárkou.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
* kontrola datumu
*/
function validateDate(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, "^([1-9]|0[1-9]|[12][0-9]|3[01])[.]([1-9]|0[1-9]|1[012])[.](19|20)[0-9]{2}$")) {
		showElementError(element.id, "Datum musí být ve formátu D.M.RRRR (a v rámci 19. nebo 20. století).");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
* kontrola roku
*/
function validateYear(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, "^(18|19|20)[0-9]{2}$")) {
		showElementError(element.id, "Rok musí mít 4 cifry (a být v rámci 19., 20. nebo 21. století).");
		return false;
	}
	var d = new Date();
	if(parseInt(element.value) > d.getFullYear()) {
		showElementError(element.id, "Rok nesmí být větší než současný.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
* kontrola roku bez omezení na nejbližší století
*/
function validateYearGeneral(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, "^(10|11|12|13|14|15|16|17|18|19|20)[0-9]{2}$")) {
		showElementError(element.id, "Rok musí mít 4 cifry.");
		return false;
	}
	var d = new Date();
	if(parseInt(element.value) > d.getFullYear()) {
		showElementError(element.id, "Rok nesmí být větší než současný.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
 * kontrola datumu vzhledem k dnešnímu - musí být menší
*/
function validateDateSmaller(element) {
	element.value = element.value.replace(" ","");
	// povinné nebo neprázdné
	if ($("#" + element.id + ":reallyvisible").parents(".required-field").length
		|| element.value.length > 0) {

		var actual = (x=new Date()).getFullYear()+"-"+((y=x.getMonth()+1)<=9?'0'+y:y)+"-"+((z=x.getDate())<=9?'0'+z:z);
		var parts = (""+element.value).split(".");
		if (parts.length == 3)  {
			if (parts[0].length == 1) {
				parts[0] = "0" + parts[0];
			}
			if (parts[1].length == 1) {
				parts[1] = "0" + parts[1];
			}
			var dateVal = parts[2] + "-" + parts[1] + "-" + parts[0];
			if (dateVal > actual) {
				showElementError(element.id, "Datum nemůže být novější než aktuální datum.");
				return false;
			}
		}
	} else {
		hideElementError(element.id);
	}
	return true;
}

/**
 * kontrola datumu vzhledem k dnešnímu - musí být větší (budoucí)
*/
function validateDateFuture(element) {
	element.value = element.value.replace(" ","");
	// povinné nebo neprázdné
	if ($("#" + element.id + ":reallyvisible").parents(".required-field").length
		|| element.value.length > 0) {

		var actual = (x=new Date()).getFullYear()+"-"+((y=x.getMonth()+1)<=9?'0'+y:y)+"-"+((z=x.getDate())<=9?'0'+z:z);
		var parts = (""+element.value).split(".");
		if (parts.length == 3)  {
			if (parts[0].length == 1) {
				parts[0] = "0" + parts[0];
			}
			if (parts[1].length == 1) {
				parts[1] = "0" + parts[1];
			}
			var dateVal = parts[2] + "-" + parts[1] + "-" + parts[0];
			if (dateVal < actual) {
				showElementError(element.id, "Datum nemůže být starši než aktuální datum.");
				return false;
			}
		}
	} else {
		hideElementError(element.id);
	}
	return true;
}

/**
* kontrola času - HH:MM
*/
function validateTime(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, "^([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-9]|0[0-9]|[1-5][0-9])$")) {
		showElementError(element.id, "Čas musí být ve formátu HH:MM.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
* kontrola času - HH:MM a pokud je dateElement dnešní datum, tak čas nesmí být vyšší než aktuální
*/
function validateTimePast(element, dateElement) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, "^([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-9]|0[0-9]|[1-5][0-9])$")) {
		showElementError(element.id, "Čas musí být ve formátu HH:MM.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
* kontrola emailu - krutoregulár
*/
function validateEmail(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^((\"[^\"\\f\\n\\r\\t\\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/)) {
		showElementError(element.id, "E-mailova adresa musí mít správný formát.");
		return false;
	}
	var atSign = element.value.substring(0,element.value.lastIndexOf('@')+1);
	var domain = element.value.substring(atSign.length,element.value.length+1);
	var result = true;
	$.ajax({
		async: false,
		type: "GET",
		url: "/secure-new/hlaseni-skodne-udalosti/data_email.php?domain=" + domain,
		data: "domain=" + domain,
		success: function(msg){
			if (msg == '0') {
				showElementError(element.id, "Doména '" + domain + "' není platná.");
				result = false;
				return false;
			} else {
				hideElementError(element.id);
			}
		}
	});
	return result;
}

/**
* kontrola PSČ
*/
function validatePsc(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^[1-9][0-9][0-9][0-9][0-9]$/)) {
		showElementError(element.id, "Musí obsahovat právě 5 číslic bez mezery.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
* kontrola bankovního kódu
*/
function validateKodBanky(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^[0-9]{4}$/)) {
		showElementError(element.id, "Kód banky musí mít 4 cifry.");
		return false;
	}
	hideElementError(element.id);
	return true;
}


/**
* kontrola čísla bankovního účtu
*/
function validateUcet(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^[0-9]{1,6}[-]?[0-9]{1,10}$/)) {
		showElementError(element.id, "Formát čísla bankovního účtu není správný.");
		return false;
	}
	hideElementError(element.id);
	return true;
}

/**
* kontrola rodného čísla nebo IČ firmy
*/
function validateRcIc(element) {
	element.value = element.value.replace(/\ /g,"");
	hideElementError(element.id);
	if(!validateRegexp(element, /^[0-9]{8,10}$/)) {
		showElementError(element.id, "RČ/IČ musí obsahovat pouze 8 až 10 číslic (RČ se zadává bez lomítka).");
		return false;
	}
	var value = element.value;
	var valid = true;
	if (value.length == 0) {
		return true;
	}
	if (value.length == 8)
	{
		// IC
		var a = 0;
		var b = value.split('');
		var c = 0;
		for(var i = 0; i < 7; i++) {
			a += (parseInt(b[i]) * (8 - i));
		}
		a = a % 11;
		c = 11 - a;
		if (a == 1) {
			c = 0;
		}
		if (a == 0) {
			c = 1;
		}
		if (a == 10) {
			c = 1;
		}
		if (parseInt(b[ 7]) != c) {
			valid = false;
		}
	}
	else
	{
		// RC
		var year = parseInt(value.substr(0, 2), 10);
		var month = parseInt(value.substr(2, 2), 10);
		var day = parseInt(value.substr(4, 2), 10);
		var ext = parseInt(value.substr(6, 3), 10);
		if((value.length == 9) && (year < 54)) {
			hideElementError(element.id);
			return true;
		}
		if (value.substr(6, 9) == '9999') {
			if(!validateRegexp(element, /^\d{2}[0|1]{1}\d{1}[0|1|2|3]{1}\d{1}9999$/)) {
				valid = false;
			} else {
				return true;
			}

		}
		var c = 0;
		if (value.length == 10) {
			c = parseInt(value.substr(9, 1));
		}
		var m = parseInt(value.substr(0, 9)) % 11;
		if (m == 10) {
			m = 0;
		}
		if (m != c) {
			valid = false;
		}
		year += (year < 54) ? 2000 : 1900;
		if((month > 70) && (year > 2003)) {
			month -= 70;
		}
		else if (month > 50) {
			month -= 50;
		}
		else if ((month > 20) && (year > 2003)) {
			 month -= 20;
		}
		var d = new Date();
		if(year > d.getFullYear()) {
			valid = false;
		}
		if(month == 0 || month > 12 || day == 0 || day > 31) {
			valid = false;
		}
	}
	if (!valid) {
		showElementError(element.id, "Zadali jste nesprávné RČ nebo IČ.");
		return false;
	} else {
		hideElementError(element.id);
	}
	return true;
}

/**
* kontrola SWIFT kódu - jen délky
* http://en.wikipedia.org/wiki/ISO_9362
*/
function validateSwift(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^(\w{8}|\w{11})$/)) {
		showElementError(element.id, "Swift kód musí obsahovat 8 nebo 11 znaků.");
		return false;
	} else {
		hideElementError(element.id);
	}
	return true;
}

/**
* osobní číslo obchodního zástupce má vždy 8 míst a začíná "R" (např. R0128931)
*/
function validateObchodniZastupce(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^\d{8}$/)) {
		showElementError(element.id, 'Osobní číslo obchodního zástupce má vždy 8 číslic.');
		return false;
	} else {
		hideElementError(element.id);
	}
	return true;
}

/**
* číslo smlouvy musí začínat na 1, 2, 3, 7 nebo 8
*/
function validateCisloSmlouvy(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^[12378]{1}\d*/)) {
		showElementError(element.id, 'Zadané číslo smlouvy nekryje ani jedno z uvedených pojištění ("Povinné ručení, havarijní pojištění včetně doplňků, privátní majetkové pojištění (pojištění domácnosti, nemovitosti, odpovědnosti)"). Vraťte se prosím zpět na stránku <a href="http://www.allianz.cz/obcane/sluzby/oznameni-skodne-udalosti">oznámení škodné události</a> a zvolte formulář pro daný typ pojištění.');
		return false;
	} else {
		hideElementError(element.id);
	}
	return true;
}

/**
* číslo škodné události - 10 číslic
*/
function validateCisloSkodneUdalosti(element) {
	element.value = element.value.replace(/\ /g,"");
	if(!validateRegexp(element, /^\d{10}$/)) {
		showElementError(element.id, 'Číslo škodné události musí obsahovat 10 číslic.');
		return false;
	} else {
		hideElementError(element.id);
	}
	return true;
}

