
var Search = function Search() {
	var _stage = Stage.getInstance();
	var _self = this;

	var _lastSuggest = false;
	var _activateButNotSuggestCalled = true;

	var _setSlider = function setSlider(divs){
		_self.getElmsSlider = divs;
		setTimeout(function(){
			for (var i=0; i<divs.length; i++) {
				if($D.get(divs[i])){ Slider.newInstance(divs[i]); }
			}
		}, 25);
	};
	
	var _currentSuggestCol = 0;
	var _suggestCols = ['contentRubro', 'contentNombre', 'contentPalabra'];
	var _switchColumns = function switchColumns(direction) {
		var lastColumn = _suggestCols[_currentSuggestCol];
		_currentSuggestCol = Math.min(Math.max(_currentSuggestCol+direction, 0), 2);
		var column = _suggestCols[_currentSuggestCol];
		
		Slider.markElm(lastColumn, 'last');
		$Y.Dom.addClass(column, 'columnSelected');

		if(Slider.getSelectedIndex(column) >= 0){
			Slider.markElm(column, 'new');
		}else{
			Slider.stepForward(column);	
		}
	};
	
	var _removeEmptyInput = function _removeEmptyInput() {
		var formElms = $D.get('searchForm').getElementsByTagName('INPUT');
		for(var i = 0; i < formElms.length; i++) {
			if((formElms[i].type == 'text' || formElms[i].type == 'hidden') && formElms[i].value == '') {
				formElms[i].parentNode.removeChild(formElms[i]);
				i--;
			}
		}
	};
	
	var _setEventsSuggest = function setEventsSuggest(suggestObj){
		var toggleSuggest = function(f){
			if(f !== false){
					_stage.dataManager.toggleSuggest();
					_toogleSuggest('disable');
			}

			if(_stage.dataManager.getSuggest()){
				$D.removeClass('turnOffSuggest','active');
				$D.addClass('turnOnSuggest','active');
				
				$E.removeListener('turnOnSuggest','click', toggleSuggest);
				$E.addListener('turnOffSuggest','click', toggleSuggest);


				if(f !== false){
					_activateButNotSuggestCalled = false;
				}
			}else{


				$D.removeClass('turnOnSuggest','active');
				$D.addClass('turnOffSuggest','active');
				
				$E.addListener('turnOnSuggest','click', toggleSuggest);
				$E.removeListener('turnOffSuggest','click', toggleSuggest);
			}
		};
		toggleSuggest(false);
	};

		
	var _selectedItem = function(list){
		var selIndex = Slider.getSelectedIndex(list);
		if(selIndex > -1){
			var selectedLi = $D.get(list).getElementsByTagName('LI')[selIndex];
			var relMarket = selectedLi.getAttribute('rel');
			var idMarket = relMarket.split(':')[0];
			var descMarket = relMarket.split(':')[1];
			selectedLi = null;
			return {id:idMarket, desc:descMarket};
		}else{
			$E.on('locality','focus', Stage.changeValueInput,{label: 'labelLocality'});
			return {id:0, desc:''};
		}
	};

	var _initSuggestKeyword = function _init() {
	
		var suggestKeyword = new Suggest('keyword', 'suggest');
		
		/* Up-Down */
		suggestKeyword.on('up', function(){
			var column = _suggestCols[_currentSuggestCol];
			var selIndex = Slider.getSelectedIndex(column);
			var k =  Slider.stepBackward(column);
			if(!k){ k = $D.get('keyword').getAttribute('_value'); }
			$D.get('keyword').value = k;
		});
		
		suggestKeyword.on('down', function(){
			var keywordEl = $D.get('keyword');
			var column = _suggestCols[_currentSuggestCol];
			var k =  Slider.stepForward(column);
			if(typeof k !== 'undefined'){
				if(!keywordEl.getAttribute('_value')){
					keywordEl.setAttribute('_value', keywordEl.value);
				}
				$D.get('keyword').value = k;
			}
			keywordEl = null;
		});
		
		/* Left-Right */
		suggestKeyword.on('left', function(){ _switchColumns(-1); });
		suggestKeyword.on('right', function(){ _switchColumns(1); });
		
		/* Suggest */
		suggestKeyword.on('suggest', function(){
			var k = $D.get("keyword").value;
			$D.replaceClass('suggest', _getSuggestActiveClass(), 'keyword');
			var seed = Stage.nextSeed();
			var url = 'suggest.do?seed=' + seed + '&keyword=' + escape(k);
			
			var fctn = function(){
				$D.replaceClass('suggestContent','off','on');
				$D.replaceClass('suggest','close','open');
				_setSlider(['contentRubro','contentNombre','contentPalabra']);
				_setEventsSuggest();
			}
			
			var req = new Request();
			req.getContent(url, 'suggestContent', fctn);
			
		});

		suggestKeyword.setEnabled(function(){ return _stage.dataManager.getSuggest(); });

		/* Open-Close */
		suggestKeyword.on('close', function(){
			if(!$D.hasClass('suggest','help')) {
				$D.replaceClass('suggest','open','close');
			}
		});
		suggestKeyword.bind('locality', 'focus', 'close');
	
		/* Submit */

		var _keywordSubmit = function () {
			var column = _suggestCols[_currentSuggestCol];
			var selIndex = Slider.getSelectedIndex(column);
			$D.get('seed').value = Stage.nextSeed();

			if(selIndex < 0){
				_removeEmptyInput();
				$D.get('searchForm').submit();
			}else{
				var selectedLi = $D.get(column).getElementsByTagName('LI')[selIndex];
				var anchor = selectedLi.getElementsByTagName('A')[0];
				window.location.href = anchor.href;
				anchor = null;
			}
		};

		suggestKeyword.on('submit', _keywordSubmit);

		suggestKeyword.bind('searchForm', 'submit', 'submit', function(){
			$D.get('seed').value = Stage.nextSeed();
		});

		$E.on('keyword', 'blur', function() {
			if(this.value != '') {
				_lastSuggest = suggestKeyword;
			}
			
		});
		
		Gonow.stage.suggestKeyword = suggestKeyword;
		
	};
	
	var _initSuggestLocality = function _init() {
	
		var suggestLocality = new Suggest('locality', 'suggest');
		
		/* Suggest */
		suggestLocality.on('suggest', function(){
			$D.replaceClass('suggest', _getSuggestActiveClass(), 'locality');
			var locality = $D.get("locality");
			var k = locality.value;
			var url = 'suggestLocation.do?keyword=' + escape(k);
			if (locality.orderBy) {
				url += "&orderBy=" + locality.orderBy;
			}
			
			var fctn = function(){
				_setEventsSuggest();
				$D.removeClass('suggest','close');
				$D.addClass('suggest','open');
				$D.replaceClass('suggestContent','off','on');
				if($D.get('contentRubro')){ Slider.newInstance('contentRubro'); }
				$E.on('suggestRubro', 'click', _localitySubmit);
	
				// Bind order events
				suggestLocality.bind('titleLocalidad', 'click', 'suggest', function() {
					_toggleOrder($D.get('locality'), 'city');
					return true;
				});
				suggestLocality.bind('titleProvincia', 'click', 'suggest', function() {
					_toggleOrder($D.get('locality'), 'state');
					return true;
				});
			}
			
			var req = new Request();
			req.getContent(url, 'suggestContent', fctn);
		});
		
		/* Up-Down */
		suggestLocality.on('down', function(){
			var column = 'contentRubro';
			var localityEl = $D.get('locality');
			var k =  Slider.stepForward(column);
			var selItem = _selectedItem(column);
			if(typeof k !== 'undefined'){
				if(!localityEl.getAttribute('_value')){
					localityEl.setAttribute('_value', localityEl.value);
				}
				$D.get('locality').value = selItem.desc;
				_setLocalityTooltipValue(selItem.desc);
			}
			locality = null;
		});

		suggestLocality.on('up', function(){
			var column = 'contentRubro';
			var k =  Slider.stepBackward(column);
			var selItem = _selectedItem(column);
			if(!k){ k = $D.get('locality').getAttribute('_value'); }
			$D.get('locality').value = selItem.desc;
				_setLocalityTooltipValue(selItem.desc);
		});

		suggestLocality.setEnabled(function(){ return _stage.dataManager.getSuggest(); });

		/* Open-Close */
		suggestLocality.on('close', function(){
			if(!$D.hasClass('suggest','help')) {
				$D.replaceClass('suggest','open','close');
			}
		});
		suggestLocality.bind('keyword', 'focus', 'close');

		var _localitySubmit = function() {
			var column = 'contentRubro';
			var selIndex = Slider.getSelectedIndex(column);
			if(selIndex >= 0){
				var selItem = _selectedItem(column);
				$D.get('locality').value = selItem.desc;
				_setLocalityTooltipValue(selItem.desc);
				
				var stage = Stage.getInstance();
				var dm = stage.dataManager;
				
				dm.setMarket(selItem.id);
				dm.setMarketDesc(selItem.desc);
				$D.replaceClass('suggest','open','close');
			}
		};

		$E.on('locality', 'blur', function() {
			if(this.value != '') {
				var stage = Stage.getInstance();
				var dm = stage.dataManager;
				
				// clear locality if necessary
				var localityValue = $D.get('locality').value;
				if(YAHOO.lang.trim(localityValue).length == 0) {
					// clear locality
					dm.clearMarket();
					dm.setMarketDesc('');
					_initLocalityTooltip();
				} else if(YAHOO.lang.trim(localityValue) != YAHOO.lang.trim(dm.getMarketDesc())) {
					// search by market description
					dm.clearMarket();
					dm.setMarketDesc(YAHOO.lang.trim(localityValue));
					_initLocalityTooltip();
				}
				
				_lastSuggest = suggestLocality;
			}
		});

		/* Submit */
		suggestLocality.on('submit', _localitySubmit);
		Gonow.stage.suggestLocality = suggestLocality;

		_initLocalityTooltip();

	};

	var _initLocalityTooltip = function() {
		var container = $D.getAncestorByClassName('searchForm','rightBox');
		var tip = document.createElement('DIV');
		var htm = [];
		htm.push('<div class="tooltipContainer">');
		htm.push('	<div class="tooltipMiddle">');
		htm.push('		<div id="localityTooltipCtd"><!-- --></div>');
		htm.push('	</div>');
		htm.push('	<div class="tooltipleft"><!-- --></div>');
		htm.push('	<div class="tooltipRight"><!-- --></div>');
		if(YAHOO.env.ua.ie == 6) {
			htm.push('	<div id="localityTooltipIE6Ctd"><!-- --></div>');
		}
		htm.push('</div>');
	
		//container.appendChild(tip);
		document.body.appendChild(tip);

		tip.innerHTML = htm.join('');
		tip.id = 'localityTooltip';
		$D.addClass(tip, 'off');

		var localityOver = function() {
			if($D.get('locality').value !== '') {
				$D.replaceClass('localityTooltip','off','on');
			}	
		};

		$E.on('locality', 'mouseover', localityOver);
		$E.on('localityTooltip', 'mouseover', localityOver); 

		$E.on(['locality', 'localityTooltip'], 'mouseout', function() {
			$D.replaceClass('localityTooltip','on','off');
		});

		container = null; tip = null;
	};

	var _setLocalityTooltipValue = function(vl) {
		$D.get('localityTooltipCtd').innerHTML = vl;
		if(YAHOO.env.ua.ie == 6) {
			$D.get('localityTooltipIE6Ctd').innerHTML = vl;
		}
	};

	var _callActiveSuggest = function() {
		if(_lastSuggest && _stage.dataManager.getSuggest()) {
			_lastSuggest.callSuggest();
		}
	};
	
	var _showDefaultContent = function() {

		var msg = 'No hay sugerencias, empiece a digitar su consulta';
		if(!_stage.dataManager.getSuggest()){
			msg = 'Las sugerencias de búsqueda están desactivadas.';
		}

		var htm = [''];
		htm.push('<div class="shaddow searchSprite"><!-- --></div>');
		htm.push('<p class="switchSuggest" id="switchSuggest">');
		htm.push('<a id="turnOnSuggest" href="#" class="active">on</a> | <a id="turnOffSuggest" href="#">off</a></p>');
		htm.push('<p class="desc">'+msg+'</p>');
		$D.get('suggestContent').innerHTML = htm.join('');
		_setEventsSuggest();


		$D.replaceClass('suggestHelp','on','off');
	};

	var _getSuggestActiveClass = function() {
		var classesRE = new RegExp('(keyword|locality|help)');
		var className = $D.get('suggest').className;
		var result = classesRE.exec(className);
		return result != null ? result[1] : '';
	};
	
	var _toogleSuggest = function(action) {
		if(action == 'disable') {
			_showDefaultContent();
			$D.removeClass('suggest', _getSuggestActiveClass());
		}

		if($D.hasClass('suggest', 'open')) {
			$D.replaceClass('suggest', 'open', 'close');
		} else if($D.hasClass('suggest', 'close')) {
			if(!(new RegExp('keyword|locality|help')).test($D.get('suggest').className)) {

				if(!_activateButNotSuggestCalled && _lastSuggest) {
					_callActiveSuggest();
					_activateButNotSuggestCalled = true;
				} else {
					$D.replaceClass('suggest', 'close', 'open');
					_showDefaultContent();
				}
			} else {
				$D.replaceClass('suggest', 'close', 'open');
			}
		}
	};

	var _toggleOrder = function(el, orderFieldName) {
		if(el.orderBy && el.orderBy.indexOf(orderFieldName) != -1) {
			if(el.orderBy == (orderFieldName + '_asc')) {
				el.orderBy = orderFieldName + '_desc';
			} else {
				el.orderBy = orderFieldName + '_asc';
			}
		} else if(!el.orderBy) {
			el.orderBy = orderFieldName + '_desc';
		} else {
			el.orderBy = orderFieldName + '_asc';
		}
	}

	var _showHelpContent = function showHelpContent() {
		var request = new Request();
		request.getContent('help.jsp', 'helpContent');
		$D.replaceClass('suggest', _getSuggestActiveClass(), 'help');
		$D.replaceClass('suggestContent','on','off');
		$D.replaceClass('suggestHelp','off','on');
		setTimeout(function() { $D.replaceClass('suggest', 'close', 'open') }, 300);
		return false;
	};

	var _verifyEmptySearch = function() {
		var keyword = YAHOO.lang.trim($D.get('keyword').value);
		if(keyword == '') {
			alert('Informe el texto de la búsqueda.');
			return false;
		}
		return true;
	};


	var _controlLabels = function() {
		$E.on('keyword','focus', Stage.changeValueInput,{label: 'labelKeyword'});

		if ($D.get('keyword').value === '') {
			$D.replaceClass('labelKeyword','off','onInline');
		} else {
			$D.replaceClass('labelKeyword','onInline','off');
		}
	
		if ($D.get('locality').value === '') {
			$D.replaceClass('labelLocality','off','onInline');
			$E.on('locality','focus', Stage.changeValueInput,{label: 'labelLocality'});
		} else {
			$D.replaceClass('labelLocality','onInline','off');
			// para habilitar a edição da localidade e consequentemente sua remoção
			//$E.on('locality','focus', Stage.changeValueInput,{clearValue: true});
		}
	};

	var _beforeSubmitSearch = function() {
		var stage = Stage.getInstance();
		var dm = stage.dataManager;
		
		// validate search
		var valid = _verifyEmptySearch();
		if(!valid) {
			return false;
		}

		// clear locality if necessary
		var localityValue = $D.get('locality').value;
		if(YAHOO.lang.trim(localityValue).length == 0) {
			// clear locality
			dm.clearMarket();
			dm.setMarketDesc('');
		} else if(YAHOO.lang.trim(localityValue) != YAHOO.lang.trim(dm.getMarketDesc())) {
			// search by market description
			dm.clearMarket();
			dm.setMarketDesc(YAHOO.lang.trim(localityValue));
		}
		return true;
	}

	var _init = function(){
		var stage = Stage.getInstance();
		var dm = stage.dataManager;

		if(dm.getMarketDesc()){
			$D.get('locality').value = dm.getMarketDesc(); 
			_setLocalityTooltipValue(dm.getMarketDesc()); 
		}

		$E.on('locality', 'keyup', function(){
			if(dm.getMarketDesc()){
				_setLocalityTooltipValue($D.get('locality').value); 
			}		
		});

		_controlLabels();

		$E.on('btHelp','click', _showHelpContent);
		$E.on('btOpenSuggest', 'click', _toogleSuggest);
		$D.get('searchForm').onsubmit = _beforeSubmitSearch;
	};

	_initSuggestKeyword.call();
	_initSuggestLocality.call();
	_init.call();
};

