/*
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('Some errors occured. Please correct them.');
			if($('vt_all')&&$('v_all')) {
				$('vt_all').update(this.getKom('wrongSubmit'));
				$('v_all').show();
			}
		}
		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;
			}*/
			$('v_all').hide();
			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'?'Please choose an option':this.getKom('isEmpty'))); return false; }
				break;
				case 'isEmptyTiny': if(this.isEmpty(tinyMCE.get(fn).getContent())==false) { this.showKom(myInput,(myInput.type=='select-one'?'Please choose an option':'This field cannot be empty')); return false; }
				break;
				case 'isEmptyArray':
				if(this.isEmptyArray(myInput.value)==false) { this.showKom(myInput,'This field cannot be empty'); return false; }
				break;
				case 'strMaxLen': if(this.strMaxLen(myInput.value,pars.maxLen)==false) { this.showKom(myInput,'This field cannot exceed '+pars.maxLen+' characters'); return false; }
				break;
				case 'isProperName': if(this.isProperName(myInput.value,pars)==false) { this.showKom(myInput,this.getKom('isProperName')); return false; }
				break;
				case 'isProperPhone': if(this.isProperPhone(myInput.value,pars)==false) { this.showKom(myInput,this.getKom('isProperPhone')); return false; }
				break;
				case 'isProperPhoneEn': 
					if(this.isProperPhoneEn()==false) { this.showKom($('phone_number'),this.getKom('isProperPhone')); return false; }
					if(this.isProperPrefixEn()==false) { this.showKom($('phone_number'),this.getKom('isProperPrefix')); return false; }
				break;
				case 'isEmptyPhoneEn': if(this.isEmptyPhoneEn()==false) { this.showKom($('phone_number'),this.getKom('isEmpty')); 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,'Improper URL'); return false; }
				break;
				case 'isPhoto': if(this.isPhoto(myInput.value,pars)==false) { this.showKom(myInput,'Improper file. Please attach one of these: gif, jpg, png'); return false; }
				break;
				case 'isDateOk': if(this.isDateOk(myInput.value)==false) { this.showKom(myInput,'Improper date'); return false; }
				break;
				case 'isNumber': if(this.isNumber(myInput.value)==false) { this.showKom(myInput,'Improper number'); return false; }
				break;
				case 'isRadioSelected': if(this.isRadioSelected(fn)==false) { this.showKom(myInput,'Please choose one option'); return false; }
				break;
				case 'isCheckboxChecked': if(this.isCheckboxChecked(fn)==false) { this.showKom(myInput,'Please confirm'); 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) {
		return texts[lang][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();
		}
	},
	
	hideKom: function(input) {
		var targetName = '';
		var langName = input.getAttribute('lang');
		if(langName!=null) targetName = input.name.replace('_'+langName,'');
		else targetName = input.name;
		if(targetName=='phone_prefix') targetName='phone_number';
		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;
		},
	
	isProperName: function(value,pars){
		if(typeof(pars)=='undefined') pars = {};
		if(value==''&&pars.notEmpty) return false;
		else if(value=='') return true;
		var re=new RegExp("^[A-Za-z-]{2,}$","igm");
		if(re.test(value)==false) return false;
		else return true;
		},
		
	isProperPhone: function(value,pars){
		if(typeof(pars)=='undefined') pars = {};
		if(value==''&&pars.notEmpty) return false;
		else if(value=='') return true;
		var re=new RegExp("^[0-9]{6,}$","igm");
		if(re.test(value)==false) return false;
		else return true;
		},
	
	isProperPrefixEn: function(){
		var phone_prefix = $F('phone_prefix');
		if(trim(phone_prefix)=='') return true;
		
		re=new RegExp("^[0-9]{1,}$","igm");
		if(re.test(phone_prefix)==false) return false;
		else return true;
		},
	
	isProperPhoneEn: function(){
		var phone_number = $F('phone_number');
		if(trim(phone_number)=='') return true;
		
		var re=new RegExp("^[0-9]{6,}$","igm");
		if(re.test(phone_number)==false) return false;
		else return true;
		},
	
	isEmptyPhoneEn: function() {
		var phone_number = $F('phone_number');
		var phone_prefix = $F('phone_prefix');

		if(trim(phone_number)==''||trim(phone_prefix)=='') 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 texts = {};
texts.en = {};
texts.en.isEmpty = 'This field cannot be empty.';
texts.en.isEmail = 'Invalid email.';
texts.en.isProperName = 'Please enter a proper name.';
texts.en.isProperPhone = 'Please enter your phone number.';
texts.en.isProperPrefix = 'Please enter your country code.';
texts.en.wrongSubmit = 'Please correct the above error(s) before you click Submit again.'

texts.dk = {};
texts.dk.isEmpty = 'Dette felt kan ikke være tomt.';
texts.dk.isEmail = 'Ugyldig e-mail.';
texts.dk.isProperName = 'Indtast venligst et korrekt navn.';
texts.dk.isProperPhone = 'Indtast venligst dit telefonnummer.';
texts.dk.wrongSubmit = 'Ret venligst ovenstående fejl, før du klikker på Send igen.'
