var formWrapper = new Class({
	initialize: function(options) {
		this.process(options.target);
	},
	
	process: function(target){
		if($defined(target)){
			target=$(target);
			var formElements=$$(target.getElementsByTagName('input'), target.getElementsByTagName('select'), target.getElementsByTagName('textarea'));
			formElements.each(this.addProperty.bind(this));
		}
	},
	
	addProperty: function(el){
			var name = this.getName(el);
			var value = this.getValue(el);
			if (this.filter(el)) return;
//			if (value === false || !name || el.disabled) return;
			this.addSipleProperty(el);
	},
	
	filter: function(el){
			var name = el.name;
			var value = el.getValue();
			if (value === false || !name || el.disabled)
				return true;
			return false;	
	},
	
	getValue: function(el){
			 return el.getValue();
	},

	getName: function(el){
			 return el.name;
	},
	
	addArrayProperty: function(el){
			var name = this.getName(el);
			var value = this.getValue(el);
			if($defined(this[name])){
				if($type(this[name]) == 'array'){
					if($type(this[value]) == 'array'){
						this[name].extend(value)
					}else{
						this[name].extend(new Array(value));					
					}	
				}else{
					this[name] = new Array(this[name]);					
					this.addArrayProperty(el);
				}
			}else{
				alert("ERROR: addArrayProperty call for empty property")
			}
	},
	
	addSipleProperty: function(el){
			var name = this.getName(el);
			var value = this.getValue(el);
			if(!$defined(this[name])){
				this[name]=value;
			}else{
				this.addArrayProperty(el);
			}
	}
	
	
});


var objectWrapper = formWrapper.extend({
		    initialize: function(options){
			this.parent(options); //will call the previous initialize;
    },

	filter: function(el){
			return false;	
	},
	
	getValue: function(el){
			 return el;
	},

	getName: function(el){
			 return el.id==""?el.name:el.id;
	}    
});