function checkPESEL(number) {
	/*
	 * ERROR CODE | OPIS -1 | Ciąg zawiera znaki rózne od cyfr (KRYTYCZNY) -2 |
	 * Długość ciągu jest rożna od 11 cyfr (KRYTYCZNY) -3 | Niepoprawna data
	 * (KRYTYCZNY) -4 | Zła płeć (DOPUSZCZALNY) -5 | Niepoprawna suma kontrolna
	 * (DOPUSZCZALNY) 1 | OK
	 */
	var error_code = 1; // OK

	if (!isInteger(number)) // sprawdzamy czy ciąg zawiera tylko i wyłącznie
	// cyfry
	{

		error_code = -1; // not integer
		return error_code;
	}
	if (number.length != 11) // sprawdzamy czy ciąg ma 11 znaków
	{
		error_code = -2; // bad length
		return error_code;
		number.charAt(1);
	}

	if (!DatawPeselu(number)) // sprawdzamy date w peselu
	{
		error_code = -3;
		return error_code;
	}
	/*
	 * // Sprawdzamy czy przedostatnia cyfra zgadza się z plcia if
	 * (parseInt(number.charAt(9)) % 2 && sex == "k") error_code = -4; // bad
	 * sex else if (!(parseInt(number.charAt(9)) % 2) && sex == "m") error_code =
	 * -4 // bad sex;
	 */
	var arrSteps = new Array(1, 3, 7, 9, 1, 3, 7, 9, 1, 3); // tablica z
	// odpowiednimi
	// wagami
	var intSum = 0;
	for ( var i = 0; i < 10; i++) {
		intSum += arrSteps[i] * parseInt(number.charAt(i)); // mnożymy każdy ze
		// znaków przez wagę
		// i sumujemy
		// wszystko
	}
	var intCr = 10 - intSum % 10; // obliczamy sumę kontrolną
	intControlNr = (intCr == 10) ? 0 : intCr;
	if (intControlNr == parseInt(number.charAt(10))) // sprawdzamy czy taka
	// sama suma kontrolna
	// jest w ciągu
	{
		if (error_code != -4) {

			error_code = 1;
		}
	} else if (error_code == 1) {

		error_code = -5; // bad checksum
	}

	return error_code;
}

function isPESELValid(value, sex, wiek, data) {

	if (checkPESEL(value, sex) == -1) {
		alert("PESEL musi składać sie tylko i wyłącznie z cyfr")
		return false;

	}

	if (checkPESEL(value, sex) == -2) {
		alert("PESEL powinien się składać z 11 cyfr")
		return false;

	}

	// if (checkPESEL(value,sex) == -3) {
	// alert("Zła data !")
	// return false;

	// }
	if (!checkAge(value, sex, wiek, data)) {
		if (confirm("Pole \"PESEL\" lub pole \"wiek\" zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
			return true;
		} else {
			return false;
		}

	}

	if (checkPESEL(value, sex) == -4) {
		if (confirm("Pole \"PESEL\" lub pole \"płeć\" zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
			return true;
		} else {
			return false;
		}

	}
	if (checkPESEL(value, sex) == -5) {

		if (confirm("Pole \"PESEL\" zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
			return true;
		} else {
			return false;
		}
	} else {
		return true;
	}
}

function checkAge(value, sex, wiek, data) {

	// alert(value + " " + sex + " " + wiek + " " + data);
	var result;

	if (parseInt(value.charAt(0)) != 0) {
		var rok = parseInt(value.charAt(0) + value.charAt(1));

	} else {
		var rok = parseInt(value.charAt(1));

	}

	if (parseInt(value.charAt(2)) != 0) {

		var mies = parseInt(value.charAt(2) + value.charAt(3));
	} else {

		var mies = parseInt(value.charAt(3));

	}
	var wiek = parseInt(wiek);
	var suma = rok + wiek;
	// alert(rok)
	// alert(mies);
	// alert(data + " + X = " + suma + " rok:" + rok + " wiek:" + wiek);
	// alert(data + 100);
	if (mies > 0 && mies < 13) {
		if ((data + 100) == suma || (data + 99) == suma || (data + 101) == suma) {
			result = true;
			// return true;
		} else {
			result = false;
			// return false;
		}
	} else if (mies > 20 && mies < 33)
		if ((data + 100) == suma || (data + 99) == suma || (data + 101) == suma) {
			result = true;
			// return true;
		} else {
			// return true;
			result = false;
		}

	else
		result = false;
	// return false;
	// alert("result: " + result);
	return result;
}

function isLetter(c) {
	if (c < 'A') {
		return false;
	}
	if (c > 'Z' && c < 'a') {
		return false;
	}
	if (c > 'z') {
		return false;
	}
	return true;
}

function isDigit(d) {
	return d >= '0' && d <= '9';
}

function isInteger(s) {
	var i;
	for (i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (((c < "0") || (c > "9"))) {
			return false;
		}
	}
	return true;
}

function DatawPeselu(tempStr) {
	var century = new Array(1900, 2000, 2100, 2200, 1800);
	var dwm = new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0);
	data = tempStr.substring(0, 6);
	dd = parseInt(data.substring(4, 6), 10);
	cc = parseInt(data.substring(2, 4), 10);
	bb = parseInt(data.substring(0, 2), 10);
	mm = cc % 20;
	rr = century[Math.floor(cc / 20)] + bb;
	if (((rr % 4 == 0) && (rr % 100 != 0)) || (rr % 400 == 0))
		dwm[2] = 29;

	if (mm < 1 || mm > 12 || dd < 1 || dd > dwm[mm]) {
		return false;
	}
	return true;
}

function isEmailValid(email) {
	pattern = /[^@]+@[^\.]+\..+/;
	return pattern.test(email);
}

function isPostCodeValid(value) {
	var patternPostCode = /(^[0-9]{2,2}-[0-9]{3,3}$)|(^$)/;
	return patternPostCode.test(value);
}

function isLoginValid(login) {
	isValid = (login != null && login.length >= 6);
	if (isValid) {
		for (i = 0; i < login.length; i++) {
			if (!isLetter(login.charAt(i)) && !isDigit(login.charAt(i))
					&& login.charAt(i) != '_') {
				isValid = false;
				break;
			}
		}
	}
	return isValid;
}

function isChecked(radio) {
	for (i = radio.length - 1; i > -1; i--) {
		if (radio[i].checked) {
			return true;
		}
	}
	return false;
}

function checkNIP(number) {

	/*
	 * ERROR CODE | OPIS -1 | Ciąg zawiera znaki rózne od cyfr (KRYTYCZNY) -2 |
	 * Długość ciągu jest rożna od 10 cyfr (KRYTYCZNY) -3 | Niepoprawna suma
	 * kontrolna (DOPUSZCZALNY) 1 | OK
	 */
	var error_code = 1; // OK

	if (!isInteger(number)) // sprawdzamy czy ciąg zawiera tylko i wyłącznie
	// cyfry
	{

		error_code = -1; // not integer
		return error_code;
	}
	if (number.length != 10) // sprawdzamy czy ciąg ma 10 znaków
	{
		error_code = -2; // bad length
		return error_code;
	}

	var arrSteps = new Array(6, 5, 7, 2, 3, 4, 5, 6, 7); // tablica z
	// odpowiednimi
	// wagami
	var intSum = 0;
	for ( var i = 0; i < 9; i++) {
		intSum += arrSteps[i] * parseInt(number.charAt(i)); // mnożymy każdy ze
		// znaków przez wagę
		// i sumujemy
		// wszystko
	}
	var intCr = intSum % 11; // obliczamy sumę kontrolną
	intControlNr = intCr;
	if (intControlNr == parseInt(number.charAt(9))) // sprawdzamy czy taka sama
	// suma kontrolna jest w
	// ciągu
	{

		error_code = 1;

	} else {

		error_code = -3; // bad checksum
	}

	return error_code;
}

function isNIPValid(value) {
	value = IsNumeric(value);
	if (checkNIP(value) == -1) {
		alert("NIP musi składać sie tylko i wyłącznie z cyfr")
		return false;

	}

	if (checkNIP(value) == -2) {
		alert("NIP musi się składać z 10 cyfr")
		return false;

	}

	if (checkNIP(value) == -3) {

		if (confirm("Pole NIP zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
			return true;
		} else {
			return false;
		}
	} else {
		return true;
	}
}

function IsNumeric(sText)

{
	var ValidChars = "0123456789";
	var nip = "";
	var Char;

	for (i = 0; i < sText.length; i++) {
		Char = sText.charAt(i);
		if (ValidChars.indexOf(Char) != -1) {
			nip += Char;
		}
	}
	return nip;

}

/*
 * 
 * Poniżej wersje z podziałem na alerty i confirmy... nigdy jednocześnie nie
 * wyskakują. Różnica w wywółaniu to @param confirmed
 * 
 */

function isPESELValid(value, sex, wiek, data, confirmed) {
	if (!confirmed) {
		if (checkPESEL(value, sex) == -1) {
			alert("PESEL musi składać sie tylko i wyłącznie z cyfr");
			return false;
		}

		if (checkPESEL(value, sex) == -2) {
			alert("PESEL powinien się składać z 11 cyfr");
			return false;
		}
	} else {
		if (!checkAge(value, sex, wiek, data)) {
			if (confirm("Pole \"PESEL\" lub pole \"wiek\" zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
				return true;
			} else {
				return false;
			}
		}

		if (checkPESEL(value, sex) == -4) {
			if (confirm("Pole \"PESEL\" lub pole \"płeć\" zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
				return true;
			} else {
				return false;
			}
		}
		if (checkPESEL(value, sex) == -5) {

			if (confirm("Pole \"PESEL\" zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
				return true;
			} else {
				return false;
			}
		} else {
			return true;
		}
	}
	return true;
}

function isNIPValid(value, confirmed) {

	value = IsNumeric(value);

	if (!confirmed) {
		if (checkNIP(value) == -1) {
			alert("NIP musi składać sie tylko i wyłącznie z cyfr")
			return false;

		}

		if (checkNIP(value) == -2) {
			alert("NIP musi się składać z 10 cyfr ")
			return false;

		}

	} else {

		if (checkNIP(value) == -3) {
			if (confirm("Pole NIP zawiera nieprawidłową wartość.\nCzy mimo to zatwierdzić formularz?")) {
				return true;
			} else {
				return false;
			}
		} else {
			return true;
		}

	}
	return true;
}

function isPESELValid2(value, sex, wiek, data) {

	if (!checkAge(value, sex, wiek, data) && (checkPESEL(value, sex) == -4))
		return "Pole \"PESEL\" lub pole \"wiek\" zawiera nieprawidłową wartość.\nPole \"PESEL\" lub pole \"płeć\" zawiera nieprawidłową wartość.";

	else if (!checkAge(value, sex, wiek, data)) {

		return "Pole \"PESEL\" lub pole \"wiek\" zawiera nieprawidłową wartość.";
	}

	else if (checkPESEL(value, sex) == -4) {
		return "Pole \"PESEL\" lub pole \"płeć\" zawiera nieprawidłową wartość.";
	}

	else if (checkPESEL(value, sex) == -5) {

		return "Pole \"PESEL\" zawiera nieprawidłową wartość.";
	} else {
		return "";
	}
}

function isNIPValid2(value) {

	value = IsNumeric(value);

	if (checkNIP(value) == -3) {
		return "Pole NIP zawiera nieprawidłową wartość.";
	} else {
		return "";

	}

}

// 1 arg: pesel
// 2. data w formacie DD-MM-YYYY
function isAdult(pesel,curDateStr) {

	// do formatu MM/DD/YYYY
	var curDateStrUs = curDateStr.substr(3,2) + "/" + curDateStr.substr(0,2) + "/" + curDateStr.substr(6);

	var month = parseInt( pesel.substr(2,2), 10 );
	if( month > 12 || month < 1 ) 
		return false;

	var peselDateStrUs = pesel.substr(2,2) + "/" + pesel.substr(4,2) + "/19" + pesel.substr(0,2);

	
	var currentDate = new Date(curDateStrUs);
	var peselDate = new Date(peselDateStrUs);

	peselDate.setYear(peselDate.getFullYear() + 18); // dzien w ktorym bedzie miec 18 urodziny
	
	if (peselDate > currentDate) // czy skończone
		return false;
	
	return true;
}

function checkREGON(value) {
	value = IsNumeric(value);
	var len = value.length;
	
	
	if ( len == 9 ) { // REGON 9
		
		var arrSteps = new Array(8, 9, 2, 3, 4, 5, 6, 7); // tablica z
		// odpowiednimi
		// wagami
		var intSum = 0;
		for ( var i = 0; i < 8; i++) {
			intSum += arrSteps[i] * parseInt(value.charAt(i)); // mnożymy każdy ze
			// znaków przez wagę
			// i sumujemy
			// wszystko
		}
		var intCr = intSum % 11; // obliczamy sumę kontrolną
	
		if (intCr == 10) // hack
			intCr = 0;
	
		if (intCr == parseInt(value.charAt(8))) // suma kontrolna
			return true;
		return false;
	
	} else if ( len == 14 ) { // REGON 14
		
		var arrSteps = new Array(8, 9, 2, 3, 4, 5, 6, 7); // tablica z
		// odpowiednimi
		// wagami
		var intSum = 0;
		for ( var i = 0; i < 8; i++) {
			intSum += arrSteps[i] * parseInt(value.charAt(i)); // mnożymy każdy ze
			// znaków przez wagę
			// i sumujemy
			// wszystko
		}
		var intCr = intSum % 11; // obliczamy sumę kontrolną

		if (intCr == 10) // hack
			intCr = 0;

		if (intCr != parseInt(value.charAt(8))) // suma kontrolna 9-cyfrowego
			return false;
		
		// analiza 14 cyfrowego
		
		arrSteps = new Array(2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8 );
		
		intSum = 0;
		
		for ( i = 0; i < 13; i++) {
			intSum += arrSteps[i] * parseInt(value.charAt(i)); // mnożymy każdy ze
			// znaków przez wagę
			// i sumujemy
			// wszystko
		}
		var intCr = intSum % 11;
		
		if (intCr == 10) // hack
			intCr = 0;
		
		if (intCr != parseInt(value.charAt(13))) // suma kontrolna 14-cyfrowego
			return false;
		return true;
		
	} else { // FAIL
		
		return false;
		
	}

}

function test_nip(value) {

	if (isNIPValid2(value) != "")
		return false;
	return true;
}

function test_regon(value) {

	return checkREGON(value);
}

function test_pesel(value) {

	if (checkPESEL(value) != 1)
		return false;
	return true;
}

// zwraca płeć na podst. peselu
function getSexFromPesel(value) {
	if (parseInt(value.charAt(9)) % 2 == 0)
		return "K";
	return "M";
}
