var Activities = function Activities(parent) {
	var _stage = parent;
	var _self = this;

	var _activitiesList = [];
	var _manager = false;

	var _initEvents = function _initEvents() {
		$E.on('activityOpenLink', 'click', _openActivities);
		$E.on('activityCloseLink', 'click', _closeActivities);
	};

	var _openActivities = function _openActivities(e) {
		if(!$D.hasClass('container', 'activityOpened')) {
			$D.addClass('container', 'activityOpened');
			
			if(!_manager) {
				_manager = new ActivityManagerList('activityContent');
			}
		}
	};

	var _closeActivities = function _closeActivities(e) {
		$D.removeClass('container', 'activityOpened');
	};

	var _init = function _init() {
		_initEvents();
	};

	this.open = _openActivities;
	this.close = _closeActivities;

	_init.call();

};

var ActivityManagerList = function ActivityManagerList(target) {

	var _target = target;

	var _position = 0;
	var _activitiesList = [];
	var _lists = [];
	var _ids = [];
	var _htm = [];
	var _itemsSel = [];


	var _colMax = 4; //numero maximo colunas

	var _numCol = 0;
	var _perCol = 0;
	var _colCount = 0;
	var _itemCount = 0;
	var _itemCountPerCol = 0;
	var _isDark = false;
	var _isJoin = false;

	var _initListHTML = function() {
		_itemCountPerCol = 0;

		var first = _colCount-1 == 0 ? ' first' : '';
		var last = _colCount == _colMax ? ' last' : '';
		var dark = _isDark ? ' dark' : '';
		var join = _isJoin ? ' join' : '';
		var classSufix = first + last + dark + join;
		_htm.push('<div class="activityCol'+ classSufix +'">');
		_htm.push('<div class="slider" id="activityColSlider'+_colCount+'"><!-- --></div>');
		_htm.push('<div id="activityCol'+_colCount+'" class="activityEachCol"><ul class="content">');
		_colCount++;
	};

	var _newListItemHTML = function() {

		//se o id selecionado da coluna for igual ao id atual do nó então ele deve ter a class opened
		if(_ids[_colCount-2] != null && _activitiesList[_itemCount].id == _ids[_colCount-2]) {
			var opened =  ' class="opened"';
			_itemsSel[_colCount-2] = _itemCountPerCol;
		}
		_htm.push('<li rel="'+_activitiesList[_itemCount].id+'"'+ (opened || '')+'>');

		_htm.push('<span><a href="activitySearch.do?termId='+_activitiesList[_itemCount].id+'&term='+_activitiesList[_itemCount].name+'" title="'+_activitiesList[_itemCount].name+'">'+_activitiesList[_itemCount].name+'</a></span>');
		if(_activitiesList[_itemCount].hasChild) {
			_htm.push('<div class="open"><!-- --></div>');
		}
		_htm.push('</li>');
		_itemCount++;
		_itemCountPerCol++;
	};

	var _closeListHTML = function() {
		_htm.push('</ul>');
		_htm.push('</div><div class="vr"><!-- --></div></div>');
	};

	var _getListHTML = function() {
		return _htm.join('');
	};

	var _drawCollumHTML = function(numCol, initialCol) {
		_numCol = numCol;
		_perCol = Math.ceil(_activitiesList.length/_numCol); //numero de itens por coluna
		_colCount = initialCol || 0;
		_itemCount = 0;

		if(initialCol > 1) {
			//se não é primeiro fecha a lista já aberta
			_closeListHTML();
		}

		for(var i = 0, l = _activitiesList.length; i < l; i++) {
			if( _itemCount/_perCol == 1 || _itemCount/_perCol == 2 || _itemCount/_perCol == 3) { _closeListHTML(); }
			if( _itemCount % _perCol == 0) { _initListHTML(); }
			_newListItemHTML();
		}
	};

	var _drawList = function() {
		_htm = [];
		$D.get(_target).innerHTML = '';

		for(var j = 0, k = _lists.length; j < k; j++) {
			_activitiesList = _lists[j];

			//É o ultimo item? Nao: igual a 1, Sim: qtas colunas falta p/ total
			var numCol = (j == _lists.length-1) ? _colMax - j : 1;
			
			//TODO: melhorar o modo de atribuição dessas variaveis;
			if(numCol == 1) {
				_isJoin = false;
				if(j == 0) {	_isDark = false; } else { _isDark = !_isDark; }
			} else {
				if(j > 0) { _isDark = !_isDark; }
				_isJoin = true;
			}

			_drawCollumHTML(numCol,j+1);
		}
		$D.get(_target).innerHTML = _getListHTML();
	};

	var _openListItem = function(id, position) {
		if(position == 4 && _lists.length == 4) { return false; } //remove this

		if(position) { _position = position; }

		if(id){ 
			if(_ids[_position-1] != null) {
				_ids[_position-1] = id;
				// _ids.splice: remove os ids da array do _position até o final da array
				_ids.splice(_position, _ids.length - _position);
			} else {
				_ids.push(id);
			}
		}
		_loadList(id);
	};

	var _adjustLastItemOfLastCol = function() {
		if($D.inDocument('activityCol4') && $D.inDocument('activityCol3')) {
			if($D.get('activityCol4').offsetHeight <= $D.get('activityCol4').scrollHeight) {
				var childs = $D.get('activityCol4').getElementsByTagName('LI');
				var beforeChilds = $D.get('activityCol3').getElementsByTagName('LI');
				var size = ($D.getY(beforeChilds[beforeChilds.length - 1]) - $D.getY(childs[childs.length - 1])) + 'px';
				var newChild = document.createElement('LI');
				childs[0].parentNode.appendChild(newChild);
				newChild.innerHTML = '<!-- -->';
				newChild.style.display = 'block';
				newChild.style.height = size;
	
				childs = null;
				beforeChilds = null;
				newChild = null;
			}
		}
	};

	var _setHandlers = function() {
		$E.removeListener('activityContent', 'click');

		$E.on('activityContent', 'click', function(e) {
			var target = $E.getTarget(e);
			if($D.hasClass(target, 'open')) {
					var position = target.parentNode.parentNode.parentNode.id.replace(/activityCol([1-4])$/,'$1');
					var id = target.parentNode.getAttribute('rel');
					_openListItem(id, position);
				/*alert(target.parentNode.parentNode.parentNode.id);*/
			}
			target = null;
		});

		//TODO: fazer lógica deste trecho com laços
		switch(_lists.length) {
			case 1:
				Slider.destroy('activityCol1');
				Slider.newInstance('activityCol1', 'activityColSlider1');

				Slider.getInstance('activityCol1').getHandler().onSlide(function(){
					$D.get('activityCol2').scrollTop = $D.get('activityCol1').scrollTop;
					$D.get('activityCol3').scrollTop = $D.get('activityCol1').scrollTop;
					$D.get('activityCol4').scrollTop = $D.get('activityCol1').scrollTop;
				});

				_adjustLastItemOfLastCol();
			break;

			case 2:
				Slider.destroy('activityCol1');
				Slider.destroy('activityCol2');
				Slider.newInstance('activityCol1', 'activityColSlider1');
				Slider.newInstance('activityCol2', 'activityColSlider2');

				Slider.getInstance('activityCol2').getHandler().onSlide(function(){
					$D.get('activityCol3').scrollTop = $D.get('activityCol2').scrollTop;
					$D.get('activityCol4').scrollTop = $D.get('activityCol2').scrollTop;
				});

				_adjustLastItemOfLastCol();
			break;

			case 3:
				Slider.destroy('activityCol1');
				Slider.destroy('activityCol2');
				Slider.destroy('activityCol3');
				Slider.newInstance('activityCol1', 'activityColSlider1');
				Slider.newInstance('activityCol2', 'activityColSlider2');
				Slider.newInstance('activityCol3', 'activityColSlider3');

				Slider.getInstance('activityCol3').getHandler().onSlide(function(){	
					$D.get('activityCol4').scrollTop = $D.get('activityCol3').scrollTop;
				});

				_adjustLastItemOfLastCol();
			break;

			case 4:
				Slider.destroy('activityCol1');
				Slider.destroy('activityCol2');
				Slider.destroy('activityCol3');
				Slider.destroy('activityCol4');
				Slider.newInstance('activityCol1', 'activityColSlider1');
				Slider.newInstance('activityCol2', 'activityColSlider2');
				Slider.newInstance('activityCol3', 'activityColSlider3');
				Slider.newInstance('activityCol4', 'activityColSlider4');
			break;
		}

		for(var i = 0, l = _itemsSel.length; i < l; i++) {
			if(_itemsSel[i] >= 9) {
				var activeListToMove = 'activityCol' + (i+1);
				var moveScrollTopTo = _itemsSel[i]*21;
				$D.get(activeListToMove).scrollTop = moveScrollTopTo;
				Slider.getInstance(activeListToMove).getHandler().refresh();
			}
		}


	};

	var _manageList = function() {
		_drawList();
		_setHandlers();
	};

	var _loadListSuccess = function(o) {
			var responseJSON = eval('(' + o.responseText + ')');
			_activitiesList = responseJSON.activities;
			if(_lists[_position] != null) {
				// _lists.splice: remove os itens da array do _position até o final da array
				_lists.splice(_position, _lists.length - _position);
				_lists[_position] = _activitiesList;
			} else {
				_lists.push(_activitiesList);
			}

			if(_itemsSel[_position] != null) {
				// _itemsSel.splice: remove os itens da array do _position até o final da array
				_itemsSel.splice(_position, _itemsSel.length - _position);
			}

			_manageList();
	};

	var _loadList = function(id) {
		//TODO: implementar um loader para esperar o retorno da lista
		var url = ['subjectChild.do'];
		/*
		if(_ids.length > 0) {
			url.push('?');
			for(var i in _ids) {
				url.push('termId='+_ids[i]+'&');
			}
		}
		*/
		//TODO: revisar esse ponto (Érika)
		url.push('?termId='+id+'&');
		var req = new Request();
		req.get(url.join('').replace(/&$/,''), _loadListSuccess);
	};

	var _init = function() {
		//TODO: implementar um loader para esperar o retorno da lista
		var req = new Request();
		req.get('subject.do', _loadListSuccess);
	};

	_init.call();

}

