// 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(page) { 
		return (Page.getCurrent().substring(Page.getCurrent().length - page.length) == page)
	}, 
	
	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) }
			}
		)
	},
	
	setSearchValue: function(oText, eventType) {
		var sTextoDefault = (window.location.href.indexOf('educacao') != -1) ? 'Pesquisar em Educação' : 'Pesquisar em Saúde'
		if (eventType == 'in' && oText.value == sTextoDefault) oText.value = ''
		if (eventType == 'out' && oText.value == '') oText.value = sTextoDefault
	},
		
		bannerPopup: function() {
		if ((o = getElem('banner-popup'))) 
			each(getAll('li', o), function(oPopup) {
				var oP = document.createElement('p')
				var oA = document.createElement('a')
				var oText = document.createTextNode('Fechar')
				oA.className = '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() })
			})
	},

	
	initialize: function() {
		var o
		
		// 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('faleconosco.asp') || Page.isCurrent('cadastro.asp') || Page.inCurrent('sacola'))
			addEvent(getAll('form', 'ct-conteudo'), 'submit', Page.lock())
		
		// Boleto
		if ((o = getElem('f-boleto'))) 
			addEvent(o, 'submit', function() { o.setAttribute('target', '_blank') })
		
		// Conclusão do pedido
		if (Page.isCurrent('confirmacao.asp')){
			addEvent(getAll('a', 'botoes')[1], 'click', Page.lock('O pedido está sendo processado. Aguarde.'))
		}
		
		// Fotos da empresa
		if (Page.isCurrent('institucional.asp')){
			addEvent(getAll('a', 'l-fotos'), 'click', Popup.eventFeatures('width=528, height=403'))
		}
		
		
			// Popup 
			_Custom.bannerPopup()

	}
}

addLoadEvent(_Custom.initialize)