var Forma = 
{
	required: {
		/* formID: [field, field] */
	},
	data: function(form) {
		var o = {};
		Forma.each(form, function(e) {
			if(!e.name || !e.tagName) 
				return;
			var n = e.name;
			var v = (e.value || "").replace(/^\s+|\s+$/g, '');
			if(!v.length)
				return;
			var tag = e.tagName.toLowerCase();
			if(tag == 'input')
				tag = (e.type || 'text').toLowerCase();
			switch(tag) {
				case 'radio':    
					if(e.checked) o[n] = v; 
					return;
				case 'checkbox':
					if(e.checked) (o[n] = o[n] ||  []).push(v); 
					return;
				case 'select':
					var s = [];
					Forma.each(e.options, function(p) { 
						if(p.selected) s.push(p.value) 
					});
					if(s.length) o[n] = (e.multiple ? s : s[0]);
					return;
				default:
					o[n] = v;
					return;
			}
		});
		return o;
	},
	each: function(ary, func) {
		for(var i = 0; i < ary.length; i++)
			func(ary[i], i);
	},
	validate: function(form, validator) {
	
		function seterr(e, err) {
			if(!e) return;
			var c = (e.className || "").replace(/\s*error\b/, '');
			e.className = err ? (c + " error") : c;
		}
	
		var required = {}, labels = {}, data = Forma.data(form), cerr = 0;

		Forma.each(Forma.required[form.id] || [], function(e) {
			required[e] = 1;
		});
		Forma.each(form.getElementsByTagName("label"), function(e) {
			labels[e.htmlFor] = e;
		});
		Forma.each(form, function(e) {
			var err = ((required[e.name] && typeof(data[e.name]) == "undefined") || (validator && !validator(e, data))) ? 1 : 0;
			seterr(labels[e.id], err);
			seterr(e, err);
			cerr += err;
		});
		return cerr == 0;
	}
}