var Validator = Class.create();
Validator.prototype = {
	element: null,
	validating: false,
	callback: null,
	
	initialize: function() {
	},
	
	setup: function(element) {
		var element = $(element);
		if (!element) return;
		
		this.element = element;
		var inpus = element.getElementsByTagName('INPUT');
		
		for(var i=0; i<inpus.length; i++) {
			var attr = inpus[i].getAttribute('validate');
			if (attr) {
				Event.observe(inpus[i], "keyup", this.onInputType.bindAsEventListener(this));
			}
		}
		
		var inpus = element.getElementsByTagName('TEXTAREA');
		
		for(var i=0; i<inpus.length; i++) {
			var attr = inpus[i].getAttribute('validate');
			if (attr) {
				Event.observe(inpus[i], "keyup", this.onInputType.bindAsEventListener(this));
			}
		}
	},
	
	validate: function() {
		var form= this.element;
		var retval = true;
		var inpus = form.getElementsByTagName('INPUT');
		
		for(var j=0; j<inpus.length; j++) {
			var element = inpus[j];
			var attr = element.getAttribute('validate');
			if (attr) {
				var res = true;
					var types = attr.split('|');
					for(var i=0; i<types.length; i++)
					{
						var vtypes = types[i].split('-');
						var vtype = vtypes[0];
						
						switch (vtype) {
							case 'email':
								res &= this.isEmail(element.value);
								break;
							case 'string':
								res &= this.strGtThen(element.value, parseInt(vtypes[1]));
								break
						}
						
					}
					
				retval &= res;
				this.doAction(element, res);
			}
		}

		return retval ? true : false;
	},
	
	isEmail: function(string) {
		return /^[a-z0-9\.\_\-]+\@[a-z0-9\.\_\-]+\.[a-z]{2,6}$/i.test(string);
	},
	
	strGtThen: function(string, number) {
		return (string.length > number);
	},
	
	isEquial: function (value1, value2) {
		return (value1 == value2);
	},
		
	onInputType: function(event) {
		var element = Event.element(event);
		var attr = element.getAttribute('validate');
		if (!attr) return;
		
		
		var res = true;
			var types = attr.split('|');
			for(var i=0; i<types.length; i++)
			{
				var vtypes = types[i].split('-');
				var vtype = vtypes[0];
				
				switch (vtype) {
					case 'email':
						res &= this.isEmail(element.value);
						break;
					case 'string':
						res &= this.strGtThen(element.value, parseInt(vtypes[1]));
						break
				}
				
			}
		
		this.doAction(element, res);
		
	},
	
	doAction: function(element, valid, message) {
		var element = $(element);

		if (!message) message = element.getAttribute('vmessage');
		if (!message) return;		
		
		var offsets = Position.positionedOffset(element);
		var appfield = $(element.name + '_append') ? $(element.name + '_append') : document.createElement('DIV');
			appfield.id = element.name + '_append';
			appfield.innerHTML = (!valid) ? message : '';
			appfield.className = 'append-field';
			appfield.style.left = offsets[0] + element.offsetWidth + 'px';
			appfield.style.top = offsets[1] + 'px';
			appfield.style.display = (!valid) ? 'block' : 'none';

		element.parentNode.appendChild(appfield);
	},
	
	render: function() {
		var form = this.element;
		if (!form) form = document.body;
		
		var inpus = form.getElementsByTagName('INPUT');
		
		for(var j=0; j<inpus.length; j++) {
			var element = inpus[j];
			if (!element.name) continue;
			
			var offsets = Position.positionedOffset(element);
			var appfield = $(element.name + '_append');
			if (appfield) {
				appfield.style.left = offsets[0] + element.offsetWidth + 'px';
				appfield.style.top = offsets[1] + 'px';
			}
		}
		
		var inpus = form.getElementsByTagName('TEXTAREA');
		
		for(var j=0; j<inpus.length; j++) {
			var element = inpus[j];
			if (!element.name) continue;
			
			var offsets = Position.positionedOffset(element);
			var appfield = $(element.name + '_append');
			if (appfield) {
				appfield.style.left = offsets[0] + element.offsetWidth + 'px';
				appfield.style.top = offsets[1] + 'px';
			}
		}
	},
	
	checkInDB: function(element, fieldname) {
		
		new Ajax.Request(serverURL, {
			parameters: 'action=check&string=' + element.value + '&fieldname=' + fieldname + '&element=' + element.id,
			onSuccess: this.onChecked.bind(this),
			onFailure: this.onChecked.bind(this)
		});
	},
	
	onChecked: function(response) {
		if (!response || !response.responseText) return;
		eval("var ajaxres = ("+ response.responseText +")");
		if (!ajaxres) return;
		
		element = $(ajaxres.element);
		
		if (element)
			this.doAction(element, ajaxres.status, ajaxres.message)
	},
	
	validateAll: function(callback) {
		if (!this.element || this.validating) return;
		
		this.callback = callback;
		this.showLoading();
		var params = Form.serialize(this.element);
		new Ajax.Request(serverURL, {
			parameters: 'action=validate&' + params,
			onSuccess: this.onValidateSuccess.bind(this),
			onFailure: this.onValidateFailure.bind(this)
		});
		
		return false;
	},
	
	onValidateSuccess: function(response) {
		this.hideLoading();
		eval("var ajaxres = ("+ response.responseText +")");
		
		if (!ajaxres) {
			this.onValidateFailure(response);
			return;
		}
		
		if (ajaxres.errors) {
			for(var i=0; i < ajaxres.errors.length; i++) {
				var error = ajaxres.errors[i];
				var element = this.getElementByName(error);
				if (element) {
					this.doAction(element, false);
					if (error == 'code') {
						element = $('captcha');
						var chunks = element.src.split('?');
						element.src = chunks[0] + '?' + Math.random();
					}
				}
			}
			return;
		}
		
		// no errors - call callback function
		if (this.callback && typeof(this.callback) == 'function')
			this.callback();
	},
	
	onValidateFailure: function(response) {
		this.hideLoading();
		alert('Can\'t send your request at the moment. Try a bit later please.');
	},
	
	showLoading: function() {
		this.validating = true;
		if ($('submit'))
			$('submit').disabled = 'disabled';
		
		var loading = $('loading');
		if (!loading) return;
		loading.style.visibility = 'visible';
	},

	hideLoading: function() {
		this.validating = false;
		if ($('submit'))
			$('submit').disabled = false;
		
		var loading = $('loading');
		if (!loading) return;
		loading.style.visibility = 'hidden';
	},
	
	getElementByName: function(name) {
		if (!this.element) return;
		
		var inpus = this.element.getElementsByTagName('INPUT');
		
		for(var j=0; j<inpus.length; j++) {
			if (inpus[j].name == name) 
				return inpus[j];
		}
		
		var inpus = this.element.getElementsByTagName('TEXTAREA');
		
		for(var j=0; j<inpus.length; j++) {
			if (inpus[j].name == name) 
				return inpus[j];
		}
		
		return false;
	}

};

var serverURL = '/server/requests.php';
var validator = new Validator();

function register() {
	location.href = '?comment_list';
}
