/*
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 = '';
		
		//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('Wystąpiły błędy. Popraw je i spróbuj jeszcze raz.');
		}
		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);

		switch(fv) {
			case 'isEmpty': if(this.isEmpty(myInput.value)==false) { this.showKom(myInput,(myInput.type=='select-one'?'Wybierz jedną z opcji':'To pole nie może być puste')); return false; }
			break;
			case 'isEmptyTiny': {
				if(this.isEmpty(tinyMCE.get(fn).getContent())==false) { this.showKom(myInput,(myInput.type=='select-one'?'Wybierz jedną z opcji':'To pole nie może być puste')); return false; }
			}
			break;
			case 'isEmptyArray':
			if(this.isEmptyArray(myInput.value)==false) { this.showKom(myInput,'To pole nie może być puste'); return false; }
			break;
			case 'strMaxLen': if(this.strMaxLen(myInput.value,pars.maxLen)==false) { this.showKom(myInput,'To pole nie może przekroczyć '+pars.maxLen+' znaków'); return false; }
			break;
			case 'isEmail': if(this.isEmail(myInput.value)==false) { this.showKom(myInput,'Nieprawidłowy adres email'); return false; }
			break;
			case 'isWww': if(this.isWww(myInput.value,pars)==false) { this.showKom(myInput,'Nieprawidłowy adres www'); return false; }
			break;
			case 'isPhoto': if(this.isPhoto(myInput.value)==false) { this.showKom(myInput,'Nieprawidłowy format pliku. Dozwolone formaty to gif, jpg oraz png'); return false; }
			break;
			case 'isDateOk': if(this.isDateOk(myInput.value)==false) { this.showKom(myInput,'Nieprawidłowa data'); return false; }
			break;
			case 'isNumber': if(this.isNumber(myInput.value)==false) { this.showKom(myInput,'Nieprawidłowa liczba'); return false; }
			break;
			default: return true;//jeśli nie mamy takiego pola w walidacji, zwracamy true
			break;
		}
		this.hideKom(myInput);
		return true;
	},
	
	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();
		}
	},
	
	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;
	},
	
	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.acceptEmpty) return false;
		else if(value=='') return true;
		var re=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("(((f|ht){1}tp://)[a-zA-Z0-9@:%_.~#-\?&]+[a-zA-Z0-9@:%_~#\?&/])","igm");
		var re2=new RegExp("(www.[a-zA-Z0-9@:%_.~#-\?&]+[a-zA-Z0-9@:%_~#\?&/])","igm");
		if(re.test(value)==false&&re2.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(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;
	},
			
	//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]);
		}
	}
});