FormControlPrototype = {

  focused: false,

  initialize: function( id, callback, onInvalidCallback)
	{
		this.jsonHeader = 'text/x-json; charset=utf-8';
		this.owner = $( id );
    this.controls = new Array();
		this.callback = callback;
          if(typeof onInvalidCallback != 'undefined')
            this.onInvalidCallback = onInvalidCallback;
    this.tags = new Array('input', 'select', 'textarea');

		Event.observe( id, 'submit', this.send.bindAsEventListener(this) )
  },

	send: function( event )
	{
		Event.stop(event);

		for (var i = 0; i < this.controls.length; i++)
		  this.controls[i].valid();

          if(typeof this.onInvalidCallback != 'undefined')
            eval(this.onInvalidCallback);
		this.owner.request({
      evalJS: true,
      onComplete: this.onComplete.bindAsEventListener(this)
    });

		return false;
  },

	onComplete: function( transport )
	{
		if (this.jsonHeader == transport.getHeader('Content-type')) {
			var errors = transport.responseText.evalJSON(true);

		  	for (var i = 0; i < this.tags.length; i++) {
		  		var elements = this.owner.getElementsByTagName(this.tags[i]);

		  		for (var j = 0; j < elements.length; j++) {
		  			if (typeof(elements[j].jControl) == 'object' &&
		  			typeof(errors[elements[j].jControl.model]) != "undefined" &&
						typeof(errors[elements[j].jControl.model][elements[j].jControl.field]) != "undefined") {
		  				elements[j].jControl.invalid(errors[elements[j].jControl.model][elements[j].jControl.field]);
                                          if(typeof this.onInvalidCallback != 'undefined')
                                            eval(this.onInvalidCallback);
		  				return;
		  			}
		  		}
		  	}
		  if (this.callback)
                    eval(this.callback);
	 }
	},

	onLoad: function()
	{
     var elements = this.owner.getElements();

		  for (var i = 0; i < elements.length; i++) {
				if (elements[i].type != 'hidden' &&
				elements[i].type != 'submit' &&
				elements[i].type != 'select-one') {
			  try {
					$(elements[i]).activate();
					break;
				}
				catch (e) {}
			}
		}
	}
};

FormControl = Class.create( FormControlPrototype );
