/****************************************************
* This file is a set of functions useful for data	*
* validation. It contains AV framework, which is	*
* described in /doc/validate.html					*
* AUTHOR: Jarosław Kątnik (jarek@katnik.pl)			*
* LAST MODIFICATION: 2007-01-28						*
*****************************************************/

//zmienne
var AV_ERROR_BG_COLOR = '#FFBBBB';
var AV_SEPS = '.,';
var AV_DATE_SEPS = '-./';
var AV_DEF_SEP = '.';
var AVFunctions = new Array();
var AV_LABEL = [];
	AV_LABEL['mandatory'] = 'Pole obowiązkowe! ';

//funkcje frameworku AV
function AVAll(form) {
	try {
		if (!AVFormExist(form)) {
			return;
		}
	
		var ok = true;
		for (var i = 0; i < form.length; i++) {
			var fieldType = form[i].getAttribute('type');
			if (fieldType != 'checkbox'
					&& fieldType != 'radio'
					&& fieldType != 'button'
					&& fieldType != 'submit'
					&& fieldType != 'hidden'
					&& form[i].tagName != 'FIELDSET') {
				ok &= AV(form[i]);
			}
		}

		if (!ok) {
			alert('Proszę poprawić podświetlone pola!');
		}
	
		return Boolean(ok);
	} catch (e) {
		reportError('AVAll', e);
	}
}

function AVIsTrue(val) {
	return (val && val.toLowerCase() == 'true') || val == 1;
}

function AVIsFalse(val) {
	return (val && val.toLowerCase() == 'false') || val == 0;
}

function AVFormExist(form) {
	if (!form) {
		alert('Błąd walidacji! Podany formularz nie istnieje!');
		return false;
	} else if (form.tagName != 'FORM') {
		alert('Błąd walidacji! Podany element nie jest formularzem!');
		return false;
	}
	return true;
}

function AVInit(form) {
	if (!AVFormExist(form)) {
		return;
	}

	for (var i = 0; i < form.length; i++) {
		var e = form[i];
		if (AVIsTrue(e.getAttribute("mandatory"))) {
			e.asterix = document.createElement('span');
			e.asterix.className = 'AVMandatory';
			e.asterix.innerHTML = '*';
			var p = e.parentNode != null ? e.parentNode : e.parentElement;
			p.insertBefore(e.asterix, e.nextSibling);
		}
	}
}

function AVGetErrorMsgSpan(e) {
	var span = e.errorSpan;
	if (!span) {
		span = document.createElement('span');
		span.className ='AVError';
				
		span.style.top = findPosY(e);
		
		var left = findPosX(e) + 10;
		if (e.style) {
			if (isIe) {
				left += parseInt(e.offsetWidth);
			} else {
				left += parseInt(window.getComputedStyle(e, null).width);
			}
		}		
		span.style.left = left + 'px';
		span.className = 'validationNote'; 
		document.body.appendChild(span);
		e.errorSpan = span;
		e.errorSpan.style.display = 'none';
	}
	setTimeout(function() {e.errorSpan.style.display = 'none';}, 3000);
	return span;
}

function AVClearError(e) {
	if (e.oldBGColor) {
		e.style.backgroundColor = e.oldBGColor;
	}
	var span = AVGetErrorMsgSpan(e);
	span.innerHTML = '';
}

function AVAppendErrorMsg(e, msg) {
	var span = AVGetErrorMsgSpan(e);
	span.innerHTML += ' ' + msg;
	if (!e.oldBGColor) {
		if (e.currentStyle) {
			e.oldBGColor = e.currentStyle.backgroundColor;
		} else {
			e.oldBGColor = window.getComputedStyle(e, null).getPropertyValue('background-color');
		}
	}
	e.style.backgroundColor = AV_ERROR_BG_COLOR;
	span.style.display = 'inline';
}

function AVClearError(e) {
	if (e.oldBGColor) {
		e.style.backgroundColor = e.oldBGColor;
	}
	AVGetErrorMsgSpan(e).innerHTML = '';
}

function AV(e) {
	if (e.value) {
		e.value = e.value.trim();
	}
	AVClearError(e);

	var em = '', tmp = '';
	if (AVIsTrue(e.getAttribute("skip"))) {
		return true;
	}
	
	for (var i = 0; i < AVFunctions.length; i++) {
		tmp = AVFunctions[i](e);
		if (tmp != undefined) {
			em += tmp;
		}
	}

	if (em != '') {
		AVAppendErrorMsg(e, em);
		return false;
	}
	return true;
}

//-- funkcje walidujace AV
//sprawdzanie pola obowiazkowego
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("mandatory"))) {
		if (e.value == '') {
			return AV_LABEL['mandatory'];
		}
	}
}

//sprawdzanie pola typu integer
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("integer")) && e.value != '') {
		if (!isInteger(e.value)) {
			return 'Wprowadź liczbę całkowitą! ';
		}
	}
}

//sprawdzanie pola typu float
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("float")) && e.value != '') {
		var s = e.getAttribute("sep");
		s = s == null ? AV_DEF_SEP : s;
		var seps = AV_SEPS;
		if (s) {
			seps += s;
		}

		if (!isFloat(e.value, seps)) {
			return 'Wprowadź liczbę rzeczywistą! ';
		} else if (s) {
			e.value = e.value.replace(new RegExp('[' + seps + ']'), s);
		}
	}
}

//sprawdzanie pola typu kwota
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("amount")) && e.value != '') {
		var s = e.getAttribute("sep");
		s = s == null ? AV_DEF_SEP : s;
		var seps = AV_SEPS;
		if (s) {
			seps += s;
		}

		if (!isAmount(e.value, seps)) {
			return 'Wprowadź kwotę! ';
		} else if (s) {
			e.value = e.value.replace(new RegExp('[' + seps + ']'), s);
		}
	}
}

//sprawdzanie pola typu email
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("email")) && e.value != '') {
		if (!checkEmail(e.value)) {
			return 'Wprowadź adres email! ';
		}
	}
}

//sprawdzanie pola typu hasło
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("password")) && e.value != '') {
		var secPassFieldId = e.getAttribute("secondFieldId");
		if (secPassFieldId == null) {
			alert('Błąd AV - nie zdefiniowano identyfikatora drugiego pola z hasłem!');
		} else {
			var secPassField = document.getElementById(secPassFieldId);
			if (!secPassField) {
				alert('Błąd AV - nie istnieje pole od identyfikatorze ' + secPassFieldId);
			} else {
				secPassField.value = secPassField.value.trim();
				if (e.value != secPassField.value) {
					return 'Wprowadzone hasła nie zgadzają się!';
				}
			}
		}
	}
}

//sprawdzanie pola typu kwota
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("date")) && e.value != '') {
		e.value = formatDate(e.value);
		return 'sprawdzanie dat nie zostało zaimplementowane!';
	}
}

//sprawdzanie czy pole zawiera wartość dodatnia
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("positive")) && e.value != '') {
		if (e.value.match('^-')) {
			return 'Wprowadź wartość dodatnią! ';
		}
	}
}

//sprawdzanie czy pole zawiera wartość ujemną
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsFalse(e.getAttribute("negative")) && e.value != '') {
		if (!e.value.match('^-')) {
			return 'Wprowadź wartość ujemną! ';
		}
	}
}

//sprawdzanie czy pole zawiera minimalną liczbę znaków
AVFunctions[AVFunctions.length] = function(e) {
	if (e.getAttribute("minLength") != null && e.value != '') {
		var minL = parseInt(e.getAttribute("minLength"));
		if (e.value.length < minL) {
			return 'Wprowadź przynajmniej ' + minL + ' znaków! ';
		}
	}
}

//sprawdzanie czy pole zawiera datę
AVFunctions[AVFunctions.length] = function(e) {
	var format = e.getAttribute("date");
	if (format != null && e.value != '') {
		var sDate = AVFormatDate(e.value, format);
		var msg = AVCheckDate(sDate, format);
		if (msg == 'ok') {
			e.value = sDate;
			msg = undefined;
		}
		return msg;
	}
}

//sprawdzanie czy pole zawiera NIP
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("NIP")) && e.value != '') {
		if (!isNipValid(e.value)) {
			return 'Niepoprawny numer NIP!';
		}
	}
}

//sprawdzanie czy pole zawiera PESEL
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("PESEL")) && e.value != '') {
		if (!isPeselValid(e.value)) {
			return 'Niepoprawny numer PESEL!';
		}
	}
}

//sprawdzanie pole typu ulica
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("street")) && e.value != '') {
		
		if (!e.value.match(/[a-zA-ZąćęłńóśżźĄĆĘŁŃÓŚŻŹ]{3}/)) {
			return "Wpisz co najmniej trzy litery pod rząd.";
		} else if (!e.value.match(/[0-9]{1}/)) {
			return "Podaj nr domu oraz opcjonalnie nr lokalu.";
		}
	}
}

//sprawdzanie zgodnosci z wyrazeniem regularnym
AVFunctions[AVFunctions.length] = function(e) {
	if (e.getAttribute("pattern") && e.value != '') {
		
		if (!e.value.match(e.getAttribute("pattern"))) {
			return "Błędny format!";
		}
	}
}

//sprawdzanie pole typu kodPocztowy
AVFunctions[AVFunctions.length] = function(e) {
	if (AVIsTrue(e.getAttribute("zipCode")) && e.value != '') {
		if (e.value.match(/^[0-9]{5,5}$/)) {
			e.value = e.value.substring(0,2) + '-' + e.value.substring(2,5);
		} else if (!e.value.match(/^[0-9]{2,2}-[0-9]{3,3}$/)) {
			return "Podaj kod pocztowy zgodnie z formatem 00-000";
		}
	}
}
	

//format: ymd{sep} | ydm{sep} | mdy{sep} | dmy{sep}
function AVFormatDate(sDate, format) {
	if (format == null) {
		format = 'ymd-';
	}
	var e = new Array(3);
	var sep = format.charAt(3);
	var seps = AV_DATE_SEPS;
	if (sep == '\\' || sep == '-') {
		seps += '\\';
	}
	seps += sep;

	var r = sDate.match('^([0-9]{1,4})([' + seps + '])([0-9]{1,4})([' + seps + '])([0-9]{1,4})$');
	if (r) {
		var yPos = findRxIndex(format, 'y');
		var mPos = findRxIndex(format, 'm');
		var dPos = findRxIndex(format, 'd');

		var y = r[yPos];
		var cy = String((new Date()).getFullYear());
		y = cy.substring(0, 4 - y.length) + y;
		
		var m = r[mPos].pad("0", 2);
		var d = r[dPos].pad("0", 2);
		
		e[format.indexOf('y')] = y;
		e[format.indexOf('m')] = m;
		e[format.indexOf('d')] = d;
		sDate = e[0] + sep + e[1] + sep + e[2];
	}				
	return sDate;
}

function AVCheckDate(sDate, format) {
	var ok = false;
	var sep = format.charAt(3);
	var e = sDate.split(sep);
	if (e.length == 3) {
		var d = new Date(parseInt(e[format.indexOf('y')]), parseInt(e[format.indexOf('m')]) - 1, parseInt(e[format.indexOf('d')]));
		if (d.getFullYear() == e[format.indexOf('y')]
				&& d.getMonth() + 1 == e[format.indexOf('m')]
				&& d.getDate() == e[format.indexOf('d')]) {
			ok = true;
		}
	}
	
	if (ok) {
		return 'ok';
	} else {
		return 'Wartość nie zgodna z formatem ' + toFullFormat(format);
	}
}

function findRxIndex(format, s) {
	return format.indexOf(s) * 2 + 1;
}

function toFullFormat(format) {
	return format.substring(0,3).split('').join(format.charAt(3)).replace('y', 'RRRR').replace('m', 'MM').replace('d', 'DD');
}

//-- zwykłe funkcje walidujące
function isInteger(v) {
	return v.match('^(-?)[0-9]+$');
}

function isFloat(v, seps) {
	if (!seps) {
		seps = '.';
	}
	return v.match('^-?[0-9]+([' + seps + ']([0-9]+))?$');
}

function isAmount(v, seps) {
	if (!seps) {
		seps = '.';
	}
	return v.match('^-?[0-9]+([' + seps + ']([0-9]{1,2}))?$');
}

function checkEmail(e)  {
	ok = "1234567890qwertyuiop[]asdfghjklzxcvbnm.@-_QWERTYUIOPASDFGHJKLZXCVBNM";
	for( i = 0; i < e.length ; i++ ) if ( ok.indexOf(e.charAt(i)) < 0 ) {
		return false;
	}
	re = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/;
	re_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
	return !e.match(re) && e.match(re_two);
}

function formatDate(sDate) {
	sDate = sDate.trim();
	if (sDate.match('^[0-9]{4}[.,/-][0-9]{1,2}[.,/-][0-9]{1,2}')) {
		var m = sDate.match(/[0-9]*/g);

		if (m[2].length == 1) {
			m[2] = '0' + m[2];
		}

		if (m[4].length == 1) {
			m[4] = '0' + m[4];
		}

		return m[0] + '-' + m[2] + '-' + m[4];
	}
	return sDate;
}

function validateNip(field, mandatory) {
	try {
		mark(field, 'neutral');
		field.value = field.value.trim();

		if ((mandatory ||field.value.length > 0) && !isNipValid(field.value)) {
			mark(field, 'error');
			return false;
		} else {
			return true;
		}
	 } catch (e) {
		alert('Blad JS w funkcji validateNip!');
	 }
}

function isNipValid(nip) {
	try {
		if (nip.search('^[0-9]{3}\-[0-9]{3}\-[0-9]{2}\-[0-9]{2}$') != 0
				&& nip.search('^[0-9]{3}\-[0-9]{2}\-[0-9]{2}\-[0-9]{3}$') != 0) {
			return false;
		}
		var wNIP = new Array( 6,  5,  7,  2,  3,  4,  5,  6,  7, -1 );
		var cNumber;
		var i;
		var iCheck;
		nip = nip.trim();
		var oldNip = nip;
		do {
			oldNip = nip;
			nip = nip.replace(/-| /,'');
		} while (nip != oldNip);
		cNumber = nip;
		iCheck = 0;
		if (cNumber.length != 10) return false;
		for(i=0;i<(cNumber.length-1);++i) iCheck +=parseInt(cNumber.substring(i,i+1))*wNIP[i];
		iCheck = iCheck%11;
		return iCheck == parseInt(cNumber.substring(cNumber.length-1,cNumber.length));
	} catch (e) {
		alert('Blad JS w funkcji isNipValid!');
		throw e;
	}
}

function validatePesel(field, mandatory) {
	try {
		mark(field, 'neutral');
		field.value = field.value.trim();

		if ((mandatory ||field.value.length > 0) && !isPeselValid(field.value)) {
			mark(field, 'error');
			return false;
		} else {
			return true;
		}
	 } catch (e) {
		alert('Blad JS w funkcji validatePesel!');
	 }
}


function checkPeselControlSum(sPesel) {
  if (sPesel.search("^[0-9]{11}$") != 0) {
    return false;
  }

  var tblCoeff= "1379137913";
  var sumPesel = 0;
  var i;
  var pesel;
  var coeff;

  for (i=0; i<10; i++) { //calulation sum for check number
    pesel = parseInt(sPesel.substring(i,i+1),10);  
    coeff = parseInt(tblCoeff.substring(i,i+1),10);
    sumPesel = sumPesel + (pesel * coeff) % 10 ; 
  }            
  sumPesel = 10 - (sumPesel % 10);  
  if (sumPesel == 10) {
    sumPesel = 0;
  }
  if (sumPesel != parseInt(sPesel.substring(10,11)))  {
    return false;
  } else {
    return true;
  }
}
function checkPeselDate(sPesel) {
  if (sPesel.search("^[0-9]{11}$") != 0) {
    return false;
  }

  var year = parseInt(sPesel.substring(0,2),10);              
  var month = parseInt(sPesel.substring(2,4),10);              
  var day = parseInt(sPesel.substring(4,6),10);  
  var daysInMonth = new Array(13);
  daysInMonth[1]  = 31; daysInMonth[2]  = 28; daysInMonth[3]  = 31;
  daysInMonth[4]  = 30; daysInMonth[5]  = 31; daysInMonth[6]  = 30;
  daysInMonth[7]  = 31; daysInMonth[8]  = 31; daysInMonth[9]  = 30;
  daysInMonth[10] = 31; daysInMonth[11] = 30; daysInMonth[12] = 31;

  if (month>=1 && month<=12) {
    year += 1900;
  }
  if (month>=21 && month<=32) {
    year += 2000;
    month -= 20;
  }
  if (month>=81 && month<=92) {
    year += 1800;
    month -= 80;
  }
  if (year < 1800) {
    return false;
  }
  if (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0)) {
    daysInMonth[2] = 29;
  }
  if (month<1 || month>12) {
    return false;
  }
  if (day<1 || day>daysInMonth[month]) {
    return false;
  }
  return true;
}

function isPeselValid(pesel) {
	try {
		if (!checkPeselControlSum(pesel)) {
			return false;
		}
		if (!checkPeselDate(pesel)) {
			return false;
		}
		return true;
	} catch (e) {
		alert('Blad JS w funkcji isPeselValid!');
		throw e;
	}
}


function isDateValid(sDate) {
	sDate = sDate.trim();
	if (sDate.match('^[0-9]{4}[.,/-][0-9]{1,2}[.,/-][0-9]{1,2}')) {
		sDate = formatDate(sDate);
		return sDate == dateToString(stringToDate(sDate));
   } else {
	   return false;
   }
}

function autoInit() {
	for (var i = 0; i < document.forms.length; i++) {
		var form = document.forms[i];
		if (form.getAttribute('validate') != null) {
			AVInit(form);
		}
	}
}

if (window.addEventListener){
    window.addEventListener("load", autoInit, false);
} else if (window.attachEvent){
    window.attachEvent("onload", autoInit);
}