var validate = function() {
	var expr = {
		data: /^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))$/,
		data2: /^(\d{2})\/(\d{2})\/(\d{4})$/,
		pesel: /^\d{11}$/,
		nip: /^\d{10}$/,
		regon: /^\d{7}$|^\d{9}$|^\d{14}$/,
		dowod: /^[a-z]{3}\d{6}$/i,
		paszport: /^[a-z]{2}\d{6,7}$/i
	};
	
	function set(field, val) {
		if ($.inArray(fiels, expr))
			expr.field = val;
	}
	
	function data(value) {
		return expr.data.test(value);
	}
	
	function data2(value, format, empty) {
		if (typeof empty == 'undefined')
			empty = false;
		
		if (expr.data2.test(value)) {
			var expr2 = /^([ymd]).([ymd]).([ymd])$/i;
			var fmt = new Object();
			var tmp = format.match(expr2);
			
			for (var i = 1; i < 4; i++)
				fmt[tmp[i]] = i;
			
			var arr = value.match(expr.data2);
			
			var d = new Date();
			
			var rok = arr[fmt.y] * 1;
			var miesiac = (arr[fmt.m] * 1) - 1;
			var dzien = arr[fmt.d] * 1;
			
			d.setFullYear(rok, miesiac, dzien);
			
			return ((d.getFullYear() == rok && d.getMonth() == miesiac && d.getDate() == dzien) || (value == '0000-00-00' && empty == true));
		} else
			return false;
	}
	
	function pesel(value) {
		if (expr.pesel.test(value)) {
			var arr = value.split('');
			var dlugosc = arr.length - 1;
			var suma = 0;
			var wagi = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
			
			for (var j = 0; j < dlugosc; j++)
				suma += parseInt(arr[j]) * wagi[j];
			
			return (((10 - (suma % 10)) % 10) == parseInt(arr[dlugosc]));
		} else
			return false;
	}
	
	function nip(value) {
		if (expr.nip.test(value)) {
			var arr = value.split('');
			var dlugosc = arr.length - 1;
			var suma = 0;
			var wagi = [6, 5, 7, 2, 3, 4, 5, 6, 7];
			
			for (var j = 0; j < dlugosc; j++)
				suma += parseInt(arr[j]) * wagi[j];		
			
			return ((suma % 11) == parseInt(arr[dlugosc]));
		} else
			return false;
	}
	
	function regon(value) {
		if (expr.regon.test(value)) {
			var arr = value.split('');
			var dlugosc = arr.length - 1;
			var suma = 0;
			var wagi;
			
			if (dlugosc + 1 == 9)
				wagi = [8, 9, 2, 3, 4, 5, 6, 7];
			else if (dlugosc + 1 == 14)
				wagi = [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8];
			else
				wagi = [2, 3, 4, 5, 6, 7];
			
			for (var j = 0; j < dlugosc; j++)
				suma += parseInt(arr[j]) * wagi[j];
			
			return (((suma % 11) % 10) == parseInt(arr[dlugosc]));
		} else
			return false;
	}
	
	function dowod(value, ctrl) {
		if (expr.dowod.test(value)) {
			var wartosci = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
			var wagi = [7, 3, 1, 0, 7, 3, 1, 7, 3, 1];
			var wagi2 = [7, 3, 1, 7, 3, 1, 7, 3, 1, 7];
			var arr = value.toUpperCase().split('');
			var suma = 0;
			var suma2 = 0;
			
			for (var i = 0, dlugosc = arr.length; i < dlugosc; i++) {
				suma += wartosci.indexOf(arr[i]) * wagi[i];
				suma2 += wartosci.indexOf(arr[i]) * wagi2[i];
			}
			
			if (!(/^\d$/).test(ctrl))
				var val = prompt("Podaj cyfrę kontrolną.\nJest to ostatnia cyfra po numerze dowodu w obszarze do odczytu elektronicznego.");
			else
				var val = ctrl;
			
			if (val != null && val != "" && (/^\d$/).test(val))
				return (((suma % 10) == parseInt(arr[3])) && ((suma2 % 10) == parseInt(val)));
			else
				return false;
		} else
			return false;
	}
	
	function paszport(value, ctrl) {
		if (expr.paszport.test(value)) {
			if (value.length == 8)
				return true;
			
			var wartosci = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
			var wagi = [7, 3, 1, 7, 3, 1, 7, 3, 1];
			var arr = value.toUpperCase().split('');
			var suma = 0;
			var ret = false;
			
			for (var i = 0, dlugosc = arr.length; i < dlugosc; i++)
				suma += wartosci.indexOf(arr[i]) * wagi[i];
			
			if (!(/^\d$/).test(ctrl))
				var val = prompt("Podaj cyfrę kontrolną.\nJest to ostatnia cyfra po numerze paszportu w obszarze do odczytu elektronicznego.");
			else
				var val = ctrl;
			
			if (val != null && val != "" && (/^\d$/).test(val))
				return ((suma % 10) == parseInt(val));
			else
				return false;
		} else
			return false;
	}
	
	return {
		set: set,
		data: data2,
		nip: nip,
		pesel: pesel,
		regon: regon,
		dowod: dowod,
		paszport: paszport
	}
}();

