// Array
Array.prototype.indexOf = function(value, start, strict) {
	start = start || 0;
	for (var i=start; i<this.length; i++) {
		var item = this[i];
		if (strict ? item === value : isRegexp(value) ? value.test(item) : isFunction(value) ? value(item) : item == value)
			return i;
	}
	return -1;
}

Array.prototype.contains = function(value,strict) {
	return this.indexOf(value,0,strict) !== -1;
}

Array.prototype.include = Array.prototype.contains;

Array.prototype.count = function(value, strict) {
	var pos, start = 0, count = 0;
	while ((pos = this.indexOf(value, start, strict)) !== -1) { start = pos + 1; count++; }
	return count;
}

Array.prototype.merge = function() {
	var a = [];
	for (var i=0; i<arguments.length; i++)
		for (var j=0; j<arguments[i].length; j++)
			a.push(arguments[i][j]);
	for (var i=0; i<a.length; i++) this.push(a[i]);
	return this
}

Array.prototype.map = function(fn) { return map(this, fn) }

Array.prototype.remove = function(value,all,strict) {
	while (this.contains(value,strict)) {
		this.splice(this.indexOf(value,0,strict),1);
		if (!all) break
	}
	return this;
}

if (!Array.prototype.push) Array.prototype.push = function() {
	for (var i=0; i<arguments.length; i++) this[this.length] = arguments[i];
	return this.length;
}

if (!Array.prototype.splice) Array.prototype.splice = function (s, d) {
	var max = Math.max, min = Math.min, a = [], e, i = max(arguments.length - 2, 0), k = 0, l = this.length, n, v, x;  

	s = s || 0;
	if (s < 0) { s += l; }
	s = max(min(s, l), 0);  
	d = max(min(isNumber(d) ? d : l, l - s), 0);	
	v = i - d;
	n = l + v;
	while (k < d) {
		e = this[s + k];
		if (!isUndefined(e)) { a[k] = e; }
		k += 1;
	}
	x = l - s - d;
	if (v < 0) {
		k = s + i;
		while (x) { this[k] = this[k - v]; k += 1; x -= 1; }
		this.length = n;
	} else if (v > 0) {
		k = 1;
		while (x) { this[n - k] = this[l - k]; k += 1; x -= 1; }
	}
	for (k = 0; k < i; ++k) {
		this[s + k] = arguments[k + 2];
	}
	return a;
}

function __strfn(args, fn) {
	function quote(s) { return '"' + s.replace(/"/g,'\\"') + '"' }
	if (!/\breturn\b/.test(fn)) {
		fn = fn.replace(/;\s*$/, '');
		fn = fn.insert(fn.lastIndexOf(';')+1, ' return ');
	}
	return eval('new Function(' + map(args.split(/\s*,\s*/), quote).join() + ',' + quote(fn) + ')' );
}

function each(list, fn) {
    if (typeof(fn)=='string') return each(list, __strfn('item,idx,list', fn));
    for (var i=0; i < list.length; i++) fn(list[i], i, list);
}

function map(list, fn) {
	if (typeof(fn)=='string') return map(list, __strfn('item,idx,list', fn));
	var result = [];
	fn = fn || function(v) {return v};
	for (var i=0; i < list.length; i++) result.push(fn(list[i], i, list));
	return result;
}

function filter(list, fn) {
	if (typeof(fn)=='string') return filter(list, __strfn('item,idx,list', fn));
	var result = [];
	fn = fn || function(v) {return v};
	map(list, function(item,idx,list) { if (fn(item,idx,list)) result.push(item) } );
	return result;
}

function reduce(list, initial, fn) {
	if (undef(fn)) {
		fn = initial;
		initial = window.undefined; 
	}
	if (typeof(fn)=='string') return reduce(list, initial, __strfn('a,b', fn));
	if (isdef(initial)) list.splice(0,0,initial);
	if (list.length===0) return false;
	if (list.length===1) return list[0];
	var result = list[0];
	var i = 1;
	while(i<list.length) result = fn(result,list[i++]);
	return result;
}

// String
String.prototype.insert = function(idx,value) { return this.slice(0,idx) + value + this.slice(idx) }

// Misc
function isArray(a)	 { return isObject(a) && a.constructor == Array }
function isFunction(a)  { return typeof a == 'function' }
function isNumber(a)	{ return typeof a == 'number' && isFinite(a) }
function isObject(a)	{ return (a && typeof a == 'object') || isFunction(a) }
function isRegexp(a)	{ return a && a.constructor == RegExp }
function isString(a)	{ return typeof a == 'string' }
function isUndefined(a) { return typeof a == 'undefined' }
function isList(o) { return o && isObject(o) && (isArray(o) || o.item) }
function isElement(o, strict) {
	return o && isObject(o) && ((!strict && (o==window || o==document)) || o.nodeType == 1)
}
function undef(v) { return  isUndefined(v) }
function isdef(v) { return !isUndefined(v) }
function list(s, sep) {
	if (!isString(sep) && !isRegexp(sep))
		sep = sep? ',' : /\s*,\s*/;
	return s.split(sep);
}

// DOM
function getElem(el) {
	var ge = (document.getElementById && function(id){return document.getElementById(id)} ) ||
		(document.all && function(id){return document.all[id]} ) ||
		function(){return null};
	return isElement(el)? el : isString(el) ? ge(el) : null;
}

function getElemList(el) {
	if (isElement(el)) return [el];
	else if (isString(el) ) return getElemList(el.split(/\s+/g)); 
	else if (isList(el) ) {
		var r = map(el, getElem);
		return filter(r, isElement).length==r.length? r : null;
	}
	else return null;
}

function filterElementNodes(nodeList, tagName) {
	return filter(nodeList, function(n){
	return n.nodeType==1 && n.nodeName!='!' && 
		(undef(tagName) || tagName == '*' || n.nodeName.toUpperCase()==tagName.toUpperCase())
	})
}

function getAll(tagName, parent) {
	parent = isdef(parent)? getElem(parent) : document;
	if (undef(tagName)) tagName = '*';
	var r = parent.getElementsByTagName(tagName);
	return r.length || tagName != '*'?  map(r) :
		reduce(filterElementNodes(parent.childNodes), [], function(l,c){
			return l.merge([c], getAll(tagName, c))
		})
}

function getElementsByClass(className, tagName, parentNode) {
	var noClassTags = list('#comment,BASE,BASEFONT,HEAD,HTML,META,PARAM,SCRIPT,STYLE,TITLE');
	return filter(getAll(tagName,parentNode),
		function(elem) {
			return !noClassTags.include(elem.nodeName) && hasClass(elem, className) 
		});
}

function hasClass(elem, className) {
	return getElem(elem).className.split(' ').count(className);
}

function remClass(elem, className, all) {
	elem = getElem(elem);
	elem.className = elem.className.split(' ').remove(className,all).join(' ');
}

function addClass(elem, className, allowDuplicates) {
	elem = getElem(elem);
	if (!allowDuplicates && elem.className.split(' ').contains(className)) return;
	elem.className += (elem.className.length?' ':'') + className;
}

function swapClass(e, c) {
	if (hasClass(e,c)) remClass(e,c); else addClass(e,c);
	return !!hasClass(e,c);
}

// Events
var ALLOW_LEGACY_EVENTS = true;

function getEventModel() {
	var d = document;
	return d.addEventListener? 'DOM' : d.attachEvent ? 'IE' : 'legacy';
}

function IE_Event(currentTarget) {
	this.currentTarget   = currentTarget;
	this.preventDefault  = function() { window.event.returnValue  = false }
	this.stopPropagation = function() { window.event.cancelBubble = true }
	this.target  = window.event.srcElement;
	var self = this;
	list('altKey,ctrlKey,shiftKey,clientX,clientY').map(function(p){ self[p] = event[p] });
	return this;
}

function Legacy_Event(currentTarget) {
	this.currentTarget   = currentTarget;
	return this;
}

function addEvent(els, ev, fn, capture) {
	if (!ALLOW_LEGACY_EVENTS && getEventModel()=='legacy') return false;
	if (undef(capture)) capture = true;
	function DOM_addEvent   (el, ev, fn, capture) { el.addEventListener(ev, fn, capture) }
	function legacy_addEvent(el, ev, fn) {
		var evn = 'on'+ev;
		if (!el[evn] || undef(el[evn].handlers)) {
			el[evn] = function() {
				map(el[evn].handlers, function(h){  h( new (el.attachEvent?IE_Event:Legacy_Event)(el) ) });
			}
			el[evn].handlers = [];
		}
		el[evn].handlers.push(fn);
	}
	var addEventFn = getEventModel()=='DOM'? DOM_addEvent : legacy_addEvent;
	map(getElemList(els), function(el) { addEventFn(el, ev, fn, capture) });
}

function addEventDict(els, evDict, capture) {
	for (ev in evDict) addEvent(els, ev, evDict[ev], capture);
}

function addLoadEvent(fn) {
	var w = getEventModel()=="DOM" && !window.addEventListener ? document : window;
		return addEvent(w, 'load', fn, true)
}

// -- Popup
var Popup = {
	_POPUP_FEATURES: '',
	raw: function(url, target, features) {
		if (isUndefined(features)) features = Popup._POPUP_FEATURES
		if (isUndefined(target)) target= '_blank'
		var theWindow = window.open(url, target, features)
		theWindow.focus()
		return theWindow
	},
	'link': function(src, features) {
		return Popup.raw(src.getAttribute('href'), src.getAttribute('rel') || '_blank', features);
	},
	'event': function(e) { 
		Popup.link(e.currentTarget); e.preventDefault() 
	},
	eventFeatures: function(features) {
		return function(e) { Popup.link(e.currentTarget, features); e.preventDefault() }
	},
	'close': function(e) { e.preventDefault(); window.close() }
}

// -- Page
var Page = {
	_currentLocation: window.location.href.toLowerCase(),
	_locked: false,
	
	getCurrent: function(url) {
		var sCurrent 
		url = url || Page._currentLocation
		sCurrent = url.replace('http://' + window.location.host, '')
		sCurrent = (sCurrent.indexOf('.asp') != -1) ? sCurrent.substring(0, sCurrent.indexOf('.asp') + 4) : (sCurrent.indexOf('?') != -1) ? sCurrent.substring(0, sCurrent.lastIndexOf('?')) : (sCurrent.indexOf('#') != -1) ? sCurrent.substring(0, sCurrent.lastIndexOf('#')) : sCurrent
		sCurrent += (sCurrent.charAt(sCurrent.length - 1) == '/') ? 'default.asp' : ''
		return sCurrent
	},
	
	isCurrent: function() { 
		return (filter(Page.isCurrent.arguments, function(el) { return (Page.getCurrent().substring(Page.getCurrent().length - el.length) == el) }).length > 0)
	}, 
	
	inCurrent: function(page) { 
		var re = new RegExp(page)
		return re.test(Page._currentLocation)
	}, 
	
	'back': function(e) { e.preventDefault(); window.history.back() },
	
	lock: function(mensagem) { 
		mensagem = mensagem || 'O formulário já está sendo processado. Por favor, aguarde alguns instantes.'
		return function(e) {
			if (Page._locked) { 
				e.preventDefault() 
				alert(mensagem)
			} else
				Page._locked = true
		}
	}
}

// -- Custom
var _Custom = {
	
	addFakeHover: function(els, classe) {
		classe = classe || 'over'
		addEventDict(els, 
			{ 
				'mouseover' : function(e) { addClass(e.currentTarget, classe) },
				'focus' : function(e) { addClass(e.currentTarget, classe) },
				'mouseout' : function(e) { remClass(e.currentTarget, classe) },
				'blur' : function(e) { remClass(e.currentTarget, classe) }
			}
		)
	},
	
	bannerPopup: function() {
		var oPopup = getElementsByClass('banner-popup')[0]
		var oP = document.createElement('p')
		var oA = document.createElement('a')
		var oText = document.createTextNode('Fechar')
		oA.setAttribute('id', 'fechar')
		oA.setAttribute('href', '#')
		oA.setAttribute('title', 'Fechar')
		oA.appendChild(oText)
		oP.appendChild(oA)
		oPopup.appendChild(oP)
		addClass(oPopup, 'show', false)
		addEvent(oA, 'click', function(e) { remClass(oPopup, 'show'); e.preventDefault() })
	},
	
	fecharTodosMenus: function() {
		if ((o = getElementsByClass('ct-menu', 'ul'))) {
			each(o, function(menu) {
				each(filter(getAll('li', menu), function(el) { return el.parentNode == menu && !hasClass(el, 'ativo') }), function(el) { addClass(el, 'hide') })
			})
		}
	},
	
	imagemNoticia: function(src, width, height) { 
		var scrollbars = 0, iWidth = width, iHeight = height
		iWidth = (width > 500) ? 500 : width
		iHeight = parseInt((iWidth * height) / width)
		if (iWidth < 280) iWidth = 280
		if (iHeight > 500) 
			{ iWidth += 20; iHeight = 500; scrollbars = 1 }
		else
			iHeight += 55
		iWidth += 28
		iTop = parseInt((screen.height - iHeight) / 2)
		iLeft = parseInt((screen.width - iWidth) / 2)
		return Popup.link(src, 'width=' + iWidth + ',height=' + iHeight + ',top=' + iTop + ',left=' + iLeft + ',scrollbars=' + scrollbars + ',location=0,statusbar=0,menubar=0')
	},
	
	imprimir: function() {
		var oInput, oP

		each(getElementsByClass('ct-impressao'), function(elConteiner) {
															
			oInput = document.createElement('input')
			oInput.setAttribute('type', 'button')
			oInput.setAttribute('value', 'Imprimir')
			oInput.setAttribute('alt', 'Imprimir')
			oInput.setAttribute('id', 'fechar')
			
			oP = document.createElement('p')
			oP.className = 'submit'
			
			oP.appendChild(oInput)
			if (elConteiner.hasChildNodes)
				elConteiner.insertBefore(oP, elConteiner.firstChild)
			else
				elConteiner.appendChild(oP)
			
			addEvent(oInput, 'click', function() { window.print() })
			
		})
		
	},
	
	initialize: function() {
		var o
		
		// Cria botão Imprimir
		_Custom.imprimir()
		
		/* Abre links com classe 'externo' em nova página */
		addEvent(getElementsByClass('externo', 'a'), 'click', Popup.event)
		
		/* Ações para formulários que enviam dados */
		if (Page.isCurrent('atendimento/associese.asp', 'atendimento/default.asp', 'rh/curriculo.asp', 'rh/pesquisa.asp', 'agenda_inscricao.asp'))
			addEvent(getAll('form', 'conteudo'), 'submit', Page.lock())
				
		/* Ações para formulários que enviam dados */
		if (Page.isCurrent('rh/pesquisa.asp'))
			alert('ATENÇÃO: Para que o processo seja mais assertivo e ágil é necessário que o perfil da vaga seja preenchido detalhadamente.')

		/* Abre formulário de boleto em nova janela */
		if (Page.isCurrent('agenda_inscricao_conclusao.asp'))
			if ((o = getElem('f-boleto'))) o.setAttribute('target', '_blank')
			
		/* Abre mapa de localização em nova janela */
		if ((o = getElem('link-mapa'))) addEvent(getAll('a', o)[0], 'click', Popup.eventFeatures('width=717,height=500,scrollbars=1'))
			
	}
}

addLoadEvent(_Custom.initialize)
