var Validator = {
	isNotEmpty : function(input) {
		return !(input.value == '');
	},
	
	isNotNull : function(input) {
		if (input.nodeName.match(/select/i)) {
			var value = input.options[input.selectedIndex].value;

			return (parseFloat(value) != 0);
		}
	},
	
	isAlpha : function(input) {
		if (input.value.length == 0) return true;
		
		return (input.value.match(/^[a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\xFF ]+( [a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\xFF ]+)*$/) ? true : false);
	},
	
	isAlphanumeric : function(input) {
		if (input.value.length == 0) return true;

		return (input.value.match(/^[a-zA-Z0-9\xC0-\xD6\xD8-\xF6\xF8-\xFF ]+( [a-zA-Z0-9\xC0-\xD6\xD8-\xF6\xF8-\xFF ]+)*$/) ? true : false);
	},
	
	isNumeric : function(input) {
		if (input.value.length == 0) return true;
		
		return (input.value.match(/^\d+$/) ? true : false);
	},
	
	isEqualTo : function(input) {
		var re = new RegExp(/equals_(\w+)/);
		var id = re.exec(input.className)[1];

		return (input.value == $(id).value);
	},
	
	isWithinRange : function(input) {
		if (!input.getAttribute('minlength') || !input.getAttribute('maxlength')) return false;

		return (input.value.length >= input.getAttribute('minlength') &&
				input.value.length <= input.getAttribute('maxlength'));
	},
	
	isEmail : function(input) { // NOTE: Only basic checks
		if (input.value.length == 0) return true;
		
		return (input.value.match(/^[a-zA-Z]+[a-zA-Z0-9_\-\.]*@[a-zA-Z]+[a-zA-Z\-_\.]*\.[a-zA-Z]{2,7}$/) ? true : false);
	},
	
	isUnique : function(input) {
		var request_data = input.id+'='+input.value;
		
		if (window.XMLHttpRequest) {
			input.xmlreq = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			input.xmlreq = new ActiveXObject('Microsoft.XMLHTTP');
		}
		if (!input.xmlreq) return;
		
		input.xmlreq.onreadystatechange = (function() {
			if (this.xmlreq.readyState == 4 && this.xmlreq.status == 200) {
				var xml = this.xmlreq.responseXML;
				if (!xml) return false;
				
				var valid = xml.getElementsByTagName('valid').item(0).firstChild.nodeValue;
				
				if (valid == 'false')
					if (this.className.indexOf('invalid') == -1) this.className += ' invalid';
				//else input.className = input.className.replace(/ ?invalid/, '');
				
				// Avoid MSIE memory-leak.
				this.xmlreq.onreadystatechange = zCore.free;
			}
		}).bind(input);
		
		input.xmlreq.open('GET', _module_uri+'validate.php?'+request_data, true);
		if (input.xmlreq.setRequestHeader) { // Opera does not support this yet
			input.xmlreq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
		}
		input.xmlreq.send(null);
		
		return true;
	},
	
	toggle : function(input, isValid) {
		if (!isValid) {
			if (input.parentNode.className.indexOf('invalid') == -1) input.parentNode.className += ' invalid';
		} else {
			input.parentNode.className = input.parentNode.className.replace(/ ?invalid/, '');
		}
	},
	
	validate : function(useVisuals) {
		var isValid = true;
		
		if (this.getAttribute('default') && (this.value == this.getAttribute('default')) && this.className.match(/required/)) {
			return false;
		}
		for (var ri = 0; rule = this.rules[ri]; ri++) {
			isValid = isValid & rule(this);
		}
		
		if (useVisuals) Validator.toggle(this, isValid);
		
		return isValid;
	}
};

