/*
 * Some rights reserved (cc) 2008, Gonow Tecnologia Ltda
 * @autor: Tiago Canzian / Gonow 2008
 * http://creativecommons.org/licenses/by-sa/2.5/
 */

var Suggest = function Suggest(){
	var _self = this;
	
	var _doSuggestActive = new $G.CustomEvent();
	var _notFound = new $G.CustomEvent();
	var _doSuggestEvent = new $G.CustomEvent();
	var _getSelectedItem = 0;
	
	this.doSuggestActive = function(fctn){
		_doSuggestActive.subscribe(fctn);
	};
	this.notFound = function(fctn){
		_notFound.subscribe(fctn);
	};
	this.doSuggestEvent = function(fctn){
		_doSuggestEvent.subscribe(fctn);
	};
	this.getSelectedItem = function(){
		return _getSelectedItem;
	};
	
	var _initEvents = function() {
		$E.removeListener($D.get(_self.idInput),'keyup');
		$E.on($D.get(_self.idInput),'keyup', _handleKeyup);
		$E.removeListener($D.get(_self.idInput),'keydown');
		$E.on($D.get(_self.idInput),'keydown', _handleKeyDown);
	};
	
	var trueKeys = false;
	var _handleKeyDown = function handleKeyDown(e){
		var _eventKey = e.keyCode;
		var keyCodes = [9,13,16,18,20,33,34,37,38,39,40]
		if ((!$D.inArray(keyCodes,_eventKey))){
			trueKeys = true;
		} else {
			trueKeys = false;
		}
	}
	
	var lastKeyTimer = 0;
	var _handleKeyup = function handleKeyup(e) {
		var inputValue = $D.get(_self.idInput).value;
		var _e = $E.getTarget(e);
		var check = 0

		
		var checkValue = function checkValue(){
			if (inputValue.length == 0 || inputValue.length == 1){
				$D.get('suggest').className = 'line';
				Stage.handlerResize();
				if ( (!$D.getElementsByClassName('suggestCol')[0]) && (check != 0) ) {
					$D.get('suggestContent').textContent = '';
					check = 1
				}
			} else {
				
				if (trueKeys && inputValue.length > 1){
					clearTimeout(lastKeyTimer);
					lastKeyTimer = setTimeout(_doSuggest, 300);
					_doSuggestActive.fire(_e);
				}
			}	
		}
		
		clearTimeout(lastKeyTimer);
		lastKeyTimer = setTimeout(checkValue, 50);
		
	}
	
	var _doSuggest = function(e) {
		
		//COLOCANDO WAIT NOS SUGGESTS
		var i;
		var activeSuggests = $D.getElementsByClassName('title','strong');
		for (i in activeSuggests){
//			$D.addClass(activeSuggests[i].getElementsByTagName('em')[0],'waitSuggest');
		}
		
		var q = $D.get(_self.idInput).value;		
		var request = new Request();
		var center = map.getCenter();
		var query;
		var businessWord;
		var addressWord;
		
	    if (_self.url.indexOf('?') == -1){
			query = '?';
		}else{
			query = '';
		};
		
		ll = (center.getLatitude() + ',' + center.getLongitude());
		
		if(_self.idInput == 'inputBusiness'){ // caso suggest de empresas/pessoas/atividades
			businessWord = escape(YAHOO.lang.trim(q));
			addressWord = '';
		}else{								  // caso suggest de endereços
			businessWord = '';
			addressWord = escape(YAHOO.lang.trim(q));
		}

		if (q != '') {
			request.getAsync(_self.url + query + '&q=' + escape(q) + '&ll=' + ll, _self.target, businessWord, addressWord, _self.renderSuggest);
		}

	};

	var createTimer = 0;
	this.renderSuggest = function renderSuggest(o){
		$D.get('suggestContent').innerHTML = o.responseText;
		var suggestNotFound = $D.get('suggestNotFound');
		
		if (suggestNotFound){
			_notFound.fire(true);
			return false;
		};
		
		_notFound.fire(false);
		var columns = $D.getElementsByClassName('container','div','suggestContent');
		var sliders = $D.getElementsByClassName('slider','div','suggestContent');
		var columnContent = $D.getElementsByClassName('columnContent','div');
		for (var i=0, lC = columns.length; i<lC; i++){
			$D.generateId(columns[i]);
			$D.generateId(sliders[i]);
		}
		
		if(isIE6) {
			$D.addClass(sliders,'visOff');
			for (var i=0, lC=columnContent.length; i<lC; i++) {
				$D.setStyle(columnContent[i],'border','1px solid #fff');
			}
			$D.setStyle('suggestContent','width','90%');
		} else {
			for (var i=0, lC=columnContent.length; i<lC; i++) {
				$D.setStyle(columnContent[i],'border','1px solid #cfcfcf');
			}
		}
		
		if (_doSuggestEvent.fire(true)) {
			var create = function(){
				for (var i=0, lC = columns.length; i<lC; i++){
					var trueWidth = parseInt($D.get(columns[i]).getElementsByTagName('ul')[0].offsetWidth + 10);
					Slider.newInstance($D.get(columns[i]).id, $D.get(sliders[i]).id);
					
					if (isIE6) {
						$D.setStyle($D.get(columns[i]),'width',(trueWidth+10) +'px');
						$D.setStyle(columnContent[i],'border','1px solid #cfcfcf');	
					} else if(isOpera){
						$D.setStyle($D.get(columns[i]),'width',trueWidth +'px');
					}
				}
			}
			
			clearTimeout(createTimer);
			createTimer = setTimeout(create,50);
		}
		
		//$D.removeClass('columnDireccion','waitSuggest')
		
		//RETIRANDO WAIT DOS SUGGESTS
		var i;
		var activeSuggests = $D.getElementsByClassName('waitSuggest');
		for (i in activeSuggests){
			$D.removeClass(activeSuggests[i],'waitSuggest');
		}

	}	
	
	this.getMoreItens = function getMoreItens(e){
		var _e = $E.getTarget(e);
		disableSelection(_e);
		var listItem = ($D.hasClass(_e.parentNode,'listItem')) ? _e.parentNode : _e.parentNode.parentNode;
		if (listItem) {
			var itensContainer = $D.getElementsByClassName('itemCommune','ul',listItem)[0];
			var itensComune = itensContainer.getElementsByTagName('LI');
			if ($D.hasClass(itensContainer,'off')) {
				$D.addClass(listItem,'moreSelected');
				$D.replaceClass(itensContainer,'off','on');
			} else {
				$D.removeClass(listItem,'moreSelected');
				$D.replaceClass(itensContainer,'on','off');	
			}			
		}	
		var columns = $D.getElementsByClassName('container','div','suggestContent');
		var sliders = $D.getElementsByClassName('slider','div','suggestContent');		
		for (var i=0, lC = columns.length; i<lC; i++){
			$D.generateId(columns[i]);
			$D.generateId(sliders[i]);
		}
		for (var i=0, lC = columns.length; i<lC; i++){
			Slider.newInstance($D.get(columns[i]).id, $D.get(sliders[i]).id);
		}		
	}
		
	this.createSuggest = function createSuggest(objs){
		var objSuggest = objs || {};

		_self.idInput = objSuggest.idInput || null;
		_self.url = objSuggest.url || null;
		_self.target = objSuggest.target || null;
		_initEvents();
	};
	
}


var suggestNavigator;

function _doFnSuggest(e, _input, _form){

	if(suggestNavigator == undefined || suggestNavigator == null){
		suggestNavigator = new suggestNav();
	}
	
	inputFocus();
	
	if($D.hasClass($D.get('suggestContent'),"on")){
		if (e.keyCode == 13 ||//enter
			e.keyCode == 37 ||//direita
			e.keyCode == 38 ||//cima
			e.keyCode == 39 ||//esquerda
			e.keyCode == 40) {//baixo

			inputFocus();
			
			if(e.keyCode != 13){			suggestNavigator.setUnreadyToFind();}
			
			if (e.keyCode == 40){			suggestNavigator.moveDown();
			}else if (e.keyCode == 38){		suggestNavigator.moveUp();
			}else if (e.keyCode == 39){		suggestNavigator.moveNext();
			}else if (e.keyCode == 37){		suggestNavigator.movePrev();
			}else if (e.keyCode == 13){
				//Testa se o usuário ja escolheu um suggest;
				if (suggestNavigator.readyToFind()) {
					suggestNavigator.setUnreadyToFind();
					suggestNavigator = null;
					_execSearch(_form);
				} else {
					//executa a ação do onclick
					suggestNavigator.doAction();
				}
				inputBlur();
			}
		}
	}else{
		if(e.keyCode == 13) _execSearch(_form);
	}
}

var _execSearch = function(_form){
	$D.get(_form).onsubmit = function(){ 
		$D.get(_form).action = "search.do";
		return false;
	}
	
	if(_form == "formAddress"){//busca universal
		findAddress('inputAddress')
	
	}else if(_form == "formBusiness"){//busca empresas
		findBusiness('inputBusiness', 'inputBusinessIn')
	
	}else if(_form == "formRoute"){//busca rota
		findRoute('inputRoute', 'inputRouteTo')
	}
	
	suggestNavigator = null;
}



var suggestNav = function suggestNav() {
	
	//Variaveis
	var selectedItemClass="moreSelected";
	var selectedContainerClass="containerActive";
	var containerBasicClass="suggestCol";
	var classListItem="listItem";

	var actionLog="start";
	var readyToFind = true;
	
	keyMove.disable();
	keyMoveCtrl.disable();
	keyMoveShift.disable();
	keyMoveUp.disable()
	keyMoveCtrlUp.disable();
	keyMoveShiftUp.disable();
	inputFocus();
		
	this.logAction = function logAction(action){
		actionLog=action;
		if(action =="addSuggest") readyToFind = true;
	}
	
	this.setUnreadyToFind = function(){
		readyToFind = false;
	}
	
	this.readyToFind = function (){
		return readyToFind;
	}
	
	//Getters

	this.getContainers = function getContainers(){//retorna diversos detalhes sobre os containers
		var containers=$D.getElementsByClassName(containerBasicClass);
		var currentContainer, nextContainer, prevContainer;
		var index;
		var active=false;
	
		for(i=0;i<containers.length;i++){
			if($D.hasClass(containers[i],selectedContainerClass)){
				index=i;
				active=true;		
				break;
			}
		}
		
		if(index==undefined)index=0;
		
		lastContainer=containers.length-1;
		nextContainer=(index<lastContainer)?Math.ceil(index)+1:0;
		prevContainer=(index==0)?lastContainer:index-1;
		
		return {
			"all":containers,
			"current":containers[index],
			"length":containers.length,
			"index":index,
			"active":active,
			"_next": nextContainer,
			"_prev": prevContainer,
			"_last": lastContainer
		}
	}
	
	
	this.getItems = function getItems(){//pega os itens do container ativo
		var selected=null;
		var itens=$D.getElementsByClassName(classListItem,"li",this.getContainers().current);
		var last=itens.length-1;
		for (var item=0;item<itens.length;item++) {
			if($D.hasClass(itens[item],selectedItemClass)){
				selected = item;
				break;
			}	
		}
		return {
			"itens": itens,
			"length":itens.length,
			"last":last,
			"selected": selected
		};
	}
	//Setters
	this.setContainer = function setContainer(current,old){
		var _containers = this.getContainers();
		var _itens = this.getItems();
		
		$D.addClass(_containers.all[current],selectedContainerClass);
		$D.removeClass(_containers.all[old],selectedContainerClass);
		
		$D.removeClass(_itens.itens[_itens.selected],selectedItemClass);
		//$D.addClass(_itens.itens[0],selectedItemClass);
		this.select(0, 0)
		
		this.suggestScroll("start");
	}
	
	this.moveNext = function setNextContainer(){
		this.setContainer(this.getContainers()._next,this.getContainers().index)
	}
	
	this.movePrev = function setPrevContainer(){
		this.setContainer(this.getContainers()._prev,this.getContainers().index)
	}
	
	
	//Methods
	this.select = function select(container,i){
		$D.addClass(this.getItems().itens[i],selectedItemClass);
	}
	
	this.unselect = function unselect(container,i){
		$D.removeClass(this.getItems().itens[i],selectedItemClass);
	}
	
	this.moveDown = function moveDown(){
		var current = this.getItems().selected;
		var old = null;
		var _containers = this.getContainers();
		var isEmpresa = $D.hasClass(_containers.current, "empresas");

		if (current != null && (current < this.getItems().last)) {
			if (!isEmpresa && (current >= 2) && (current <= this.getItems().last - 2)) 
				this.suggestScroll("+");
			
			old = current;
			current++;
			
		}
		else {
			if (!isEmpresa) {
				this.suggestScroll("start");
				old = current;
				current = 0;
			}
		}
		
		if(isEmpresa && this.getItems().selected!=0 && (this.getItems().selected+1)%4==0){
				el=$D.getElementsByClassName("right","div",_containers.current)[0];
				if (el != undefined) 
					sliderRight(el)
				
		}
		
		if (!_containers.active) this.setContainer(0)
		
		if (old != null) this.unselect(_containers.current, old)
		
		this.select(_containers.current, current)
		
		this.logAction("moveDown")
	
	}
	
	this.moveUp = function moveUp(){
		var current=this.getItems().selected;
		var _containers = this.getContainers();
		var old=null;
		var isEmpresa = $D.hasClass(_containers.current, "empresas");
		
		if (current!=null && current > 0) {
			if (!isEmpresa && (current >= 2) && (current <= this.getItems().last - 2))
				this.suggestScroll("-");
			
			old=current;
			current--;
		}else{
			if (!isEmpresa) {
				this.suggestScroll("end");
				old = current;
				current = this.getItems().last;
			}
		}

		if(isEmpresa && this.getItems().selected!=0 && (this.getItems().selected-4)%4==0){
				el=$D.getElementsByClassName("left","div",_containers.current)[0];
				if (el != undefined) 
					sliderLeft(el)
				
		}

		if(!_containers.active)this.setContainer(0)

		if(old!=null)this.unselect(_containers.current,old)
		
		this.select(_containers.current,current)
		
		this.logAction("moveUp")
	}
	
	this.toogleSliderUp = function toogleSliderUp(key){
		var sliders = $D.getElementsByClassName("slider", "div", this.getContainers().current)[0].getElementsByTagName("div")[0];
		var _key=(key == "off")?["up","up-disable"]:["up-disable","up"]
		$D.replaceClass(sliders, _key[0], _key[1])
	}
	
	this.toogleSliderDown = function toogleSliderDown(key){
		var sliders = $D.getElementsByClassName("slider", "div", this.getContainers().current)[0].getElementsByTagName("div")[1];
		var _key=(key == "off")?["down","down-disable"]:["down-disable","down"]
		$D.replaceClass(sliders, _key[0], _key[1])
	}
	
	this.suggestScroll = function suggestScroll(h) {
		var _containers = this.getContainers();
		var container = $D.getElementsByClassName("container","div", _containers.current);
		var itemScrollSize=15;	
		var isEmpresa = $D.hasClass(_containers.current, "empresas");	
		switch (h){
			case "start":
				
				//empresas
				if (isEmpresa) {
					var cols = $D.getElementsByClassName("content", "ul", _containers.current)
					var arrow = $D.getElementsByClassName("left", "div", _containers.current)[0];
					while($D.hasClass(cols[0], "off"))sliderLeft(arrow)
				}
				
				//outros
				else {
					this.toogleSliderUp("off");
					this.toogleSliderDown();
					if(container.length>0) container[0].scrollTop = 0;
				}
				
				break;

			case "end":
				this.toogleSliderDown("off");
				this.toogleSliderUp();
				container[0].scrollTop = container[0].scrollHeight;
				break;
				
			case "-":
				this.toogleSliderUp();
				this.toogleSliderDown();
				container[0].scrollTop -= itemScrollSize;
				break;

			case "+":
				this.toogleSliderUp();
				this.toogleSliderDown();
				container[0].scrollTop += itemScrollSize;
				break;

			case ">":

			case "<":

			default:
				container[0].scrollTop += itemScrollSize;
				break;
			}
			
	}
	
	this.doAction = function doAction(){
		_suggestSelectedItem = this.getItems().itens[this.getItems().selected];
		var action = _suggestSelectedItem.getAttribute("onclick")
		
		if (document.all) {//TODO: rmv gf pls 
			action = String(action).replace("function anonymous()", "")
			action = action.replace("{", "").replace("}", "")
			action = action.replace("\n", "").replace("\n", "")
		}
		
		this.logAction("addSuggest")
		
		var _doAction = new Function(action.replace("event","'select'"));
		
		_doAction();
		
	}
}
var _suggestSelectedItem;

