// VALIDATION
function Form() {
	this.messages = this.getMessages();
	this.patternEmail = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/;
	this.patternPhone = /^(\+\d{3})?(([\s-]?\d{3}){3,})$/;
	this.patternParam = /\{\d\}/;
	this.patternDate = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[.\/-]([0]?[1-9]|[1][0-2])[.\/-]([0-9]{4}|[0-9]{2})$/;
	this.patternNumber = /^\d{8}$/;
	
	this.formElement = arguments[0];
	this.messageList = new Array();
}
Form.prototype.hasRightShape = function() {
	return this.formElement != null && this.formElement.tagName.toUpperCase() == 'FORM' ? true : false;
}
Form.prototype.reset = function() {
	$("INPUT:text,INPUT:password", this.formElement).each( function() {
		this.value = '';
	});
}
Form.prototype.validate = function (properties) {
	var formName = this.formElement.name.toUpperCase();
	var formObject = this;
	var mainPasswordValue, mainPasswordLabel;

	var lengthMinPassword = 6;
	
	$("INPUT", this.formElement).each( function() {
		if (properties[this.name] != null) {
			this.value = this.value.trim();
			var messageIdPrefix = formName + '_' + (this.name.indexOf('password') != -1 ? 'PASSWORD' : this.name.toUpperCase()) + '_';
			var stopValidation = false;
			
			// heslo
			if (this.name.indexOf('password') != -1) {
				if (mainPasswordValue == null) {
					mainPasswordValue = this.value;
					mainPasswordLabel = formObject.getLabel(this);
				}
				// both empty but not required.. that means return without error
				else if (this.value == '' && mainPasswordValue == '' && properties[this.name].indexOf('required') == -1) {
					return;
				}
				// both empty
				else if (this.value == '' && mainPasswordValue == '') {
					formObject.addMessage(messageIdPrefix + 'REQUIRED');
				}
				// check denied chars
				else if (mainPasswordValue.indexOf(';') != -1 || mainPasswordValue.indexOf('|') != -1) {
					formObject.addMessage('FORM_ITEM_DENIED_CHARS', mainPasswordLabel);
				}
				// not equals
				else if (this.value != mainPasswordValue) {
					formObject.addMessage(messageIdPrefix + 'NOTEQUALS');
				}
				// length
				else if (mainPasswordValue.length < lengthMinPassword) {
					formObject.addMessage(messageIdPrefix + 'LENGTH', lengthMinPassword);
				}
			}
			// ostatni
			else {
				// required
				if (properties[this.name].indexOf('required') != -1 && this.value == '') {
					formObject.addMessage(messageIdPrefix + 'REQUIRED');
					stopValidation = true;
				}
				// length
				if (!stopValidation && properties[this.name].indexOf('length') != -1) {
					var lengthMin = 0;
					var property = properties[this.name].split(';');
					for (index in property) {
						if (property[index].indexOf('length') != -1) {
							lengthMin = property[index].substring('length'.length, property[index].length);
						}
					}
					if (this.value.length < lengthMin) {
						formObject.addMessage('FORM_ITEM_LENGTH', formObject.getLabel(this), lengthMin);
						stopValidation = true;
					}
				}
				// check denied chars
				if (!stopValidation && properties[this.name].indexOf('checkChars') != -1 && (this.value.indexOf(';') != -1 || this.value.indexOf('|') != -1)) {
					formObject.addMessage('FORM_DENIED_CHARS', formObject.getLabel(this));
					stopValidation = true;
				}
				// exists
				var hidden = $("INPUT:hidden[name='" + this.name + "exists']", formObject.formElement)[0];
				if (!stopValidation && properties[this.name].indexOf('exists') != -1 && hidden && hidden.value != 'false') {
					formObject.addMessage(messageIdPrefix + 'EXISTS');
				}
				// email
				if (!stopValidation && properties[this.name].indexOf('email') != -1 && (properties[this.name].indexOf('required') != -1 || this.value) && !formObject.patternEmail.test(this.value)) {
					if (properties[this.name].indexOf('required') != -1 && !this.value) {
						formObject.addMessage(messageIdPrefix + 'REQUIRED');
					} else {
						formObject.addMessage(messageIdPrefix + 'WRONG');
					}
				}
				// phone
				if (!stopValidation && properties[this.name].indexOf('phone') != -1 && (properties[this.name].indexOf('required') != -1 || this.value) && !formObject.patternPhone.test(this.value)) {
					if (properties[this.name].indexOf('required') != -1 && !this.value) {
						formObject.addMessage(messageIdPrefix + 'REQUIRED');
					} else {
						formObject.addMessage(messageIdPrefix + 'WRONG');
					}
				}
				// date
				if (!stopValidation && properties[this.name].indexOf('date') != -1 && (properties[this.name].indexOf('required') != -1 || this.value) && !formObject.patternDate.test(this.value)) {
					if (properties[this.name].indexOf('required') != -1 && !this.value) {
						formObject.addMessage(messageIdPrefix + 'REQUIRED');
					} else {
						if(!formObject.patternNumber.test(this.value)){
							formObject.addMessage(messageIdPrefix + 'WRONG');
						}
					}
				}
			}
		}
	});
}
Form.prototype.isValid = function() {
	return this.messageList.length == 0;
}
Form.prototype.getLabel = function(element) {
	try {
		var label = $("LABEL", element.parentNode)[0].innerHTML;
		if (label.indexOf(':') == label.length-1) {
			label = label.substring(0,label.length-1);
		}
		return label;
	} catch(e) {
		return null;
	}
}
Form.prototype.fillDataObject = function(object) {
	try {
		$("INPUT:text", this.formElement).each( function() {
			eval('object.'+this.name+' = "'+this.value+'";');
		});	
		$("INPUT:password", this.formElement).each( function() {
			if (this.name == 'password') {
				eval('object.'+this.name+' = "'+this.value+'";');
			}
		});	
		$("INPUT:hidden", this.formElement).each( function() {
			if (this.name == 'id') {
				eval('object.'+this.name+' = '+this.value+';');
			}
		});	
	} catch (e) {}
	return object;
}
Form.prototype.addMessage = function() {
	try {
		var message = this.fetchMessage(arguments[0]);
		
		// nahradi parametry formatu {n}
		if (this.patternParam.test(message)) {
			for (index = 1; index < arguments.length; index++) {
				message = message.replace(new RegExp("\\{"+(index*1-1)+"\\}"), arguments[index]);
			}
		}
		
		if (message) {
			this.messageList[this.messageList.length] = message;
		}
	} catch (e) {}
}
Form.prototype.fetchMessage = function(messageId) {
	try {
		return this.messages[messageId];
	} catch (e) {
		return null;
	}
}
Form.prototype.getMessage = function(messageContent, isError) {
	var message = '';
	if (messageContent) {
		message = this.fetchMessage('MESSAGE_PREFIX');
		if (isError) {
			message += this.fetchMessage('ERROR_PREFIX');
		}
		message += messageContent;
		message += this.fetchMessage('MESSAGE_SUFFIX') + '\n';
	}
	return message;
}
Form.prototype.getErrorList = function() {
	var messageList = '';
	if (this.messageList.length > 0) {
		messageList += this.fetchMessage('ERROR_TITLE') + '\n';
		messageList += this.fetchMessage('LIST_PREFIX') + '\n';
		for (index in this.messageList) {
			messageList += this.getMessage(this.messageList[index], true);
		}
		messageList += this.fetchMessage('LIST_SUFFIX') + '\n';
	}
	return messageList;
}
Form.prototype.getMessageList = function() {
	var messageList = '';
	if (this.messageList.length > 0) {
		messageList += this.fetchMessage('LIST_PREFIX') + '\n';
		for (index in this.messageList) {
			messageList += this.getMessage(this.messageList[index], false);
		}
		messageList += this.fetchMessage('LIST_SUFFIX') + '\n';
	}
	return messageList;
}