/**
 * @constructor
 */
compono.Form = new compono.Object("Form");

/**
 * @constructor
 */
compono.Form.SelectMinimal = new compono.Form.Object("SelectMinimal");

/**
 * Colecao de selects que utilizam esse objeto de servico
 */
compono.Form.SelectMinimal.Elements = new Array();
compono.Form.SelectMinimal.Elements.add = function(element){
	if(typeof(element.itemSourceIndex) != "number"){
		element.itemSourceIndex = this.push(element)
		return true;
	}
	return false;
}

/**
 * 
 * @param {Object} element
 */
compono.Form.SelectMinimal.Elements.remove = function(element){
	if(typeof(element.itemSourceIndex) == "number"){
		delete element.itemSourceIndex;
		return true;
	}
	return false;
}

/**
 * 
 * @param {Object} divinput
 * @param {Object} e
 */
compono.Form.SelectMinimal.open = function(divinput,e){
	var div, s = this;
	
	div = divinput.parentNode;
	
	this.Elements.add(div);
	
	div.DocumentEventKeyPress = this.DocumentEventKeyPress;
	div.DocumentEventClick = this.DocumentEventClick;
	div.open = this.ElementOpen;
	div.close = this.ElementClose;
	div.EventClick = this.ElementEventClick;

	this.Event.add("click",div.EventClick,div)
	
	if(!this.hasClassName("select-minimal-visible",div)){
		div.open();
	}else{
		div.close();
	}

	/* Essa solucao e apenas para o IE */
	if(!div.WindowlessImplemented && window.attachEvent){
		this.Windowless(	this.getByClassName("div","select-minimal-body", div)	)
	}
	
	this.Event.stopPropagation(e);
}

/**
 * Callback do Document para evento de KeyPress
 * @param {Object} e
 */
compono.Form.SelectMinimal.DocumentEventKeyPress = function(e){
	if(!e)e=window.event;
	if(e.keyCode == 27) compono.Form.SelectMinimal.close();
}

/**
 * Callback do Documento para evento de Click
 * @param {Object} e
 */
compono.Form.SelectMinimal.DocumentEventClick = function(e){
	function close(element, index, array){
		element.close();
	};
	compono.Form.SelectMinimal.Elements.forEach(close);
}

/**
 * Metodo do componente para abertura
 */
compono.Form.SelectMinimal.ElementOpen = function(){
	var $ = compono.Form.SelectMinimal;
	$.appendClassName('select-minimal-visible',this);
	$.Event.add("keypress",this.DocumentEventKeyPress,document)
	$.Event.add("click",this.DocumentEventClick,document)
}

/**
 * Metodo do componente para fechamento
 */
compono.Form.SelectMinimal.ElementClose = function(){
	var $ = compono.Form.SelectMinimal;
	$.removeClassName('select-minimal-visible',this);
	$.Event.remove("keypress",this.DocumentEventKeyPress,document)
	$.Event.remove("click",this.DocumentEventClick,document)
}

/**
 * Para a propagacao da bolha de eventos qdo clicado no componente
 * @param {Object} e
 */
compono.Form.SelectMinimal.ElementEventClick = function(e){
	compono.Form.SelectMinimal.Event.stopPropagation(e);
}

/**
 * Metodo executado pelos checks internos
 * @param {Object} groupname
 * @param {Object} control
 * @param {Object} e
 */
compono.Form.SelectMinimal.option = function(groupname, control, e){
	var checks, check, values;
	if(!e)e=window.event;
	
	if(control.checked){ 
		this.appendClassName("selected", control.parentNode) 
	}else{
		this.removeClassName("selected", control.parentNode) 
	}
	
	inputText = this.getByTagName("input",control.parentNode.parentNode.parentNode);
	values = [];	
	
	for(var i=0; check = this.getByID(groupname + "_" + i); i++){
		if(check.checked && check.getAttribute("text")){
			values.push(	check.getAttribute("text")	)
		}
	}

	inputText.value = values.join(", ");
	this.Event.stopPropagation(e);
}

/**
 * Windowless Elements
 * Cria um iframe logo abaixo do body do componente, para esse div nao fique abaixo dos selects;
 * @see http://dotnetjunkies.com/WebLog/jking/archive/2003/07/21/488.aspx
 * @see http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q177/3/78.asp&NoWebContent=1 
 */
compono.Form.SelectMinimal.Windowless = function(body){
	var iframe;
	if(body){
		iframe = document.createElement("iframe");
		iframe.src = "javascript:false;";
		iframe.scrolling = "no";
		iframe.hideFocus = true;
		
		if(body.offsetHeight && body.offsetWidth){
			iframe.style.width = body.offsetWidth + "px";
			iframe.style.height = body.offsetHeight + "px";
		}
		
		body.insertAdjacentElement("afterEnd", iframe)
		
		body.parentNode.WindowlessImplemented = true;
	}
}

/**
 * Metodo executado pelos checks internos
 * @param {Object} control
 * @param {Object} e
 */
compono.Form.Select = new compono.Form.Object("Select");
compono.Form.Select.item = function(control, e){
	
	var div = control.parentNode.parentNode;

	var inputText = this.getAnyByTagName("input",div);
	
	for(var i=0,check; check = inputText[i] ; i++){
		if(check.checked){
			div.setAttribute("value", check.value);
			return true;
		}
	}
	
	div.setAttribute("value", "");
}
