var AbstractFormApp=function(){
	
	this.Extends = UIComponent;
	
	/**
	 * 
	 * PUBLIC
	 * 
	 * */
	
	this.initialize=function(elemento/*Object*/){
		this.parent(elemento);
		
		this.onClickSendButton = this.onClickSendButton.bindWithEvent(this);
	};
	
	this.startup=function()/*void*/{
		this.initializeChildren();
		this.childrenInitialized();
		this.initializationComplete();
	};
	
	this.initializeChildren = function(){
		var ids/*Array*/ = this.listElementos();
		
		if(ids.length==0) return;
		
		var id/*String*/ = null;
		var input/*FormInput*/=null;
		var elemento/*Element*/=null;
		
		this.inputMap = {};
		this.inputs= [];
		
		for(var i=0;i<ids.length;i++){
			id =ids[i];
			
			elemento = document.id(id);
			
			input = this.createFormInput(elemento,id);
			
			this.inputs.push(input);
			this.inputMap[id] = input;
		}
		
		this.sendFormButton = document.id(this.getSendFormButtonID());
	};
	
	this.childrenInitialized=function(){
		
		this.sendFormButton.addEvent("click",this.onClickSendButton);
	}
	
	/**
	 * Retorna o input cujo ID é igual ao id
	 * 
	 * */
	
	this.getInputById=function(id/*String*/)/*FormInput*/{
		return this.inputMap[id];
	}
	
	/**
	 * Retorna o input pelo indice
	 * 
	 * */
	
	this.getInput=function(index/*int*/)/*FormInput*/{
		return this.inputs[index];
	}
	
	/**
	 * Retorna o array de inputs
	 * 
	 * */
	
	this.getInputs=function()/*Array*/{
		return this.inputs;
	}
	
	/**
	 * Envia o formulário
	 * 
	 * */
	
	this.sendForm=function(){
		
		
	}
	
	/**
	 * 
	 * PROTECTED
	 * 
	 * */
	
	this.inputs/*Array*/=null;
	this.inputMap/*Object*/=null;
	this.sendFormButton/*Element*/=null;
	
	/**
	 * Método que deve retornar os IDS dos elementos que serão inputs do form
	 * 
	 * */
	
	this.listElementos=function()/*Array*/{
		//abstract
		return [];
	};
	
	/**
	 * 
	 * Método que deve retornar o ID do botão que envia o form
	 * 
	 * */
	
	this.getSendFormButtonID=function(){
		//abstract
		return null;
	}
	
	/**
	 * Método que será acionado para associação dos 
	 * elementos do formulário com seus respectivos inputs
	 * deve ser sobrescrito na subclasse para tratamento da associação
	 * 
	 * @return FormInput
	 * */
	
	this.createFormInput=function(elemento/*Element*/,id/*String*/)/*FormInput*/{
		//abstract
		
		return null;
	};
	
	this.sendHandler=function()/*void*/{
		//abstract
	};
	
	/**
	 * 
	 * PRIVATE
	 * 
	 * */
	
	this.onClickSendButton=function()/*void*/{
		this.sendHandler();
	};
};

AbstractFormApp = new Class(new AbstractFormApp);

