Event.observe(window, "load", function()
{
	var forms = $$('form');

	for(var i = 0; i < forms.length; i++)
	{
		if(forms[i].hasClassName('changed'))
		{
			new ChangedForm(forms[i]);
		}
	}
});

if(!window.Forms) window.Forms = {};

Object.extend(window.Forms, 
{
	changedForms: new Hash(),
	
	callbacks: new Array(),

	add: function(changedForm)
	{
		this.changedForms.set(changedForm.name, changedForm);
	},
	
	addCallback: function(action)
	{
		this.callbacks.push(action);
	},

	submit: function(name)
	{
		var changedForm = this.changedForms.get(name);

		if(changedForm)
		{
			changedForm.update();

			changedForm.form.submit();
			
			return true;
		}
		
		return false;
	},
	
	submitDestination: function(destination)
	{
		var sourceElement = $('source');
	
		if(destination == null || destination.length == 0)
		{
			destination = sourceElement.value;
		}
	
		if(destination.substring(destination.length - 1) == "_")
		{
			if(sourceElement)
			{
				var sourceParts = sourceElement.value.split("_");
			
				for(var i = 2; i < sourceParts.length; i++)
				{
					if(!destination.endsWith("_"))
					{
						destination += "_";
					}
					
					destination += sourceParts[i];
				}
			}
		}

		$('destination').value = destination;			

		this.submit(sourceElement.form.getAttribute('id'));
	},
	
	maxLength: function(element, inMaxLength)
	{
		if(element.value.length > inMaxLength)
		{
			element.value = element.value.substring(0, inMaxLength);
		}
	}
});

var ChangedForm = Class.create(
{
	initialize: function(form)
	{
		this.form = $(form);

		this.name = this.form.identify();
		
		this.checked = false;

		this.original = new Hash();

		var changedID = this.form.identify() + "_changed";

		this.form.insert("<input type='hidden' name='" + changedID + "' id='" + changedID + "' />");

		this.changed = $(changedID);

		var elements = this.form.getElements();

		for(var i = 0; i < elements .length; i++)
		{
			if(elements[i].name.length > 0)
			{
				//console.log('orig: ' + elements[i].name + ', ' + elements[i].value)
				this.original.set(elements[i].name, elements[i].value);
			}
		}

		this.form.observe('submit', this.update.bindAsEventListener(this));

		Forms.add(this);	
	
	},

	update: function(event)
	{
		if(this.checked)
		{
			Event.stop(event);

			return;
		}

		for(var i = 0; i < Forms.callbacks.length; i++)
		{
			try
			{
				eval(Forms.callbacks[i]);
			}
			catch(e)
			{
				
			}
		}
		
		this.checked = true;

		var changedFields = [];
		var elements = this.form.getElements();

		for(var i = 0; i < elements.length; i++)
		{
			if(elements[i].name.length > 0)
			{
				if(elements[i].type == 'select-one' || elements[i].type == 'select-multiple')
				{
					for(var j = 0; j < elements[i].options.length; j++)
					{
						if((elements[i].options[j].selected && !elements[i].options[j].defaultSelected) ||
						  (!elements[i].options[j].selected &&  elements[i].options[j].defaultSelected))
						{
							changedFields.push(elements[i].name);
			
							break;
						}
					}
				}
				else if(elements[i].type == 'checkbox' || elements[i].type == 'radio')
				{
					if((elements[i].checked && !elements[i].defaultChecked) ||
					  (!elements[i].checked &&  elements[i].defaultChecked))
					{
						changedFields.push(elements[i].name);
					}
				}
				else
				{
					if(elements[i].value != this.original.get(elements[i].name))
					{
						changedFields.push(elements[i].name);
					}
				}
			}
		}

		if(changedFields.length > 0)
		{
			this.changed.value = changedFields.join(",");
		}
	}
});


var AutoLabel = Class.create(
{
	initialize: function(element, label)
	{
		this.element	= $(element);
		this.label	= label;
		this.element.observe('blur',	this.blur.bindAsEventListener(this));
		this.element.observe('focus',	this.focus.bindAsEventListener(this));
		this.update(false);
	},
	
	blur: function(event)
	{
		this.update(false);
	},
	
	focus: function(event)
	{
		this.update(true);
	},
	
	update: function(focused)
	{
		if(this.element)
		{
			if(focused)
			{
				if(this.element.hasClassName("empty"))
				{
					this.element.value = "";
					
					this.element.removeClassName("empty");
					
					this.element.style.color = "";
				}
			}
			else
			{
				if(this.element.value.length == 0)
				{
					this.element.value = this.label;
					
					this.element.addClassName("empty");
					
					this.element.style.color = "#aaa";
				}
			}
		}
	}
});
