// Jacek Wiślicki 2005-09-04 (wersja 2006-08-20)

/** sprawdza wypełnienie wymaganego pola formularza */
function checkField(field, alias, minLength, required)
{
	var disallowed = new Array('<', '>', '"', '\'');
	var disallowedNames = new Array('lewy nawias ostry', 'prawy nawias ostry', 'cudzysłów', 'apostrof');
	var value = field.value;
	
	var znaki = "";
	if(minLength == 1)
		znaki = "znak";
	else if(minLength < 5)
		znaki = "znaki";
	else
		znaki = "znaków";
	
	if(required)
	{
		if(value == null || value.length == 0)
		{
			field.focus();
			field.select();
			alert('Podaj wartość pola \'' + alias + '\' (co najmniej ' + minLength + ' ' + znaki + ')!');
			return false;
		}
		else if(value.length < minLength)
		{
			field.focus();
			field.select();
			alert('Wartość pola \'' + alias + '\' musi mieć co najmniej ' + minLength + ' ' + znaki + '!');
			return false;
		}
	}
	
	for(var j = 0; j < disallowed.length; j++)
	{
		if(value.indexOf(disallowed[j]) >= 0)
		{
			field.focus();
			field.select();
			alert('Niedozwolony znak ' + disallowed[j] + ' (' + disallowedNames[j] + ') w polu \'' + alias + '\'!');
			return false;
		}
	}
	
	return true;
}

/** sprawdza wypełnienie wymaganego pola formularza */
function checkTextArea(field, alias, minLength, maxLength, required)
{
	if(!checkField(field, alias, minLength, required))
		return false;
		
	var value = field.value;
	
	var znaki = "";
	if(minLength == 1)
		znaki = "znak";
	else if(minLength < 5)
		znaki = "znaki";
	else
		znaki = "znaków";
		
	if(value.length > maxLength)
	{
		field.focus();
		field.select();
		alert('Wartość pola \'' + alias + '\' musi mieć nie więcej niż ' + minLength + ' ' + znaki + '!');
		return false;
	}
	
	return true;
}

/**  funkcja sprawdza powtórzenie wartości pola (np. hasła) */
function checkFieldRepeat(field1, alias1, field2, alias2)
{
	if(field1.value == field2.value)
		return true;
	else
	{
		field1.focus();
		field1.select();

		if(field1.type == "password" || field2.type == "password")
		{
			field1.value = "";
			field2.value = "";
			alert('Hasła wpisane w polach "' + alias1 + '" i "' + alias2 + '" nie są takie same!');
		}
		else
			alert('Wartości pól  "' + alias1 + '" i "' + alias2 + '" nie są takie same!');
		return false;
	}
}

/** funkcja sprawdza poprawną ilość zaznaczonych opcji w grupie checkbox lub na liscie*/
function checkSelectedOptions(min, max, optionGroup, alias)
{
	if(!optionGroup.type || optionGroup.type == "checkbox")//grupa lub 1 pole checkbox
	{
		var checked = getSelectedOptions(optionGroup);
		var singleOption = optionGroup.length == null;//grupa składa się tylko z 1 opcji
	
		if(checked > max)
		{
			alert("Zaznacz nie więcej niż " + max + " opcji w polu '" + alias + "'!");
			if(singleOption)
				optionGroup.focus();
			else
				optionGroup[0].focus();
			return false;
		}
		else if(checked < min)
		{
			alert("Zaznacz nie mniej niż " + min + " opcji w polu '" + alias + "'!");
			if(singleOption)
				optionGroup.focus();
			else
				optionGroup[0].focus();
			return false;
		}
		else
			return true;
	}
	else//lista wielokrotnego wyboru
	{
		var selected = getSelectedOptions(optionGroup);
		
		if(selected > max)
		{
			alert("Zaznacz nie więcej niż " + max + " opcji w polu '" + alias + "'!");
			optionGroup.focus();
			return false;
		}
		else if(selected < min)
		{
			alert("Zaznacz nie mniej niż " + min + " opcji w polu '" + alias + "'!");
			optionGroup.focus();
			return false;
		}
		else
			return true;
	}
}

/** funkcja zwraca ilość zaznaczonych opcji w grupie checkbox */
function getSelectedOptions(optionGroup)
{
	if(!optionGroup.type || optionGroup.type == "checkbox")//grupa lub 1 pole checkbox
	{
		var checked = 0;
		var singleOption = optionGroup.length == null;//grupa składa się tylko z 1 opcji
		
		if(singleOption)
		{
			if(optionGroup.checked)
				checked = 1;
		}
		else
		{
			for(var i = 0; i < optionGroup.length; i++)
				if(optionGroup[i].checked)
					checked++;
		}
		
		return checked;
	}
	else//lista wielokrotnego wyboru
	{
		var selected = 0;
		var options = optionGroup.options;
		
		for(var i = 0; i < options.length; i++)
			if(options[i].selected)
				selected++;
				
		return selected;
	}
}

//znak separatora pola daty w formacie rrrr-mm-dd
var dtCh = "-";

//źródło: http://www.smartwebby.com/DHTML/date_validation.asp
function isInteger(s)
{
	var i;
	for(i = 0; i < s.length; i++)
	{
		// Check that current character is number.
		var c = s.charAt(i);
		if(((c < "0") || (c > "9")))
			return false;
	}
	// All characters are numbers.
	return true;
}

//źródło: http://www.smartwebby.com/DHTML/date_validation.asp
function stripCharsInBag(s, bag)
{
	var i;
	var returnString = "";
	// Search through string's characters one by one.
	// If character is not in bag, append to returnString.
	for(i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if(bag.indexOf(c) == -1)
			returnString += c;
	}
	return returnString;
}

//źródło: http://www.smartwebby.com/DHTML/date_validation.asp
function daysInFebruary(year)
{
	// February has 29 days in any year evenly divisible by four,
	// EXCEPT for centurial years which are not also divisible by 400.
	return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
}

//źródło: http://www.smartwebby.com/DHTML/date_validation.asp
function DaysArray(n)
{
	for(var i = 1; i <= n; i++)
	{
		this[i] = 31
		if(i==4 || i==6 || i==9 || i==11)
			this[i] = 30;
		if(i==2)
			this[i] = 29;
	} 
	return this;
}

//źródło: http://www.smartwebby.com/DHTML/date_validation.asp
function isDate(dtStr)
{
	var daysInMonth = DaysArray(12);

	var pos1 = dtStr.indexOf(dtCh);
	var pos2 = dtStr.indexOf(dtCh, pos1 + 1);

	var strYear = dtStr.substring(0, pos1);
	var strMonth = dtStr.substring(pos1 + 1, pos2);
	var strDay = dtStr.substring(pos2 + 1);

	if(strDay.charAt(0) == "0" && strDay.length > 1)
		strDay = strDay.substring(1);
	if(strMonth.charAt(0) == "0" && strMonth.length > 1)
		strMonth = strMonth.substring(1);
	for(var i = 1; i <= 3; i++)
		if(strYear.charAt(0) == "0" && strYear.length > 1)
			strYear = strYear.substring(1);
		
	month = parseInt(strMonth);
	day = parseInt(strDay);
	year = parseInt(strYear);
	if(pos1 == -1 || pos2 == -1)
	{
		alert('Data powinna mieć format RRRR-MM-DD, np. 1977-11-03!')
		return false
	}
	if(strMonth.length < 1 || month < 1 || month > 12)
	{
		alert('Wprowadź poprawny miesiąc!')
		return false
	}
	if(strDay.length < 1 || day < 1 || day > 31 || (month == 2 && day > daysInFebruary(year)) || day > daysInMonth[month])
	{
		alert('Wprowadź poprawny dzień!')
		return false
	}
	if(dtStr.indexOf(dtCh, pos2 + 1) != -1 || isInteger(stripCharsInBag(dtStr, dtCh)) == false)
	{
		alert('Data może zawierać tylko cyfry!')
		return false
	}
	
	return true;
}

/** 
 * funkcja sprawdza poprawność daty w oparciu o funkcje JS z
 * http://www.smartwebby.com/DHTML/date_validation.asp
 */
function checkDate(year, month, date, minDateAllowed, maxDateAllowed, required)
{
	var date = year.value + dtCh + month.value + dtCh + date.value;
	if(!required && date == dtCh + dtCh)
		return true;
	
	if(!isDate(date))
	{
		year.focus();
		year.select();
		return false;
	}
	else
	{
		if(minDateAllowed != null && minDateAllowed != '' && date < minDateAllowed)
		{
			alert('Data nie może być wcześniejsza niż ' + minDateAllowed + '!');
			year.focus();
			year.select();
			return false;
		}
		else if(maxDateAllowed != null && maxDateAllowed != '' && date > maxDateAllowed)
		{
			alert('Data nie może być późniejsza niż ' + maxDateAllowed + '!');
			year.focus();
			year.select();
			return false;
		}
	}
	
	return true;
}

/** funkcja sprawdza relację dat */
function checkDatesRelation(fromYear, fromMonth, fromDay, toYear, toMonth, toDay, required)
{
	var fromDate = fromYear.value + dtCh + fromMonth.value + dtCh + fromDay.value;
	var toDate = toYear.value + dtCh + toMonth.value + dtCh + toDay.value;

	var fromInt;
	var toInt;

	if(!required && fromDate == dtCh + dtCh && toDate == dtCh + dtCh)
		return true;

	if(!isDate(fromDate))
		return false;
	if(!isDate(toDate))
		return false;

	var pos1 = fromDate.indexOf(dtCh);
	var pos2 = fromDate.indexOf(dtCh, pos1 + 1);

	var strYear = fromDate.substring(0, pos1);
	var strMonth = fromDate.substring(pos1 + 1, pos2);
	var strDay = fromDate.substring(pos2 + 1);

	if(strDay.length < 2)
		strDay = "0" + strDay;
	if(strMonth.length < 2)
		strMonth = "0" + strMonth;
	if(strYear.length < 2)
		strYear = "0" + strYear;
		
	fromInt = parseInt(strYear + strMonth + strDay);

	pos1 = toDate.indexOf(dtCh);
	pos2 = toDate.indexOf(dtCh, pos1 + 1);

	strYear = toDate.substring(0, pos1);
	strMonth = toDate.substring(pos1 + 1, pos2);
	strDay = toDate.substring(pos2 + 1);

	if(strDay.length < 2)
		strDay = "0" + strDay;
	if(strMonth.length < 2)
		strMonth = "0" + strMonth;
	if(strYear.length < 2)
		strYear = "0" + strYear;
		
	toInt = parseInt(strYear + strMonth + strDay);

	if(fromInt <= toInt)
		return true;
	else
	{
		alert('Błąd relacji dat!\n(' + fromDate + ' jesr późniejsza od ' + toDate + ')');
		fromYear.focus();
		fromYear.select();
		return false;
	}
}

/** funkcja sprawdza, czy dany ciąg znaków zawiera wyłącznie cyfry */
function hasOnlyDigits(field)
{
	var text = field.value;
	
	for(var i = 0; i < text.length; i++)
	{
		if(!isInteger(text.charAt(i)))
		{
			field.focus();
			field.select();
			return false;
		}
	}
	
	return true;
}

/** funkcja sprawdza poprawność numeru NIP */
function checkNIP(nipField, required)
{
	var nip = nipField.value;
	
	if(!required && (nip == null || nip.length == 0))
		return true;
	
	if(nip == null || nip.length != 10)
	{
		alert('NIP musi mieć długość 10 znaków!');
		nipField.focus();
		nipField.select();
		return false;
	}
	
	if(!hasOnlyDigits(nipField))
	{
		alert('NIP może zawierać tylko cyfry!');
		nipField.focus();
		nipField.select();
		return false;
	}
	
	var wagi = [6, 5, 7, 2 ,3, 4, 5, 6, 7];
	var suma = 0;
	for(var i = 0; i < wagi.length; i++)
		suma += wagi[i] * nip.charAt(i);

	if(suma % 11 == nip.charAt(nip.length - 1))
		return true;
	else
    {
		alert('Błędny numer NIP!');
		nipField.focus();
		nipField.select();
		return false;
     }
}

/** funkcja sprawdza poprawność numeru REGON */
function checkREGON(regonField, required)
{
	var regon = regonField.value;
	
	if(!required && (regon == null || regon.length == 0))
		return true;
	
	if(regon == null || regon.length != 9)
	{
		alert('REGON musi mieć długość 9 znaków');
		regonField.focus();
		regonField.select();
		return false;
	}

	if(!hasOnlyDigits(regonField))
	{
		alert('REGON może zawierać tylko cyfry!');
		regonField.focus();
		regonField.select();
		return false;
	}
	
	var wagi = [8, 9, 2, 3, 4, 5, 6, 7];
	var suma = 0;
	for(var i = 0; i < wagi.length; i++)
		suma += wagi[i] * regon.charAt(i);

	if(suma % 11 == regon.charAt(regon.length - 1) || (suma % 11 == 10 && regon.charAt(regon.length - 1) == 0))
		return true;
	else
    {
		alert('Błędny numer REGON!');
		regonField.focus();
		regonField.select();
		return false;
     }
}

/** funkcja sprawdza poprawność numeru PESEL */
function checkPESEL(peselField, required)
{
	var pesel = peselField.value;
	
	if(!required && (pesel == null || pesel.length == 0))
		return true;
	
	if(pesel == null || pesel.length != 11)
	{
		alert('PESEL musi mieć długość 11 znaków!');
		peselField.focus();
		peselField.select();
		return false;
	}
	
	if(!hasOnlyDigits(peselField))
	{
		alert('PESEL może zawierać tylko cyfry!');
		peselField.focus();
		peselField.select();
		return false;
	}
	
	var wagi = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
	var suma = 0;
	for(var i = 0; i < wagi.length; i++)
		suma += wagi[i] * pesel.charAt(i);
	
	var mod = suma % 10;
	if(mod == 0)
		mod = 10;
		
	if(10 - mod == pesel.charAt(pesel.length - 1))
		return true;
	else
    {
		alert('Błędny numer PESEL!');
		peselField.focus();
		peselField.select();
		return false;
     }
}

/** funkcja sprawdza, czy zaznaczone zostało odpowiednie pole z grupy (np. przy akceptacji warunkóww, licencji, ...) */
function isFieldChecked(fieldGroup, selectedOptionIndex, komunikat)
{
	if(fieldGroup[selectedOptionIndex].checked)
		return true;
	else
	{
		alert(komunikat);
		fieldGroup[selectedOptionIndex].focus();
		return false;
	}
}

/** 
 * sprawdza poprawność adresu email w oparciu o funkcje JS z
 * http://www.smartwebby.com/DHTML/email_validation.asp
 */
function checkEmail(emailField, required)
{
	var email = emailField.value;
	
	if(!required && (email == null || email.length == 0))
		return true;
		
	var at = "@";
	var dot = ".";
	var lat = email.indexOf(at);
	var lstr = email.length;
	var ldot = email.indexOf(dot);

	var ok = true;
	
	if(email.indexOf(at) == -1 || email.indexOf(at) == 0 || email.indexOf(at) == lstr)
		ok = false;
	else if(email.indexOf(dot) == -1 || email.indexOf(dot) == 0 || email.indexOf(dot) == lstr)
		ok = false;
	else if(email.indexOf(at, (lat + 1)) != -1)
		ok = false;
	else if(email.substring(lat - 1, lat) == dot || email.substring(lat + 1, lat + 2) == dot)
		ok = false;
	else if(email.indexOf(dot, (lat + 2)) == -1)
		ok = false;
	else  if(email.indexOf(" ") != -1)
		ok = false;

 	if(!ok)
 	{
 		emailField.focus();
 		emailField.select();
 		alert('Wprowadź poprawny adres email!');
 		return false;
 	}
 	else
	{
		var domain = email.substring(lat + 1);
		ok = validateDomainName(domain);
		if(!ok)
		{
			alert('Wprowadź poprawny adres email!');
			emailField.focus();
			emailField.select();
		}
		return ok;
	}
}

/** sprawdza poprawność kodu pocztowego */
function checkKodPocztowy(kodField, required)
{
	var kod = kodField.value;
	var ok = true;

	if(!required && (kod == null || kod.length == 0))
		return true;
	
	if(kod.length != 6)
		ok = false;
	else
	{
		for(var i = 0; i < kod.length; i++)
		{
			if(i == 2)
			{
				if(kod.charAt(i) != "-")
				{
					ok = false;
					break;
				}
			}
			else if(!isInteger(kod.charAt(i)))
			{
				ok = false;
				break;
			}
		}
	}
	
	if(!ok)
	{
		kodField.focus();
		kodField.select();
		alert('Wprowadź poprawny kod pocztowy!');
		return false;
	}
	else
		return true;
}

/** funkcja sprawdza poprawność wprowadzonego hasła */
function checkPassword(loginNameField, passwordField)
{
	var password = passwordField.value;
	
	if(password.length < 5)
	{
		alert('Hasło musi mieć co najmniej 5 znakóww długości!');
		passwordField.focus();
		passwordField.select();
		return false;
	}
	else if(loginNameField != null && password == loginNameField.value)
	{
		alert('Hasło nie może być identyczne z nazwą użytkownika!');
		passwordField.focus();
		passwordField.select();
		return false;
	}
	
	return true;
}

/** funkcja sprawdza poprawność domeny (źródło: hscripts.com) */
function checkDomain(domainField, required)
{
	var domain = domainField.value;
	
	if(!required && (domain == null || domain.length == 0))
		return true;

	var ok = validateDomainName(domain);
	if(!ok)
	{
		domainField.focus();
		domainField.select();
	}
	return ok;
}

/** sprawdza poprawność domeny */
function validateDomainName(domain)
{
	var arr = new Array(
		'.com','.net','.org','.biz','.coop','.info','.museum','.name',
		'.pro','.edu','.gov','.int','.mil','.ac','.ad','.ae','.af','.ag',
		'.ai','.al','.am','.an','.ao','.aq','.ar','.as','.at','.au','.aw',
		'.az','.ba','.bb','.bd','.be','.bf','.bg','.bh','.bi','.bj','.bm',
		'.bn','.bo','.br','.bs','.bt','.bv','.bw','.by','.bz','.ca','.cc',
		'.cd','.cf','.cg','.ch','.ci','.ck','.cl','.cm','.cn','.co','.cr',
		'.cu','.cv','.cx','.cy','.cz','.de','.dj','.dk','.dm','.do','.dz',
		'.ec','.ee','.eg','.eh','.er','.es','.et','.fi','.fj','.fk','.fm',
		'.fo','.fr','.ga','.gd','.ge','.gf','.gg','.gh','.gi','.gl','.gm',
		'.gn','.gp','.gq','.gr','.gs','.gt','.gu','.gv','.gy','.hk','.hm',
		'.hn','.hr','.ht','.hu','.id','.ie','.il','.im','.in','.io','.iq',
		'.ir','.is','.it','.je','.jm','.jo','.jp','.ke','.kg','.kh','.ki',
		'.km','.kn','.kp','.kr','.kw','.ky','.kz','.la','.lb','.lc','.li',
		'.lk','.lr','.ls','.lt','.lu','.lv','.ly','.ma','.mc','.md','.mg',
		'.mh','.mk','.ml','.mm','.mn','.mo','.mp','.mq','.mr','.ms','.mt',
		'.mu','.mv','.mw','.mx','.my','.mz','.na','.nc','.ne','.nf','.ng',
		'.ni','.nl','.no','.np','.nr','.nu','.nz','.om','.pa','.pe','.pf',
		'.pg','.ph','.pk','.pl','.pm','.pn','.pr','.ps','.pt','.pw','.py',
		'.qa','.re','.ro','.rw','.ru','.sa','.sb','.sc','.sd','.se','.sg',
		'.sh','.si','.sj','.sk','.sl','.sm','.sn','.so','.sr','.st','.sv',
		'.sy','.sz','.tc','.td','.tf','.tg','.th','.tj','.tk','.tm','.tn',
		'.to','.tp','.tr','.tt','.tv','.tw','.tz','.ua','.ug','.uk','.um',
		'.us','.uy','.uz','.va','.vc','.ve','.vg','.vi','.vn','.vu','.ws',
		'.wf','.ye','.yt','.yu','.za','.zm','.zw', 
		'.eu');

	var val = true;
	
	var dot = domain.lastIndexOf(".");
	var dname = domain.substring(0, dot);
	var ext = domain.substring(dot, domain.length);

	if(dot > 1 && dot < 57)
	{
		for(var i = 0; i < arr.length; i++)
		{
			if(ext == arr[i])
			{
				val = true;
				break;
			}
			else
			{
				val = false;
			}
		}
		if(val == false)
		{
			alert("Rozszerzenie domeny '" + ext + "' jest niepoprawne!");
			return false;
		}
		else
		{
			for(var j = 0; j < dname.length; j++)
			{
				var dh = dname.charAt(j);
				var hh = dh.charCodeAt(0);
				if((hh > 47 && hh < 59) || (hh > 64 && hh < 91) || (hh > 96 && hh < 123) || hh == 45 || hh == 46)
				{
					if((j == 0 || j == dname.length - 1) && hh == 45)
					{
						alert("Nazwa domeny nie może zaczynać się od '-'!");
						return false;
					}
				}
				else
				{
					alert("Nazwa domeny nie może zawierać polskich znaków ani innych znaków specjalnych!");
					return false;
				}
			}
		}
	}
	else
	{
		alert("Niewłasciwa długość nazwy domeny!");
		return false;
	}

	return true;
}

/** funkcja sprawdza znaki wprowadzone w polu loginu/hasla */
function checkPasswordOrLogin(field, alias)
{
	var value = field.value;
	
	for(var i = 0; i < value.length; i++)
	{
		var letter = value.charAt(i);
		var code = letter.charCodeAt(0);
		
		if(!(code >= 97 && code <= 122) && !(code >= 48 && code <= 57) && code != 95)
		{
			field.focus();
			field.select();
			alert("Błędny znak '" + letter + "' w polu '" + alias + "'!\nWartość pola '" + alias + "' może zawierać jedynie małe litery łacińskie (bez polskich znaków diakrytycznych), cyfry i znaki _ (podkreślenie)");
			return false;
		}
	}
	
	return true;
}

/** funkcja sprawdza, czy wartośc pola jest liczbą całkowitą o minimalnej wartości */
function checkNumberValue(field, alias, minValue)
{
	if(!hasOnlyDigits(field))
	{
		field.focus();
		field.select();
		alert("Wartość pola '" + alias + "' musi być liczbą całkowitą >= " + minValue + "!");
		return false;
	}
	
	var value = field.value;
	if(value < minValue)
	{
		field.focus();
		field.select();
		alert("Wartość pola '" + alias + "' musi być liczbą całkowitą >= " + minValue + "!");
		return false;
	}
	
	return true;
}

/** Funkcja przycina string */
function trim(s)
{
	while(s.substring(0, 1) == ' ')
		s = s.substring(1, s.length);
	while(s.substring(s.length - 1, s.length) == ' ')
		s = s.substring(0, s.length - 1);
	
	return s;
}
