var Validate = new Object;
Validate.errors = [];
Validate.defaultValues = new Hash;
Validate.defaultClasses = new Hash;

Validate.addField = function(model, field, errorCode, msg)
{
	if(!Validate.errors[model]) Validate.errors[model] = [];
	if(!Validate.errors[model][field]) Validate.errors[model][field] = [];
	
	if(!errorCode) errorCode = 0;
	Validate.errors[model][field][errorCode] = msg;
}

Validate.getError = function(model, field, errorCode)
{
	if(!errorCode) return;
	
	if(Validate.errors[model] && Validate.errors[model][field])
	{
		if(Validate.errors[model][field][errorCode])
		{
			return Validate.errors[model][field][errorCode];
		}
	}
	
	return errorCode;
}


Validate.setErrorDiv = function(model, field, divId, errorCode)
{
	var div = $(divId);
	
	if(errorCode.strip() == '')
	{
		div.style.display = 'none';
	} else {
		div.innerHTML = Validate.getError(model, field, errorCode);
		div.style.display = 'block';
	}
}

Validate.processError = function(response, model, field, div)
{
	Validate.setErrorDiv(model, field, div, response.responseText);
}

Validate.setDefaultValue = function(divId, defaultValue)
{
	Validate.defaultValues.set(divId, defaultValue);
	Validate.defaultClasses.set(divId, $(divId).className);
	new Event.observe(divId, 'blur', function(){Validate.addDefaultValue(divId);});
	new Event.observe(divId, 'focus', function(){Validate.clearDefaultValue(divId);});
	Validate.addDefaultValue(divId);
}

Validate.addDefaultValue = function(divId) {
	if($(divId).value == '' || $(divId).value == Validate.defaultValues.get(divId)){
		$(divId).className += " defaultValue";
		$(divId).value = Validate.defaultValues.get(divId);
	}
}

Validate.clearDefaultValue = function(divId) {
	if($(divId).value == Validate.defaultValues.get(divId)) {
		$(divId).value = '';
		$(divId).className = Validate.defaultClasses.get(divId);
	}
}

Validate.clearDefaultValues = function(){
	Validate.defaultValues.each(function(pair) {
      Validate.clearDefaultValue(pair.key);
    });
}

Validate.serialize = function(form, options) {
  return Validate.serializeElements(Form.getElements(form), options);
}

Validate.serializeElements = function(elements, options) {
  if (typeof options != 'object') options = { hash: !!options };
  else if (Object.isUndefined(options.hash)) options.hash = true;
  var key, value, submitted = false, submit = options.submit;

  var data = elements.inject({ }, function(result, element) {
    if (!element.disabled && element.name) {
      key = element.name; value = $(element).getValue();

      // Add in this line to clear any default values from the data
      if(Validate.defaultValues.get(element.id) && element.value == Validate.defaultValues.get(element.id))
        value = '';
		
      if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
          submit !== false && (!submit || key == submit) && (submitted = true)))) {
        if (key in result) {
          // a key is already present; construct an array of values
          if (!Object.isArray(result[key])) result[key] = [result[key]];
          result[key].push(value);
        }
        else result[key] = value;
      }
    }
    return result;
  });

  return options.hash ? data : Object.toQueryString(data);
}
