if (typeof Form == 'undefined') {
	/**
	 * Form component
	 * @param string name
	 */
	Form = function (name) {
		var form = document.forms.namedItem(name);
		if (! form) {
			Dialogs.error('Form "' + name + '" not found.\nCheck if it was not parsed or was parsed inside the other form.');
			return null;
		}
	
		form.validate = true;
		Engine.attachDestructor(form, 'validate');
	
		// Handling submit method
		form.__submit__ = form.submit;
		Engine.attachDestructor(form, '__submit__');
		
		form.alreadySubmited = false;
		form.submit = function () {
			var res = this.fireEvent('onsubmit');
			if (res) {
				try {
					this.__submit__();
				} catch (e) {
					Error.exception(e);
				}
			}
		}
		Engine.attachDestructor(form, 'submit');
	
		// Handling reset method
		form.__reset__ = form.reset;
		Engine.attachDestructor(form, '__reset__');
		
		form.reset = function () {
			var form = event.srcElement;
			if (form.nodeName == 'BUTTON' || form.nodeName == 'INPUT') {
				form = form.form;
			}
			if (! form) {
				event.cancelBubble = true;
				event.returnValue = false;
				return false;
			}
			
			var l = form.elements;
			if (l && l.length) {
				for (var i = 0, n = l.length; i < n; i++) {
					if (isset(l[i].reset)) {
						l[i].reset();
					}
				}
			}
			
			event.cancelBubble = true;
			event.returnValue = false;
			return false;
		}
		Engine.attachDestructor(form, 'reset');
	
		form.isValid = function () {
			var l = this.elements;
			if (! l || ! l.length) {
				return true;
			}
			var valid = true;
			for (var i = 0, n = l.length; i < n; i++) {
				if ('beforeSubmit' in l[i]) {
					l[i].beforeSubmit();
				}
				if (! this.validate) {
					continue;
				}
				if ('isValid' in l[i]) {
					valid &= l[i].isValid();
				}
			}
			return Boolean(valid);
		}
		Engine.attachDestructor(form, 'isValid');
	
		// Handling onSubmit event
		form.attachEvent('onsubmit', function () {
			var form = event.srcElement;
			if (form.nodeName == 'BUTTON' || form.nodeName == 'INPUT') {
				form = form.form;
			}
			if (! form || form.alreadySubmited || ! form.isValid()) {
				event.cancelBubble = true;
				event.returnValue = false;
				return false;
			}
			form.alreadySubmited = true;
			event.cancelBubble = false;
			event.returnValue = true;
			return true;
		});
	
		// Handling onReset event
		form.attachEvent('onreset', function () {
			var form = event.srcElement;
			if (form.nodeName == 'BUTTON' || form.nodeName == 'INPUT') {
				form = form.form;
			}
			if (! form) {
				event.cancelBubble = true;
				event.returnValue = false;
				return false;
			}
			
			return form.reset();
		});
	
		return form;
	}
	
	
	/**
	 * Filter form component
	 * @param string name
	 */
	FilterForm = function (name) {
		var form = Form(name);
		if (! isset(form)) {
			return null;
		}
	
		// Handling onReset event
		form.reset = function () {
			var form = event.srcElement;
			if (form.nodeName == 'BUTTON' || form.nodeName == 'INPUT') {
				form = form.form;
			}
			if (! form) {
				event.cancelBubble = true;
				event.returnValue = false;
				return false;
			}
			
			var l = form.elements;
			if (l && l.length) {
				for (var i = 0, n = l.length; i < n; i++) {
					if (isset(l[i].clear)) {
						l[i].clear();
					}
				}
			}
			
			event.cancelBubble = true;
			event.returnValue = false;
			
			form.submit();
			return false;
		}
	
		return form;
	}
}