/* 

	List Expander 
	written by Alen Grakalic, provided by Css Globe (cssglobe.com)
	
*/

this.listexpander = function(){
	
	// edit 
	var expandTo = 2; // level up to which you want your lists to be initially
						// expanded. 1 is minimum
	var expandText = "<img src='/themes/Classic/images/collapsed.gif'/>"; // text for expand all button
	var collapseText = "<img src='/themes/Classic/images/expanded.gif'/>"; // text for collapse all button
	var listClass = "listexpander listexpander"; // class name that you want to
												// assign to list(s). If you
												// wish to change it make sure
												// to update the css file as
												// well
	var listClassSubmit = "listexpander listexpander_submit"; 
	var listClassApproval = "listexpander approval";
	
	var DEFAULT_CHECKB0X_PREFIX = "check_community_parent_";
	var DIV_CONTAINER_ID = "aspect_eperson_CollectionApproval_div_languages-division";
	var CHECKBOX_ROOT = "check_community_0";
	var CHECKBOX_FIRST_CHILD = "check_community_parent_0";
	var CHECKED_NO_ONE = 1;
	var CHECKED_SOME_ONE = 2;
	var CHECKED_ALL = 3;
	var isFromCheck = false;
	
	// end edit (do not edit below this line)
	
	this.start = function(){
		var ul = document.getElementsByTagName("ul");
		for (var i=0;i<ul.length;i++){
			if(ul[i].className == listClass){
				create(ul[i]);
				buttons(ul[i], null);
				
			}
			else
			if(ul[i].className == listClassApproval){
				createApproval(ul[i]);
				buttons(ul[i], "aspect_eperson_CollectionApproval_list_parent");
			}
			else				
			if(ul[i].className == listClassSubmit){
				createSubmit(ul[i]);
				buttonsSubmit(ul[i]);
			}
			else{
			if (ul[i].className == "listexpander alphabet")
				ul[i].className = "alphabet"
			else
			if (ul[i].className == "listexpander horizontal")
				ul[i].className = "horizontal"				
			}
		};
	};

	this.create = function(list) {	
		var items = list.getElementsByTagName("li");
		for(var i=0;i<items.length;i++){
			listItem(items[i]);
		};
	};
	
	this.createSubmit = function(list) {	
		var items = list.getElementsByTagName("li");
		for(var i=0;i<items.length;i++){
			listItemSubmit(items[i]);
		};
	};
	
	this.createApproval = function(list) {	
		var items = list.getElementsByTagName("li");
		for(var i=0;i<items.length;i++){
			listItemApproval(items[i]);
		};
		checkAll();
	};

	this.listItem = function(li){
		if(li.getElementsByTagName("ul").length > 0){
			var ul = li.getElementsByTagName("ul")[0];
			ul.style.display = (depth(ul) <= expandTo) ? "block" : "none";
			li.className = (depth(ul) <= expandTo) ? "expanded" : "collapsed";
			li.over = true;	
			ul.onmouseover = function(){li.over = false;} 
			ul.onmouseout = function(){li.over = true;} 
			li.onclick = function(){
				if(this.over){
					ul.style.display = (ul.style.display == "none") ? "block" : "none";
					this.className = (ul.style.display == "none") ? "collapsed" : "expanded";				
				};				
			};
		};				
	};
	
	this.listItemApproval = function(li){
		if(li.getElementsByTagName("ul").length > 0){
			var ul = li.getElementsByTagName("ul")[0];
			ul.style.display = (depthApproval(ul) <= expandTo) ? "block" : "none";
			li.className = (depthApproval(ul) <= expandTo) ? "expanded" : "collapsed";
			li.over = true;

			ul.onmouseover = function(){
				li.over = false;
			} 
			ul.onmouseout = function(){
				li.over = true;
			} 
			li.onclick = function(event){
				if(this.over){
					if(!isFromCheck) {
						ul.style.display = (ul.style.display == "none") ? "block" : "none";
						this.className = (ul.style.display == "none") ? "collapsed" : "expanded";
					}
				};
				isFromCheck = false;
			};

			var checkboxes = li.getElementsByTagName("input");
			if(checkboxes.length > 0) {
				for(var i = 0; i < checkboxes.length; i++) {
					checkboxes[i].onclick = function(event) {
						manageCheck(this);
						isFromCheck = true;
					};
				}
			}
			
		};
	};
	
	/**
	 * Desabilita evento "onclick" de elementos HTML.
	 * 
	 * @param rootElm
	 *            Elemento armazenador dos elementos a terem evento desabilitado
	 * @param childrenElm
	 *            elementos a terem evento desabilitado
	 */
	function inativateEvents(rootElm, childrenElm) {
		var elements = rootElm.getElementsByTagName(childrenElm);
		for(var i = 0; i < elements.length; i++) {
			elements[i].onclick = null;
		}
	}
	
	/**
	 * Seleciona/desseleciona todos componentes da 
	 */
	function checkAll() {
		var masterRoot = getSingleByName(CHECKBOX_ROOT);
		if(masterRoot != null) {
			masterRoot.onclick = function () {
				var roots = getByName(CHECKBOX_FIRST_CHILD);
				for(var i = 0; i < roots.length; i++) {
					roots[i].checked = this.checked;
					manageCheck(roots[i]);
				}
			}
		}
	}
	
	/**
	 * Função responsável pela seleção de checkboxes filhos
	 * @param checkboxElm Elemento checkbox clicado
	 * @param liElm LI a qual o checkbox está contido
	 */
	function manageCheck(checkboxElm) {
		var children = getByName(DEFAULT_CHECKB0X_PREFIX + checkboxElm.value);
		if(children != null) {

			for(var i = 0; i < children.length; i++) {
				
				var currentCheck = children[i];
				currentCheck.checked = checkboxElm.checked;
				
				if(getByName(DEFAULT_CHECKB0X_PREFIX + currentCheck.value) != null) {
					manageCheck(currentCheck);
				}
			}
		}
	}
	
	function manageCheckParent(checkboxElm) {
		var parentElm = getParentNode(checkboxElm);
		
		/** Verifica se o elemento possui pai * */
		if(parentElm != null) {
			
			/** Verifica se os irmãos estão selecionados **/
			var selectedsSameLevel = allFromSameLevelChecked(checkboxElm);
			parentElm.checked = selectedsSameLevel;
			
			/** Verifica se o nodo pai possui outro pai * */
			if(getParentNode(parentElm) != null) {
				manageCheckParent(parentElm);
			}
		}
	}
	
	/**
	 * Obtem nodo superior
	 * @param childElm nodo filho
	 */
	function getParentNode(childElm) {
		var parentNode = null;
		
		/** Caso o elemento seja o primeiro filho do nodo root * */
		if(childElm.name == CHECKBOX_FIRST_CHILD) {
			parentNode = getSingleByName(CHECKBOX_ROOT);
		}else {
			/** Obtem o checkbox de nível superior pelo valor **/
			var parentValue = childElm.name.substring(23, childElm.name.length);
			parentNode = getCheckBoxByValue(parentValue);
		}
		return parentNode;
	}
	
	/**
	 * Verifica se todos "irmãos" estão checados
	 * @param elm Elemento que possui irmãos
	 */
	function allFromSameLevelChecked(elm) {
		var elements = getByName(elm.name);
		for(var i = 0; i < elements.length; i++) {
			if(!elements[i].checked) {
				return false;
			}
		}
		return true;
	}
	
	/**
	 * Obtém dado checkbox por seu valor
	 * @param checkBoxValue valor do checkbox a ser pesquisado
	 */
	function getCheckBoxByValue(checkBoxValue) {
		var checkboxes = getMultipleElementByTag(document, "input");
		for(var i = 0; i < checkboxes.length; i++) {
			var currentCheck = checkboxes[i];
			if(currentCheck != null && 
					currentCheck.name.substring(0, 23) == "check_community_parent_" &&
					currentCheck.value == checkBoxValue) {
				return currentCheck;
			}
		}
		return null;
	}
	
	/**
	 * Método para verificação de:
	 * 		- Um ou mais filhos selecionados
	 * 		- Todos filhos Selecionados
	 * 		- Nenhum filho selecionado
	 */
	function verifySelecion(name) {
		var checkboxes = getByName(name);
		if(checkboxes != null) {

			var countChecked = 0;
			for(var i = 0; i < checkboxes.length; i++) {
				var currentCheck = checkboxes[i];
				if(currentCheck.checked) {
					countChecked++;
				}
			}
			
			if(countChecked == checkboxes.length) {
				return CHECKED_ALL;
			}else 
				if(countChecked > 0 && countChecked < checkboxes.length) {
					return CHECKED_SOME_ONE;
				}
		}
		return CHECKED_NO_ONE;
	}
	
	/**
	 * Obtem elemento por ID
	 * @param elmId Id do elemnto
	 */
	function getById(elmId) {
		return document.getElementById(elmId);
	}
	
	/**
	 * Obtem elementos por nome
	 * @param tag "name" do elemento
	 */
	function getByName(elmName) {
		 return document.getElementsByName(elmName);
	}
	
	/**
	 * Obtem primeiro registro de um array
	 * @param tag "name" do elemento
	 */
	function getSingleByName(elmName) {
		return document.getElementsByName(elmName)[0];
	}
	
	/**
	 * Busca elemento por tag dentro de um elemento superior
	 * @param elm Elemento armazenador da tag (elemento superior)
	 * @param tag Tag de elemento a ser buscado em "elm"
	 * @return primeiro elemento encontrado na tag superior
	 */
	function getSingleElementByTag(elm, tag) {
		var elmTempContainer = elm.getElementsByTagName(tag);
		if(elmTempContainer != null && elmTempContainer.length > 0) {
			return elmTempContainer[0];
		}
		return null;
	}
	
	/**
	 * Busca elementos por tag dentro de um elemento superior
	 * @param elm Elemento armazenador das tags (elemento superior)
	 * @param tag Tag de elemento a ser buscado em "elm"
	 * @return elementos encontrados na tag superior
	 */
	function getMultipleElementByTag(elm, tag) {
		var elmTempContainer = elm.getElementsByTagName(tag);
		if(elmTempContainer != null && elmTempContainer.length > 0) {
			return elmTempContainer;
		}
		return null;
	}
	
	this.listItemSubmit = function(li){
		if(li.getElementsByTagName("ul").length > 0){
			var ul = li.getElementsByTagName("ul")[0];
			ul.style.display = (depthSubmit(ul) <= expandTo) ? "block" : "none";
			li.className = (depthSubmit(ul) <= expandTo) ? "expanded" : "collapsed";
			li.over = true;	
			ul.onmouseover = function(){li.over = false;} 
			ul.onmouseout = function(){li.over = true;} 
			li.onclick = function(){
				if(this.over){
					ul.style.display = (ul.style.display == "none") ? "block" : "none";
					this.className = (ul.style.display == "none") ? "collapsed" : "expanded";				
				};
			};
		}
		else{
			var a = li.getElementsByTagName("a");
			var valorAux;
			if (verificaIE8()){
				valorAux = a.item().innerText;	
			}
			else{
				valorAux = a[0].text;
			}
			
			var valor = valorAux.split("::--::");
			li.onclick = function(){
				sendBackToParentWindow(valor[0]);
				setaValor(valor[0]);
				var form = document.getElementsByTagName("form")[1];
				form.submit();
			   }
			a[0].id = "leaf_"+valor[0];

			a[0].innerHTML = valor[1];
		};	
	};	
		
	this.buttons = function(list, nomeListaRecolher){
		var parent = list.parentNode;
		var p = document.createElement("p");
		p.className = listClass;
		var a = document.createElement("a");
		a.innerHTML = expandText;
		a.onclick = function(){expand(list)};
		p.appendChild(a);
		var a = document.createElement("a");
		a.innerHTML = collapseText;
		a.onclick = function(){
			collapse((nomeListaRecolher == null) ? list : document.getElementById(nomeListaRecolher))
		};
		p.appendChild(a);
		parent.insertBefore(p,list);
	};
	
	this.buttonsSubmit = function(list){
		var parent = list.parentNode;
		var p = document.createElement("p");
		p.className = listClassSubmit;
		var a = document.createElement("a");
		a.innerHTML = expandText;
		a.onclick = function(){expand(list)};
		p.appendChild(a);
		var a = document.createElement("a");
		a.innerHTML = collapseText;
		a.onclick = function(){collapseSubmit(list)};
		p.appendChild(a);
		parent.insertBefore(p,list);
	};
	
	this.expand = function(list){
		li = list.getElementsByTagName("li");
		for(var i=0;i<li.length;i++){
			if(li[i].getElementsByTagName("ul").length > 0){
				var ul = li[i].getElementsByTagName("ul")[0];
				ul.style.display = "block";
				li[i].className = "expanded";
			};
		};
	};
	
	this.collapse = function(list){
		li = list.getElementsByTagName("li");
		for(var i=0;i<li.length;i++){
			if(li[i].getElementsByTagName("ul").length > 0){
				var ul = li[i].getElementsByTagName("ul")[0];
					ul.style.display = (depth(ul) <= expandTo) ? "block" : "none";
					li[i].className = (depth(ul) <= expandTo) ? "expanded" : "collapsed";
			};
		};
	};
	
	this.collapseSubmit = function(list){
		li = list.getElementsByTagName("li");
		for(var i=0;i<li.length;i++){
			if(li[i].getElementsByTagName("ul").length > 0) {
				var ul = li[i].getElementsByTagName("ul")[0];
				ul.style.display = (depthSubmit(ul) <= expandTo) ? "block" : "none";
				li[i].className = (depthSubmit(ul) <= expandTo) ? "expanded" : "collapsed";
			};
		};
	};
	
	this.depth = function(obj){
		var level = 1;
		if(obj.parentNode != null) {
			while(obj.parentNode != null && obj.parentNode.className != listClass){
				if (obj.tagName == "UL"){
					level++;
				}
				obj = obj.parentNode;
			};
		}
		return level;
	};
	
	this.depthApproval = function(obj){
		var level = 1;
		while(obj.parentNode.className != listClassApproval){
			if (obj.tagName == "UL") level++;
			obj = obj.parentNode;
		};
		return level;
	};	
	
	this.depthSubmit = function(obj){
		var level = 1;
		while(obj.parentNode.className != listClassSubmit){
			if (obj.tagName == "UL") level++;
			obj = obj.parentNode;
		};
		return level;
	};
	
	function sendBackToParentWindow(node) {
		var old = document.getElementById("aspect_submission_submit_SelectCollectionStep_field_tcollection").value;
		if(old != '') {
			document.getElementById('leaf_'+old).style.fontWeight = document.getElementById('leaf_'+node).style.fontWeight;
		}
		document.getElementById('leaf_'+node).style.fontWeight = 'bold';
		document.getElementById("aspect_submission_submit_SelectCollectionStep_field_tcollection").value = node;
		return false;
	}
	
	function setaValor(valor) {
		document.getElementById("aspect_submission_submit_SelectCollectionStep_field_handle").value = valor;
	}
	
	function verificaIE8() {
		var bname;
		var bversion;

		bname=navigator.appName;

		if ((bname=="Microsoft Internet Explorer")){
			bversion=navigator.appVersion.split(";");
			bversion=bversion[1].substring(6,7);
			if ((bversion == 8) || (bversion == 7)){
				return true;
			}
			else{
				return false;
			}
		}
		else{
			return false;
		}
	}

		

		
	start();
	
};

window.onload = listexpander;


function selectResourceTypes(checked)
{
	document.getElementsByName("animacao_simulacao")[0].checked = checked;
	document.getElementsByName("imagem")[0].checked = checked;
	document.getElementsByName("audio")[0].checked = checked;
	document.getElementsByName("mapa")[0].checked = checked;
	document.getElementsByName("experimento_pratico")[0].checked = checked;
	document.getElementsByName("software_educacional")[0].checked = checked;
	document.getElementsByName("hipertexto")[0].checked = checked;
	document.getElementsByName("video")[0].checked = checked;
}
