window.ec = window.ec || {};
ec.topo = ec.topo || {};

$(function() {
	/* hack para IE */
	$('#topContainer #topSearchAbas').css('position','absolute');

	/* controle de busca avançada - vagas */
	$('#advSearchActionVagas').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		if ($('#searchVagasContainer.opened').length == 0) {
			$('#searchVagasContainer').addClass('opened');
			$('#searchVagasAvancadoContainer').addClass('opened');
		}
		$('#searchVagasAvancado').slideToggle('fast',function() {
			if ($('#searchVagasAvancado:visible').length == 0) {
				$('#advJobSearchTitle').hide();
				$('#searchVagasContainer').removeClass('opened');
				$('#searchVagasAvancadoContainer').removeClass('opened');
			} else {
				$('#advJobSearchTitle').show();
				$('#jobCity option:gt(0)').remove();
				var fedUnit = $('#jobFederationUnit option:selected').val();
				if (fedUnit != '') {
					$('#jobCity').find('option:first').text('Carregando...');
					ec.topo.loadCities(fedUnit,function(data) {
						ec.topo.parseCitiesList(data,$('#jobCity'));
					});
				}
			}
		});
	});

	/* controle de busca avançada - cvs */
	$('#advSearchActionCvs').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		if ($('#searchCvsContainer.opened').length == 0) {
			$('#searchCvsContainer').addClass('opened');
			$('#searchCvsAvancadoContainer').addClass('opened');
		}
		$('#searchCvsAvancado').slideToggle('fast',function() {
			if ($('#searchCvsAvancado:visible').length == 0) {
				$('#advCvsSearchTitle').hide();
				$('#searchCvsContainer').removeClass('opened');
				$('#searchCvsAvancadoContainer').removeClass('opened');
			} else {
				$('#advCvsSearchTitle').show();
				$('#cvsCity option:gt(0)').remove();
				var fedUnit = $('#cvsFederationUnit option:selected').val();
				if (fedUnit != '') {
					$('#cvsCity').find('option:first').text('Carregando...');
					ec.topo.loadCities(fedUnit,function(data) {
						ec.topo.parseCitiesList(data,$('#cvsCity'));
					});
				}
			}
		});
	});
	
	/* clique na aba de busca por vagas */
	$('.lnkVagas').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		if ($('#topSearch.selVagas').length == 0) {
			$('#topSearch').removeClass('selCvs').addClass('selVagas');
		}
		
		// (tempo escasso para testes)
		$('#jobKeywords').focus()[0].value += '';
	});
	
	/* clique na aba de busca por cvs */
	$('.lnkCvs').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		if ($('#topSearch.selCvs').length == 0) {
			$('#topSearch').removeClass('selVagas').addClass('selCvs');
		}
		
		// (tempo escasso para testes)
		$('#cvsKeywords').focus()[0].value += '';
	});

	//verifica qual aba será selecionada
	if($('body.searchCv').size() > 0){
		$('.lnkCvs').click();
	}
	
	/* Cliques no menu superior que possuem subitens */
	$('.withSub .menuItem').click(function(e) {
		e.preventDefault();
		var container = $(this).parent();
		$('#topMenu li.opened').removeClass('opened');
		if (container.find('ul:visible').length > 0) {
			container.find('ul:visible').slideUp('fast');
		} else {
			$('#topMenu ul.submenu:visible').slideUp('fast');
			$(this).parent().find('ul.submenu').slideDown('fast');
			$(this).parent().addClass('opened');
			
			$('body').unbind('mousedown').mousedown(function(e) {
				if (!$(e.target).hasClass('subitemlink')) {
				$('#topMenu li.opened').removeClass('opened').find('ul:visible').slideUp('fast');
				$('body').unbind('mousedown');
				}
			});
		}
	});
	$('.submenu a:not(.subitemlink)').addClass('subitemlink');
	
	/* Eventos de load de cidades */
	$('#jobFederationUnit').unbind('change').change(function(e) {
		e.stopPropagation();
		e.preventDefault();
		$('#jobCity option:gt(0)').remove();
		if ($('#searchVagasAvancadoContainer.opened').length > 0) {
			var fedUnit = $(this).find('option:selected').val();
			if (fedUnit != '') {
				$('#jobCity').find('option:first').text('Carregando...');
				ec.topo.loadCities(fedUnit,function(data) {
					ec.topo.parseCitiesList(data,$('#jobCity'));
				});
			}
			else {
				$('#jobCity').find('option:first').text('Selecione o Estado');
			}
		}
	});
	
	/* Eventos de load de cidades */
	$('#cvsFederationUnit').unbind('change').change(function(e) {
		e.stopPropagation();
		e.preventDefault();
		$('#cvsCity option:gt(0)').remove();
		if ($('#searchCvsAvancadoContainer.opened').length > 0) {
			var fedUnit = $(this).find('option:selected').val();
			if (fedUnit != '') {
				$('#cvsCity').find('option:first').text('Carregando...');
				ec.topo.loadCities(fedUnit,function(data) {
					ec.topo.parseCitiesList(data,$('#cvsCity'));
				});
			}
			else {
				$('#cvsCity').find('option:first').text('Selecione o Estado');
			}
		}
	});
	
	$('#searchVagasAvancado p a').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		ec.topo.clearFields($('#jobOpportunitySearchForm'));
	});
	
	$('#searchCvsAvancado p a').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		ec.topo.clearFields($('#cvsOpportunitySearchForm'));
	});
	
	$('.multipleOptions input:checkbox').click(function() {
		if ($(this).attr('checked') == true) {
			$(this).parent().addClass('selected');
		} else {
			$(this).parent().removeClass('selected');
		}
	});
    
    
    
    /*
    Validação client-side de busca
    */

    // Fechamento de escopo para a busca, para evitar conflitos com outras partes
    (function($){
        // Testa se é uma página de busca
        if ($('form#jobOpportunitySearchForm').length == 0) return;
        
        // Builder para criação de objetos validadores de currículo e de vagas
        var validationBuilder = new SearchValidationBuilder();
        
        // Objetos de validação
        var jobValidator = validationBuilder.createJob(),
			curriculumValidator = validationBuilder.createCurriculum();
        
        // Objetos de busca de vagas
        var jobSearchForm = $('form#jobOpportunitySearchForm'),
			jobQuickSearchContainer = $('#searchVagasContainer'),
			jobAdvancedSearchContainer = $('#searchVagasAvancadoContainer'),
			jobSearchError = $('p.jobError.clientSide');
        
        // Objetos de busca de currículos
        var curriculumSearchForm = $('form#curriculumSearchForm'),
			curriculumQuickSearchContainer = $('#searchCvsContainer'),
			curriculumAdvancedSearchContainer = $('#searchCvsAvancadoContainer'),
			curriculumSearchError = $('p.curriculumError.clientSide');
        
        // Campos possíveis a desabilitar
        var posssibleFields = 'input,textarea,select,button';
        
		// Ignorar validação caso seja busca por todas as áreas de atuação
		function bypassValidation() {
			return $('#jobWorkingAreaQuick :selected').is('.searchInAllAreas');
		}
        
        // Manipulação de evento dos botões de busca
        $('button#jobQuickSearchButton').click(function(event){
            event.preventDefault(); event.stopPropagation();
            var isAdvanced = jobQuickSearchContainer.is('.opened');
            
            if (isAdvanced) jobValidator.setAdvanced();
            else jobValidator.setQuick();
            
            if (jobValidator.isValid() || bypassValidation()) {
                // Antes de executar a busca, desabilita os campos avançados se não for busca avançada
                if (!isAdvanced) {
                    jobAdvancedSearchContainer.find(posssibleFields).attr('disabled', true);
                }
                jobSearchForm.submit();
            }
            else {
                jobSearchError.show();
            }
        });
        $('button#cvsQuickSearchButton').click(function(event){
            event.preventDefault(); event.stopPropagation();
            var isAdvanced = curriculumQuickSearchContainer.is('.opened');
            
            if (isAdvanced) curriculumValidator.setAdvanced();
            else curriculumValidator.setQuick();
            
            if (curriculumValidator.isValid()) {
                // Antes de executar a busca, desabilita os campos avançados se não for busca avançada
                if (!isAdvanced) {
                    curriculumAdvancedSearchContainer.find(posssibleFields).attr('disabled', true);
                }
                curriculumSearchForm.submit();
            }
            else {
                curriculumSearchError.show();
            }
        });
    })(jQuery);
	
	// Foca no campo de palavra-chave da busca relacionada à página
	if (!location.hash){
		$('#topSearch.selVagas #jobKeywords,#topSearch.selCvs #cvsKeywords').each(function(){ $(this).focus()[0].value += ''; });
	}
});

ec.topo.loadCities = function(fedUnit,callback) {
	try {
		if (ec.loadedCities[fedUnit.toString()]) {
			callback.call(null,ec.loadedCities[fedUnit.toString()]);
			return;
		}
	} catch (e) { /*do nothing*/ }
	$.getJSON('/search/ajaxFindCities.html?federationUnit='+fedUnit.toString(),null,function(data) {
		ec.loadedCities = ec.loadedCities || {};
		ec.loadedCities[fedUnit.toString()] = data;
		callback.call(null,ec.loadedCities[fedUnit.toString()]);
	});
	return;
};

ec.topo.parseCitiesList = function(data,jObj) {
	if (typeof data.cities == 'object') {
		var buffer = jObj.html(),
			cityClass = jObj.attr('class'),
			requestedCity = cityClass.slice(cityClass.indexOf('_')+1);
			
		for (var idxCity = 0; idxCity < data.cities.length; idxCity++) {
			var city = data.cities[idxCity],
				selectedAttribute = (requestedCity == city.id) ? 'selected="selected"' : '';
			
			buffer += '<option value="'+city.id+'" '+selectedAttribute+'>'+city.name+'</option>';
		}
		jObj.html(buffer);
		jObj.find('option:first').text('Selecione');
	}
};

ec.topo.clearFields = function(jContainer) {
	jContainer.find('input:text').val('');
	jContainer.find('input:checkbox').attr('checked','');
	jContainer.find("select[name='city'] option:gt(0)").remove();
	jContainer.find('select').each(function() {
		$(this).find('option:eq(0)').attr('selected','selected');
	});
};
