var ElementRequired = function (element, fun, message, titleShow) {
	var othis = this;
	this.valid = true;
	this.element = element;
	jQuery(element).blur( function(oEvent) {
		othis.valid = fun(this.value);
		if(othis.valid) {
			if(jQuery(document).find("#err_"+this.name).length > 0) {
				jQuery(document).find("#err_"+this.name).remove();
			}
		}else if(titleShow && this.title != "") {
			if(jQuery(document).find("#err_"+this.name).length > 0) {
				jQuery(document).find("#err_"+this.name).html(this.title);
			} else
				jQuery(this).after("<p style='margin: 0; padding: 0;' id='err_"+this.name+"' class='valid_error' >" + this.title + "</p>");
			this.title = "";
		} 
	});
	this.isValid = function() {
		return this.valid;
	}
};

/**
 * 
 * @param String form
 * @returns
 */
var Validation = function(form, conf) {
	for(var elem in conf) {
		this[elem] = conf[elem];
	}
	this.form = document.forms[form];
	this.elements = new Array();
	var othis = this;
	this.addElement = function(element) {
		var className = element.className.split(" ");
		if(className.length > 1) {
			
			var config = this.validators[className[className.length-1]];
			if(config) {
				this.elements.push(new ElementRequired(element, config[1], config[0], this.title));
			}
		}
		
	};
	jQuery(this.form).find(".required").each( function() {
		othis.addElement(this);
	});
	jQuery(this.form).submit(function() {
		var valid = true;
		for(var i = 0; i < othis.elements.length; ++i) {
			valid = valid & othis.elements[i].isValid();
		}
		if(!valid) {
			alert(othis.err);
			return false;
		}
		return true;
	});
}

Validation.prototype.findValidator = function(className) {
	
};

Validation.prototype.validators = {
	'validate-nick' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzNick&var=" + v;
		
		
		obj = advAJAX.get({url : zapytanie, async: false, onSuccess : function(obj) { x = obj.responseText;}, onFatalError : function(obj) { alert("Error: " + obj.status); }});
		//obj = advAJAX.xmlHttpRequest;
		if (!x) {
			x = obj.xmlHttpRequest.responseText;
		}
		//while(!x) {nsWaitForDelay(10);};
		//alert (x);
		if (x.indexOf("OK") == -1)
		{
			document.getElementById("nick").title = x;
			return false;
		}
		return true;	
	}],
	'validate-nick-top' : ['', function(v) {
		if(this.value == "") {
			this.title = "Login nie może być pusty";
		}	
		return true;
	}],
	
	'validate-pass' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzPasswdTop&var=" + v;
		
		//alert(obj);
		obj = advAJAX.get({url : zapytanie, async: false, onSuccess : function(obj) { x = obj.responseText;}, onFatalError : function(obj) { alert("Error: " + obj.status); }});
		//obj = advAJAX.xmlHttpRequest;
		if (!x) x = obj.xmlHttpRequest.responseText;
		
		if (x.indexOf("OK") == -1)
		{
			document.getElementById("pass1").title = x;
			return false;
		}
		else
		{
			document.getElementById("pass1").title = '';
		}
		return true;
	}],
	
	'validate-pass-top' : ['', function(v) {
		if(this.value == "") {
			this.title = "Hasło nie może być puste";
			return false;
		}
		return true;
	}],

	'validate-mymail-top' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzMail&var=" + v;
		obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		if (x != "OK")
		{
			document.getElementById("top_email").style.paddingBottom = "0px";
			document.getElementById("mail").title = x;
			return false;
		}
		else
		{
			document.getElementById("top_email").style.paddingBottom = "0px";
			document.getElementById("mail").title = '';
		}
		return true;
		
	}],
	
	'validate-mymail' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzMail&var=" + v;
		obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
		if (!x) x = obj.xmlHttpRequest.responseText;
		if(x.indexOf("OK") == -1)
		{
			document.getElementById("mail").title = x;
			return false;
		}
		return true;
		
	}],

	'validate-nick-bot' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzNick&var=" + v;
		
		//alert(obj);
		obj = advAJAX.get({url : zapytanie, async: false, onSuccess : function(obj) { x = obj.responseText;}, onFatalError : function(obj) { alert("Error: " + obj.status); }});
		//obj = advAJAX.xmlHttpRequest;
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		
		//while(!x) {nsWaitForDelay(10);};
		//alert (x);
		if (x != "OK")
		{
			document.getElementById("nickB").title = x;
			return false;
		}
		else
		{
		}
		return true;
	}],
	
	'validate-pass-bot' : [' ', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzPasswdTop&var=" + v;
		
		//alert(obj);
		obj = advAJAX.get({url : zapytanie, async: false, onSuccess : function(obj) { x = obj.responseText;}, onFatalError : function(obj) { alert("Error: " + obj.status); }});
		//obj = advAJAX.xmlHttpRequest;
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		
		if (x != "OK")
		{
			document.getElementById("pass1B").title = x;
			return false;
		}
		else
		{
		}
		return true;
	}],

	'validate-mymail-bot' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzMail&var=" + v;
		obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		if (x != "OK")
		{
			document.getElementById("mailB").title = x;
			return false;
		}
		else
		{
		}
		return true;
		
	}],
	
	/* Ponizesz walidatory nie są nigdzie używane */
	'validate-imie' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzImie&var=" + v;
		obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		if (x != "OK")
		{
			document.getElementById("imie").title = x;
			return false;
		}
		return true;
		
	}],
	'validate-nazwisko' : ['', function(v) {
	//	return !Validation.get('IsEmpty').test(v);
	
		var x;
		var zapytanie = baseHr+"ajax.php?action=sprawdzNazwisko&var=" + v;
		obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		if (x != "OK")
		{
			document.getElementById("nazwisko").title = x;
			return false;
		}
		return true;
	
	}],
	'validate-ulica' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=checkStreet&var=" + v;
		obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		if (x != "OK")
		{
			document.getElementById("ulica").title = x;
			return false;
		}
		return true;
		
	}],
	'validate-budynek' : ['', function(v) {
		//	return !Validation.get('IsEmpty').test(v);
		
		var x;
		var zapytanie = baseHr+"ajax.php?action=checkSubStreet&var=" + v;
		obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
		if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
		if (x != "OK")
		{
			document.getElementById("budynek").title = x;
			return false;
		}
		return true;
		
	}],
	'validate-city' : ['', function(v) {
			//	return !Validation.get('IsEmpty').test(v);
			
			var x;
			var zapytanie = baseHr+"ajax.php?action=baseCheck&var=" + v;
			obj = advAJAX.get({url : zapytanie,	async : false, onSuccess : function(obj) { x = obj.responseText; }});
			if (navigator.userAgent.indexOf("Firefox")!=-1) x = obj.xmlHttpRequest.responseText;
			if (x != "OK")
			{
				document.getElementById("city").title = x;
				return false;
			}
			return true;
			
	}],
	
	'validate-bank' : ['Proszę podać prawidłowy numer konta.', function(v) {
				v = v.replace(/ /g, "");
				v = v.replace(/-/g, "");
				return Validation.get('IsEmpty').test(v) ||  (!/[^\d]/.test(v) && v.length == 26);
			}],
	'validate-max-wyplata-zl' : ['Proszę podać kwotę mniejszą lub równą dostępnej oraz większą od 5', function(v) {
				//v = v.replace(/,/, ".");
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v) && v >= 5.0 && v <=max_kwota)&& (!isNaN(v) && !/^\s+$/.test(v) && v >= 5.0 && v <=50000);
			}],
	'validate-max-wyplata-gr' : ['Proszę podać poprawną liczbę groszy', function(v) {
				//v = v.replace(/,/, ".");
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && /^[0-9]{0,2}$/.test(v));
			}],
	'validate-hour' : ['Proszę podać prawidłową godzinę.', function(v) {
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v) && v >= 0 && v <=24);
			}],
	'validate-minute' : ['Proszę podać prawidłową minutę.', function(v) {
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v) && v >= 0 && v <=59);
			}],
	'validate-digits' : ['Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
			}],
	'validate-alpha' : ['Please use letters only (a-z) in this field.', function (v) {
				return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
			}],
	'validate-alphanum' : ['Please use only letters (a-z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/\W/.test(v)
			}],
	'validate-date' : ['Proszę podać poprawną datę.', function(v) {
				//v = v.replace(/-/g, "/");
				//var test = new Date(v);
				return Validation.get('IsEmpty').test(v) || /^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$/.test(v);
			}],
	'validate-email' : ['Please enter a valid email address. For example fred@domain.com .', function (v) {
				return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
			}],
	'validate-url' : ['Please enter a valid URL.', function (v) {
				return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
			}],
	'validate-date-au' : ['Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
				if(Validation.get('IsEmpty').test(v)) return true;
				var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
				if(!regex.test(v)) return false;
				var d = new Date(v.replace(regex, '$2/$1/$3'));
				return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && 
							(parseInt(RegExp.$1, 10) == d.getDate()) && 
							(parseInt(RegExp.$3, 10) == d.getFullYear() );
			}],
	'validate-currency-dollar' : ['Please enter a valid $ amount. For example $100.00 .', function(v) {
				// [$]1[##][,###]+[.##]
				// [$]1###+[.##]
				// [$]0.##
				// [$].##
				return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
			}],
	'validate-selection' : ['Proszę wybrać element', function(v,elm){
				return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v);
			}],
	'validate-kategoria' : ['Wybierz kategorię turnieju.', function(v,elm){
				return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v);
			}],
	'validate-one-required' : ['Please select one of the above options.', function (v,elm) {
				var p = elm.parentNode;
				var options = p.getElementsByTagName('INPUT');
				return $A(options).any(function(elm) {
					return $F(elm);
				});
			}]
	
};




