
Form = {

	init: function() {
		var i, k, j, m, form;

		for (i=0, k=document.forms.length; i<k; i++) {

			form = document.forms[i];

			if (form.className.indexOf('noinit') < 0) {

				if (form.className.indexOf('autosubmit') > 0) {
					if (form.onsubmit) {
						form.onsubmit();
					} else {
                	    form.submit();
					}
				}

				if (!form.id) {
					form.id = 'form_' + i + '_' + (new Date()).getTime();
				}

				if (!form.onsubmit) {
					form.onsubmit = Form.onSubmit;
				}

				var elements = form.getElementsByTagName('*');
				for (j=0, m=elements.length; j<m; j++) {
					switch (elements[j].tagName) {
						case 'TEXTAREA':
						case 'SELECT':
						case 'INPUT':
						case 'BUTTON':
							if (!elements[j].form) {
								elements[j].form = form;
							}
							Form.Field.init(elements[j]);
							break;
					}
				}

				form.className += ' noinit';
			}
		}
	},

	serialize: function(form) {
		var i, k, j, m, result = {}, elements, field;
		
		if (typeof form == 'string') {
			form = document.getElementById(form);
		}

		if (form) {
			elements = form.getElementsByTagName('*');

			for (i=0, k=elements.length; i<k; i++) {
				field = elements[i];

				if (!field.name) {
					continue;
				}

				switch (field.tagName) {
					case 'TEXTAREA':
						result[field.name] = field.value;
						break;

					case 'SELECT':
						result[field.name] = [];
						for (j=0, m=field.options.length; j<m; j++) {
							if (field.options[j].selected) {
								result[field.name][result[field.name].length] = field.options[j].value;
							}
						}
						break;

					case 'BUTTON':
					case 'INPUT':
						switch ((field.type + '').toUpperCase()) {
							case 'TEXT':
							case 'HIDDEN':
								result[field.name] = field.value;
								break;

							case 'CHECKBOX':
							case 'RADIO':
								if (!result[field.name]) {
									result[field.name] = [];
								}

								if (field.checked) {
									result[field.name][result[field.name].length] = field.value;
								}
								break;
						}
						break;
				}
			}
		}

		return result;
	},

	onSubmit: function(e, submit) {
		var i, data = Form.serialize(this);

		if (submit) {
			data[submit.name] = (submit.tagName == 'BUTTON') ? submit.innerHTML : submit.value;
		}

		data['__formId'] = this.id;

		if (typeof Form.validation[this.id] == 'function') {
			var ok = Form.validation[this.id](data, this);
			if (!ok) {
				return false;
			}
		}

		var action = this.attributes ? this.attributes['action'].value : this.getAttribute('action');

		if (!action) {
			action = window.location.href;
			if ((i = action.indexOf('?')) >= 0) {
				action = action.substr(0, i);
			}
		}


		Form.lockSubmit(this);

		new Request(action, {
			parameters: data,
			onResponse: Form.onResponse
		});

		return false;
	},

	response: {},
	validation: {},

	onResponse: function(response, request) {

		Form.unlockSubmit(request.__formId);

		if (typeof Form.response[request.__formId] == 'function') {
			Form.response[request.__formId](response, request);
		}
	},

	lockSubmit: function(form, unlock) {
		var i, k, elements;
		
		if (typeof form == 'string') {
			form = document.getElementById(form);
		}

		if (form) {
			elements = form.getElementsByTagName('*');
			for (i=0, k=elements.length; i<k; i++) {
				switch (elements[i].tagName) {
					case 'BUTTON':
					case 'INPUT':
						switch (elements[i].type.toUpperCase()) {
							case 'BUTTON':
							case 'SUBMIT':
								elements[i].disabled = unlock ? false : true;
						}
				}
			}
		}
	},

	unlockSubmit: function(form) {
		Form.lockSubmit(form, true);
	},

	Field: {
		init: function(field) {
			if (field.alt && (field.value.replace(/\s*/g,'') == '')) {
				field.value = field.alt;
			}

			if ((field.type + '').toUpperCase() == 'SUBMIT') {
				field.onclick = Form.Field.onSubmitClick;
			}

			field.onfocus = Form.Field.onFocus;
			field.onblur  = Form.Field.onBlur;
		},

		onSubmitClick: function(e) {
			this.form.onsubmit(e, this);
			try { return false } catch(e) {};
		},

		onFocus: function() {
			if (this.alt && (this.alt == this.value)) {
				this.value = '';
				this.className = this.className.replace(/\s*blank/ig,'');
			}

			this.className += ' focus';
		},

		onBlur: function() {
			if (this.alt && (this.value.replace(/\s*/g, '') == '')) {
				this.value = this.alt;
				this.className += ' blank';
			}

			this.className = this.className.replace(/\s*focus/ig,'');
		}
	}
}

