var EMPREGOCERTO = window.EMPREGOCERTO || {};
EMPREGOCERTO.NEWS = new Object();

// Título original, para correção de hash no title em IE 6 e 7
EMPREGOCERTO.originalTitle = document.title;

EMPREGOCERTO.scrollAnimatedTop = function(){
	if ($('#footerLinks a.goTop').size() > 0){
		$('#footerLinks a.goTop').click(function(e){
			e.preventDefault();e.stopPropagation();
			$('html,body').animate({scrollTop:0},500);
		});
	}
};

EMPREGOCERTO.openNewWindow = function(){
	$("#footerLinks a[rel='external'],"+
	  "#recruiterAccount dd a[rel='external'],"+
	  "#homewrapper #jobNews dd a,"+
	  "#homewrapper #jobNews p.jobChannelLink a,"+
      ".applyToJob a.elancersLink,"+
	  "#jobNews #jobNewsContainer dl dd a,"+
      "a#printCv").click( function() {
        window.open( $(this).attr('href') , $(this).attr('id'));
        return false;
    });
};

EMPREGOCERTO.closeWindow = function(){
	$("a.close").click( function() {
        window.close();
        return false;
    });
};

EMPREGOCERTO.getCookie = function(c_name) {
	if (document.cookie.length>0) {
		c_start=document.cookie.indexOf(c_name + "=");
		if (c_start!=-1) { 
			c_start=c_start + c_name.length+1; 
			c_end=document.cookie.indexOf(";",c_start);
			if (c_end==-1) c_end=document.cookie.length;
			return unescape(document.cookie.substring(c_start,c_end));
		} 
	}
	return "";
};



EMPREGOCERTO.NEWS.openChannel = function(){
	$('#jobNewsExternalContent').click(function(){window.open('http://empregos.uol.com.br/');});
};

//Start:Inicializador
EMPREGOCERTO.init = function(){
	EMPREGOCERTO.scrollAnimatedTop();
	EMPREGOCERTO.openNewWindow();
    EMPREGOCERTO.closeWindow();
	EMPREGOCERTO.NEWS.openChannel();

    $("a#planos").click(function(){
		var width = 802,
			height = 470,
			url = this.href + '?TB_iframe=true&amp;height='+height+'&amp;width='+width+'&amp;modal=false&amp;KeepThis=true',
			caption = 'Planos de assinatura';
			
		tb_show(caption, url, false);
		return false;
    });

	
	// Correção do title para IE 6 e 7
	document.title = EMPREGOCERTO.originalTitle;
};

$(EMPREGOCERTO.init);
//End:Inicializador

function zebraTable(){
	$('table tbody tr:even').addClass('even');
	$('table tbody tr:odd').addClass('odd');
}

function searchAgain(){
	$('.resultPostalCode button').click(function(){ 
		window.location.href='/cep/index.html?skin=cep-empregocerto';
	});
}

// Extensões do objeto jQuery
$.fn.popup = function(name, options) {
	this.each(function(){
		var optionStack = [],
			option,
			optionsString = null,
			$this = $(this),
			url = $this.attr('href');
			
		if (options) {
			for (option in options) {
				optionStack.push(option + '=' + options[option]);
			}
			optionsString = optionStack.join(',');
		}
		
		$this.click(function(){
			if (optionsString) {
				window.open(url, name, optionsString);
			}
			else {
				window.open(url, name);
			}
			return false;
		});
	});
};

(function($){
/**
 * SimpleSlide
 * Monta um grupo de acionadores de slideUp e slideDown de conteúdo
 */
window.SimpleSlide = function(jTogglers, jTargets, startHidden, velocity) {
    var objRef = this;
    
    this.togglers = jTogglers;
    this.targets = jTargets;
    this.visible = !Boolean(startHidden);
    this.velocity = velocity ? velocity : 'fast';
    
    this.listeners = new Array();
    
    this.listener = function(listener) {
        objRef.listeners.push(listener);
        
        return objRef;
    };
    
    this.show = function() {
        if (!objRef.visible) objRef.targets.slideDown(objRef.velocity);
        
        objRef.visible = true;
        
        for (var i = 0; i < objRef.listeners.length; i++) {
            objRef.listeners[i](objRef.visible);
        }
        
        return objRef;
    };
    
    this.hide = function() {
        if (objRef.visible) objRef.targets.slideUp(objRef.velocity);
        
        objRef.visible = false;
        
        for (var i = 0; i < objRef.listeners.length; i++) {
            objRef.listeners[i](objRef.visible);
        }
        
        return objRef;
    };
    
    this.toggle = function() {
        if (objRef.visible) objRef.hide();
        else objRef.show();
    };
    
    this.init = function() {
        objRef.togglers.click(function(event) {
            event.preventDefault(); event.stopPropagation();
            objRef.toggle();
        });
    };
    
    this.init();
};



/**
 * TabbedGroup
 * Monta um grupo de abas que exibem/ocultam conteúdo
 */
window.TabbedGroup = function() {
    var objRef = this;
    
    this.listeners = new Array();
    this.groups = new Array();
    this.cssForClickedTab = 'currentTab';
    this.cssForBackgroundTab = 'backgroundTab';
    
    this.add = function(group) {
        var nextIndex = objRef.groups.length;
        group[0].click(function(event){
            if ($(this).is('a')) event.preventDefault(); event.stopPropagation();
            objRef.show(nextIndex);
        });
        objRef.groups.push(group);
        
        return objRef;
    };
    
    if (arguments.length > 0) {
        for (var i = 0; i < arguments.length; i++) {
            objRef.add(arguments[i]);
        }
    }
    
    this.listener = function(listener) {
        objRef.listeners.push(listener);
        
        return objRef;
    };
    
    this.show = function(groupIndex) {
        for (var i = 0; i < objRef.groups.length; i++) {
            var group = objRef.groups[i];
            var tab = group[0];
            var content = group[1];
            if (i == groupIndex) {
                if (!tab.hasClass(objRef.cssForClickedTab)) {
                    tab.addClass(objRef.cssForClickedTab);
                }
                if (tab.hasClass(objRef.cssForBackgroundTab)) {
                    tab.removeClass(objRef.cssForBackgroundTab);
                }
                content.show();
                objRef.notify(i, true);
            }
            else {
                if (tab.hasClass(objRef.cssForClickedTab)) {
                    tab.removeClass(objRef.cssForClickedTab);
                }
                if (!tab.hasClass(objRef.cssForBackgroundTab)) {
                    tab.addClass(objRef.cssForBackgroundTab);
                }
                content.hide();
                objRef.notify(i, false);
            }
        }
    };
    
    this.notify = function(groupIndex, isBeingShown) {
        for (var i = 0; i < objRef.listeners.length; i++) {
            objRef.listeners[i](groupIndex, isBeingShown);
        }
    };
};



/*
Validação de busca rápida e avançada
*/

window.SearchValidationBuilder = function() {
    var objRef = this;
    
    
    
    // Método privado a ser usado pelo builder para execução da validação de busca
    var validator = function(quickSearchArray, advancedSearchArray) {
        var objRef = this,
			searchArray = quickSearchArray;
        
        // Configura o array a usar para validar a busca
        this.setQuick = function() {
            searchArray = quickSearchArray;
        };
        this.setAdvanced = function() {
            searchArray = advancedSearchArray;
        };
        
        // Valida os campos de acordo com o array-membro atual
        this.isValid = function() {
            var valid = false;
            for (var i = 0; i < searchArray.length; i++) {
                if ($(searchArray[i]).val()) {
                    valid = true;
                }
            }
            return valid;
        };
    };
    
    
    
    // Classe de validação de currículo
    this.createJob =  function() {
        
        // Campos gerais de busca de currículo
        var keywords = '#jobKeywords';
        var workingAreas = '#jobWorkingAreaQuick';
        var federationUnit = '#jobFederationUnit';
        var city = '#jobCity';
        var companySize = '#jobCompanySize';
        var companyType = '#jobCompanyType';
        var bActivities = 'li.searchJobBusinessActivities :checked';
        var hLevels = 'li.jobHierarchyLevels :checked';
        
        // Arrays a usar em caso de busca rápida ou avançada
        var quickSearchArray = [keywords, workingAreas, federationUnit];
        var advancedSearchArray = [keywords, workingAreas, federationUnit, city, companySize, companyType, bActivities, hLevels];
        
        return new validator(quickSearchArray, advancedSearchArray);
    },



    // Classe de validação de vaga
    this.createCurriculum = function() {
        
        // Campos gerais de busca de currículo
        var keywords = '#cvsKeywords';
        var workingAreas = '#cvsWorkingAreaQuick';
        var federationUnit = '#cvsFederationUnit';
        var city = '#cvsCity';
        var salaryRange = '#cvsSalaryRange';
        var hLevels = 'li.searchCvsAdvRight :checked';
        
        // Arrays a usar em caso de busca rápida ou avançada
        var quickSearchArray = [keywords, workingAreas, federationUnit];
        var advancedSearchArray = [keywords, workingAreas, federationUnit, city, salaryRange, hLevels];
        
        return new validator(quickSearchArray, advancedSearchArray);
    }
};




/**
 * ListBreak
 * "Classe abstrata" para quebra de listas em múltiplas colunas.
 */

window.ListBreak = {
    
    // Método para obter a matriz dos índices
    getMatrix: function(totalItems, columns) {
        var colLength = parseInt(totalItems / columns);
        var remaining = totalItems % columns;
        
        // Cria o esqueleto da matriz
        var matrix = new Array(columns);
        for (var j = 0; j < columns; j++) {
            matrix[j] = new Array(colLength);
            
            // Adiciona mais uma linha a esta coluna, se necessário, para distribuir adequadamente os elementos. A idéia é ir colocando as colunas maiores à esquerda, mas evitar que uma coluna tenha mais de um elemento que outra.
            if (remaining > 0) {
                matrix[j].push(undefined);
                remaining--;
            }
        }
        
        // Preenche a matriz com os índices
        var index = 0;
        for (j = 0; j < columns; j++) {
            for (var i = 0; i < matrix[j].length; i++) {
                matrix[j][i] = index++;
            }
        }
        
        return matrix;
    },
    
    // Método para quebrar a lista como múltiplas colunas
    strikeThem: function(columns, list, classToRemove) {
        var isOrdered = list.is('ol');
        var origStart = list.attr('start') ? parseInt(list.attr('start')) : 1;
        
        if (classToRemove) {
            list.removeClass(classToRemove);
        }
        
        var origClassAttr = list.attr('class');
        
        var items = list.find('li');
        var newColumns = new Array();
        var matrix = ListBreak.getMatrix(items.length, columns);
        
        for (var j = 0; j < columns; j++) {
            var firstIndex = matrix[j][0];
            var lastIndex = matrix[j][matrix[j].length-1];
            
            var columnContent = items.slice(firstIndex,lastIndex+1);
            
            newColumns.push(columnContent);
        }
        
        var listParent = list.parent();
        list.remove();
        
        for (var j = 0; j < columns; j++) {
            listParent.append(newColumns[j]);
        }
        
        for (var j = 0; j < columns; j++) {
            var firstIndex = matrix[j][0];
            var lastIndex = matrix[j][matrix[j].length-1];
            var startsWith = firstIndex + origStart;
            
            var newItems = listParent.find('li').slice(firstIndex,lastIndex+1);
            
            isOrdered ? newItems.wrapAll('<ol start="'+startsWith+'" />') : newItems.wrapAll('<ul />');
            
            newItems.parent().attr('class', origClassAttr);
        }
        
        
    },
    
    // Método para formatar conteúdo como multicoluna
    make: function(columns, lists, classToRemove) {
        
        lists.each(function() {
            var list = $(this);
            if (list.is('ul') || list.is('ol'))
                ListBreak.strikeThem(columns, list, classToRemove);
        });
    }
};

})(jQuery);
