/*
var formname = 'mf';
var V = new Validate();
Event.observe(window, 'load', function() {
	//inicjacja walidacji
	V.formname = 'mf';
	V.register('nick','isEmpty',{});
	V.register('nick','strMaxLen',{'maxLen':20});
	V.register('email','isEmpty',{});
	V.register('email','isEmail',{});
	$(formname).onsubmit = null;
	V.observeAll();
});
*/
var Validate = Class.create({
	initialize: function() {
		this.errors  = [];
		this.fieldsToValidate  = [];
		this.validateOptions = [];
		this.mode = 0;//0 - tylko sprawdzanie, 1 - zaznaczanie w formularzu
		this.formname = '';
		this.allKoms = [];
		this.showAllKomsInAlert = true;
		
		//var form = $(formname);//document.forms;
		//alert(form.elements);
	},
	
	//rejestruje walidację pola
	register: function(fieldName, fieldValidation, pars) {
		this.fieldsToValidate.push(fieldName);	
		this.fieldsToValidate = this.fieldsToValidate.uniq();
		this.validateOptions.push({'fieldName':fieldName,'fieldValidation':fieldValidation,'pars':pars});
	},
	
	//inicjuje obserwację całego formularza
	observeSubmit: function() {
		$(this.formname).observe('submit', this.checkAll.bind(this));
	},
	
	//inicjuje obserwację pola formularza (dla pól o przynajmniej jednej zarejestrowanej walidacji)
	observeField: function(fn) {
		var fv = '';
		var pars = {};
		for(var i=0;i<this.validateOptions.length;i++) {
			if(this.validateOptions[i].fieldName!=fn) continue;
			fv = this.validateOptions[i].fieldValidation;
			pars = this.validateOptions[i].pars;
		}
		var myInput = this.getInput(fn,pars);
		if(myInput=='undefined'||typeof myInput=='undefined') return;
		myInput.observe('blur', this.testField.bind(this));
		//myInput.observe('focus', this.testField.bind(this));
	},
	
	//inicjuje obserwację walidowanych pól i całego formularza
	observeAll: function() {
		this.observeSubmit();
		for(var i=0;i<this.fieldsToValidate.length;i++) {
			this.observeField(this.fieldsToValidate[i]);
		}
	},
	
	//sprawdza wszystkie pola i zatrzymuje submit, jeśli którekolwiek jest nieprawidłowe
	checkAll: function(evt) {
		var error = false;
		var errcount = 0;
		for(var i=0;i<this.fieldsToValidate.length;i++) {
			if(this.checkField(this.fieldsToValidate[i])==false) {
				error = true;
				errcount++;
			}
		}
		if(error) {
			evt.stop();
			alert(this.getKom('wrongSubmit')+(this.showAllKomsInAlert?"\n"+this.allKoms.join("\n"):''));
		}
		else {
			/*var inputs = $(this.formname).elements;
			for (var i=0;i<inputs.length;i++) {
				if(inputs[i].type=='submit'||inputs[i].type=='button') inputs[i].disabled=true;
			}*/
			var oCzekaj = $('czekaj');
			oCzekaj.show();
		}
	},
	
	//sprawdza, czy dane pole jest poprawne
	checkField: function(fn) {
		var fv = '';
		var pars = {};
		for(var i=0;i<this.validateOptions.length;i++) {
			if(this.validateOptions[i].fieldName!=fn) continue;
			fv = this.validateOptions[i].fieldValidation;
			pars = this.validateOptions[i].pars;
		}
		var myInput = this.getInput(fn,pars);
		if(typeof(myInput)=='undefined') return true;
		
		for(var i=0;i<this.validateOptions.length;i++) {
			if(this.validateOptions[i].fieldName!=fn) continue;
			
			fv = this.validateOptions[i].fieldValidation;
			pars = this.validateOptions[i].pars;

			switch(fv) {
				case 'isEmpty': if(this.isEmpty(myInput.value)==false) { this.showKom(myInput,(myInput.type=='select-one'?this.getKom('isEmptySelectOne'):this.getKom('isEmpty'))); return false; }
				break;
				case 'isEmptyTiny': if(this.isEmpty(tinyMCE.get(fn).getContent())==false) { this.showKom(myInput,(myInput.type=='select-one'?this.getKom('isEmptySelectOne'):this.getKom('isEmpty'))); return false; }
				break;
				case 'isEmptyArray':
				if(this.isEmptyArray(myInput.value)==false) { this.showKom(myInput,this.getKom('isEmptyArray')); return false; }
				break;
				case 'isEmptyFile':
				if(this.isEmptyFile(myInput.value,fn,pars,myInput)==false) { this.showKom(myInput,this.getKom('isEmptyFile')); return false; }
				break;
				case 'strMaxLen': if(this.strMaxLen(myInput.value,pars.maxLen)==false) { this.showKom(myInput,this.getKom('strMaxLen').replace('[maxlen]',pars.maxLen)); return false; }
				break;
				case 'isEmail': if(this.isEmail(myInput.value,pars)==false) { this.showKom(myInput,this.getKom('isEmail')); return false; }
				break;
				case 'isWww': if(this.isWww(myInput.value,pars)==false) { this.showKom(myInput,this.getKom('isWww')); return false; }
				break;
				case 'isPhoto': if(this.isPhoto(myInput.value,pars)==false) { this.showKom(myInput,this.getKom('isPhoto')); return false; }
				break;
				case 'isDateOk': if(this.isDateOk(myInput.value)==false) { this.showKom(myInput,this.getKom('isDateOk')); return false; }
				break;
				case 'isNumber': if(this.isNumber(myInput.value)==false) { this.showKom(myInput,this.getKom('isNumber')); return false; }
				break;
				case 'isRadioSelected': if(this.isRadioSelected(fn)==false) { this.showKom(myInput,this.getKom('isRadioSelected')); return false; }
				break;
				case 'isCheckboxChecked': if(this.isCheckboxChecked(fn)==false) { this.showKom(myInput,this.getKom('isCheckboxChecked')); return false; }
				break;
				default: return true;//jeśli nie mamy takiego pola w walidacji, zwracamy true
				break;
			}
		}
		this.hideKom(myInput);
		return true;
	},
	
	getKom: function(code) {
		if(langcms!='') langKom = langcms;
		else if(lang!=''&&lang!=null) langKom = lang;
		else langKom = 'pl';
		return vTexts[langKom][code].toString();
	},
	
	showKom: function(input, kom) {
		var targetName = '';
		var langName = input.getAttribute('lang');
		if(langName!=null) targetName = input.name.replace('_'+langName,'');
		else targetName = input.name;
		if($('vt_'+targetName)&&$('v_'+targetName)) {
			$('vt_'+targetName).update(kom);
			$('v_'+targetName).show();
		}
		this.allKoms.push(kom);
	},
	
	hideKom: function(input) {
		var targetName = '';
		var langName = input.getAttribute('lang');
		if(langName!=null) targetName = input.name.replace('_'+langName,'');
		else targetName = input.name;
		if($('vt_'+targetName)&&$('v_'+targetName)) {
			$('vt_'+targetName).update('');
			$('v_'+targetName).hide();
		}
	},
	
	//funkcja pomocnicza, wywoływana podczas uzyskania/stracenia fokusa na pole formularza
	//wywołuje funkcję sprawdzającą dane pole
	testField: function(evt) {
		var targetName = '';
		var langName = evt.target.getAttribute('lang');
		if(langName!=null) targetName = evt.target.name.replace('_'+langName,'');
		else targetName = evt.target.name;
		this.checkField(targetName);
	},
	
	isEmpty: function(value) {
		if(trim(value)=='') return false;
		else return true;
	},
	
	isEmptyFile: function(value, fn, pars, oInput) {
		if(trim(value)!='') return true;
		var langName = oInput.getAttribute('lang');
		var prevFile = ($(fn+(pars.islang?'_'+langName:'')+'_filename').value);//nazwa poprzedniego pliku
		if(prevFile!='') return true;
		return false;
	},
	
	isEmptyArray: function(value){
		if(typeof value!='Array'||value.length<1) return false;
		else return true;
		},
	
	strMaxLen: function(value, maxlen){
		if(value.length>maxlen) return false;
		else return true;
		},
	
	isEmail: function(value,pars){
		if(typeof(pars)=='undefined') pars = {};
		if(value==''&&pars.notEmpty) return false;
		else if(value=='') return true;
		var re=/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;//new RegExp("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,4})$","igm");
		if(re.test(value)==false) return false;
		else return true;
		},
	
	isWww: function(value,pars){
		if(typeof(pars)=='undefined') pars = {};
		if(value==''&&pars.notEmpty) return false;
		else if(value=='') return true;
		var re = new RegExp(); 
	    re.compile("^([A-Za-z]+://)?[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$");
		if(re.test(value)==false) return false;
		else return true;
		},
	
	isPhoto: function(value, pars) {
		if(typeof(pars)=='undefined') pars = {};
		if(value==''&&pars.notEmpty) return false;
		else if(value=='') return true;
		var fNameSplit = value.split('.');
		var extension = fNameSplit.pop();
		extension = extension.toLowerCase();
		if((extension=='gif'||extension=='jpg'||extension=='jpeg'||extension=='png')===false) return false;
		else return true;
		},
	
	isDateOk: function(value) {
		if(value=='') return true;
		if(isDate(value)==false) return false;
		else return true;
	},
	
	isNumber: function(value) {
		if(isNaN(value)==true) return false;
		else return true;
	},
	
	isRadioSelected: function(value) {
		if(selectedRadioValue(this.formname,value)=='') return false;
		else return true;
	},
	
	isCheckboxChecked: function(chName) {
		var oForm = $(this.formname);
		for(var i=0;i<oForm.elements.length;i++) {
			if(oForm.elements[i].type!='checkbox'||oForm.elements[i].name!=chName) continue;
			if(oForm.elements[i].checked) return true;
			else return false;
		}
	},
	
	isPostalCode: function(value,pars){
		if(typeof(pars)=='undefined') pars = {};
		if(value==''&&pars.notEmpty) return false;
		else if(value=='') return true;
		var re = /^[0-9]{2}\-[0-9]{3}$/;
		if(re.test(value)==false) return false;
		else return true;
		},
			
	//pomocnicza - pobiera Element o danej nazwie z danego formularza
	getInput: function(inputName,pars) {
		if(pars=='undefined') pars={};
		var inputs = $(this.formname).elements;
		var test = '';
		for(var i=0;i<inputs.length;i++) {
			if(inputs[i].name==inputName+(pars.islang?'_'+lang:'')) return $(inputs[i]);
		}
	}
});

var vTexts = {};
vTexts.pl = {};
vTexts.pl.wrongSubmit = 'Wystąpiły błędy. Popraw je i spróbuj jeszcze raz.';
vTexts.pl.isEmpty = 'To pole nie może być puste';
vTexts.pl.isEmptySelectOne = 'Wybierz jedną z opcji';
vTexts.pl.isEmptyArray = 'To pole nie może być puste';
vTexts.pl.isEmptyFile = 'Wybierz plik do załadowania';
vTexts.pl.strMaxLen = 'To pole nie może przekroczyć [maxlen] znaków';
vTexts.pl.isEmail = 'Nieprawidłowy adres email';
vTexts.pl.isWww = 'Nieprawidłowy adres www';
vTexts.pl.isPhoto = 'Nieprawidłowy format pliku. Dozwolone formaty to gif, jpg oraz png';
vTexts.pl.isDateOk = 'Nieprawidłowa data';
vTexts.pl.isNumber = 'Nieprawidłowa liczba';
vTexts.pl.isRadioSelected = 'Musisz wybrać jedną z opcji';
vTexts.pl.isCheckboxChecked = 'Musisz wyrazić zgodę';
vTexts.en = {};
vTexts.en.wrongSubmit = 'Some errors have occured. Please correct them before you submit the form.';
vTexts.en.isEmpty = 'This field cannot be empty';
vTexts.en.isEmptySelectOne = 'Please choose an option';
vTexts.en.isEmptyArray = 'This field cannot be empty';
vTexts.en.isEmptyFile = 'Please attach the file';
vTexts.en.strMaxLen = 'This field cannot exceed [maxlen] characters';
vTexts.en.isEmail = 'Invalid email';
vTexts.en.isWww = 'Invalid URL';
vTexts.en.isPhoto = 'Invalid file type. Please attach one of the following formats: gif, jpg, png';
vTexts.en.isDateOk = 'Invalid date';
vTexts.en.isNumber = 'Invalid number';
vTexts.en.isRadioSelected = 'Please choose one option';
vTexts.en.isCheckboxChecked = 'Please confirm';
