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');
	
		
		// Clearing submit status
		form.resetSubmition = function (time)
		{
			time = time || 1000; // Default value 1s
			window.setTimeout("document.forms.namedItem('" + this.name + "').alreadySubmited=false", time);
		}
		Engine.attachDestructor(form, 'resetSubmition');
		
		
		Engine.attachWatcher(form, 'alreadySubmited', function (property, oldValue, newValue) {
			var e = this.elements;
			for (var i = 0, n = e.length; i < n; i++) {
				if (e[i].nodeName.toLowerCase() == 'button' || e[i].nodeName.toLowerCase() == 'input'
				&& (e[i].type.toLowerCase() == 'submit' || e[i].type.toLowerCase() == 'reset')) {
					e[i].disabled = newValue;
				}
			}
		} );
		
	
		// 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, invalid;
			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]) {
					var isValid = l[i].isValid();
					if (! isValid && invalid === undefined) {
						invalid = l[i];
					}
					valid &= isValid;
				}
			}
			valid = Boolean(valid);
			if (! valid) {
				if (invalid !== undefined) {
					try {
						invalid.focus();
						invalid.scrollIntoView();
					} catch (e) {
						// Trying to focus <iframe/> element of HtmlItem
						try {
							invalid = document.getElementById(invalid.id + '.window').contentWindow;
							invalid.focus();
							invalid.scrollIntoView();
						} catch (e) {}
					}
				}
				Dialogs.alert('Formoje liko neužpildytu arba blogai užpildytu laukų');
			}
			return 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;
	}
}

