var ValidationUtils = {
	hasErrors : function() {
		for (var a in arguments) {
			if (a.hasErrors) return true;
		}
		return false;
	}
};

function InputValidator(name, validation) {
	var self = this;
	
	this.hasErrors = false;
	
	this._validate = false;
	this._input = $("div#main input[name='" + name + "']");
	this._input.keyup(function() {
		self._validate = true;
	});
	this._group = this._input.parents(".group");
	this._span = this._input.siblings("span.error");
	this._url = "/ajax/json/validate/" + (!validation ? name : validation);
	
	this.run = function() {
		if (self._validate) {
			var value = self._input.val();
			if (value == "") {
				self._render();
			} else {
				// do json request
				$.getJSON(self._url, {"value" : value}, function(data) {
					if (data.valid == "true") {
						self._render();
					} else {
						self._render(data.errors);
					}
				});
			}
			self._validate = false;
		}
	}
	
	this._render = function(errors) {
		if (errors) {
			self.hasErrors = true;
			self._group.addClass("error");
			if (self._span.length) {
				self._span.text('');
				for (var i = 0; i < errors.length; i++) {
					self._span.append(errors[i]);
					if (i < (errors.length - 1)) {
						self._span.append("<br/>");
					}
				}
				self._span.fadeIn(500);
			}
		} else {
			self.hasErrors = false;
			self._group.removeClass("error");
			if (self._span.length) {
				self._span.fadeOut(500, function() { self._span.text('') });
			}
		}
	}
}

function EqualityValidator(name, rename, message) {
	var self = this;
	
	this.hasErrors = false;
	
	this._validate = false;
	this._inputA = $("div#main input[name='" + name + "']");
	this._inputA.keyup(function() { self._validate = true; });
	this._inputB = $("div#main input[name='" + rename + "']");
	this._inputB.keyup(function() { self._validate = true; });
	this._group = this._inputB.parents(".group");
	this._span = this._inputB.siblings("span.error");
	this._message = message;
	
	this.run = function() {
		if (self._validate) {
			var valA = self._inputA.val();
            var valB = self._inputB.val();
            if (valA && valB && valA != valB) {
            	self.hasErrors = true;
            	self._group.addClass("error");
            	self._span.text(self._message).fadeIn(500);
            } else {
            	self.hasErrors = false;
            	self._group.removeClass("error");
            	self._span.fadeOut(500, function() { self._span.text(""); });
            }
            self._validate = false;
		}
	}
}
