var Form = new Class({
	
	Implements: [Options, Events],
	
	options: {
		sendButtonText: "Reservar",
	
		onFieldBlur	: $empty,
		onFieldFocus: $empty,
		onSend		: $empty
	},
	
	container 		: undefined,
	fields 			: new Hash(),
	replicantFields	: new Hash(),
	
	initialize: function(container)
	{
		this.container = $(container);
		this.setUp();
	},
	
	setUp: function()
	{
		this.wrapper 			= new Element("div", {"class":"formContainer"}).inject(this.container);
		this.fieldsContainer	= new Element("div", {"class":"fieldsContainer"}).inject(this.wrapper);
		this.sendButton			= new Element("a", {href:"#", text:this.options.sendButtonText}).inject(this.wrapper);
		this.sendButton.addEvent("click", function(e){if($defined(e))e.stop()});
		this.sendButton.addEvent("click", this.send.bind(this));
	},
	
	send: function()
	{
		if(!this.validate())
		{
			return false;
		}
		
		this.fireEvent("onSend", [this.getValues()]);
	},

	validate: function()
	{
		return true;
	},
	
	addLinkCallback: function(field, text, method)
	{
		if(!$defined(this.fields[field]))
		{
			return false;
		}
		
		this.fields[field].addLinkCallback(text, method);
	},
	
	setFieldMask: function(field, maskOptions)
	{
		if(!$defined(this.fields[field]))
		{
			return false;
		}
		
		this.fields[field].setMask(maskOptions);
	},
	
	addField: function(field)
	{
		this.fields[field.getName()] = field;
		field.inject(this.fieldsContainer);
		field.addEvent("onBlur", this.fieldBlur.bind(this));
		field.addEvent("onFocus", this.fieldFocus.bind(this));
		field.addEvent("onKeyUp", this.fieldKeyUp.bind(this));
	},
	
	getValues: function()
	{
		var values = {};
		
		this.fields.each(function(field){
			
			values[field.getName()] = field.getValue();
			
		}.bind(this))
		
		return values;
	},
	
	getField: function(fieldName)
	{
		if(!$defined(this.fields[fieldName]))
		{
			return false;
		}
		
		return this.fields[fieldName];
	},
	
	setReplicantField: function(masterField, slaveField)
	{
		this.replicantFields[masterField] = slaveField;
	},
	
	setValue: function(field, value)
	{
		if(!$defined(this.fields[field]))
		{
			return false;
		}
		
		if(this.replicantFields.hasValue(field))
		{
			var masterValue = this.fields[this.replicantFields.keyOf(field)].getValue();

			if(masterValue != value)
			{
				this.fields[field].gotMyOwnValue = true;
			}
		}
		
		this.fields[field].setValue(value);
		
	},
	
	/*Field Events*/
	
	fieldBlur: function(field)
	{
		this.fireEvent("onFieldBlur", [field]);
		
		if($defined(this.replicantFields[field.getName()]) && !this.fields[this.replicantFields[field.getName()]].gotMyOwnValue)
		{
			this.fields[this.replicantFields[field.getName()]].fieldBlur();
		}
	},
	
	fieldFocus: function(field)
	{
		this.fireEvent("onFieldFocus", [field]);
	},
	
	fieldKeyUp: function(field)
	{
		if($defined(this.replicantFields[field.getName()]) && !this.fields[this.replicantFields[field.getName()]].gotMyOwnValue)
		{
			this.fields[this.replicantFields[field.getName()]].setValue(field.getValue());
		}
	}
	
});