//===============================================================================
//= CONVERTE TEXTOS EM MAIÚSCULAS/MINÚSCULAS ====================================
//===============================================================================
function smallCaps(obj, type) {
		type = ((typeof type != "number") || (type > 3) || (type < 1)) ? 3 : type;
		var except = ['de','do','da','das','dos','em'];
		var tam = obj.value.length;
		var txt = obj.value;
		switch (type) {
			case 1: txt = txt.toLowerCase(); break;
			case 2: txt = txt.toUpperCase(); break;
			case 3: if (tam > 0) {
								txt = txt.toLowerCase().split(' ');
								for (var x = 0; x < txt.length; x++)
									if (!inArray(txt[x],except) && (txt[x].length > 1))
										txt[x] = txt[x].substring(0,1).toUpperCase() + txt[x].substring(1,txt[x].length);
								txt = txt.join(' ');
							}; break;
		};
		obj.value = txt;
}

function inArray(txt, array) {
	var ret = false;
	for (var x=0; x<array.length; x++)
		if (array[x] == txt)
			ret = true;
	return ret;
}



//===============================================================================
//= VALIDAÇÕES ==================================================================
//===============================================================================
function trimToDigits(string) {
	s = "";
	var Numeros = /\d/;
	for (i = 0; i <= string.length; i++) 
		if (Numeros.test(string.substr(i,1))) s += string.substr(i,1);
	return s;	
}

// VERIFICA DATA
function VAno(ano) {
	ano = trimToDigits(ano);
	return ((parseInt(ano) < 1900) || (ano.length != 4) || (parseInt(ano) > 2050)) ? false : true; 
}

function VMes(mes) {
	mes = trimToDigits(mes);
	return ((mes.length != 2) || (parseInt(mes) < 1) || (parseInt(mes) > 12)) ? false : true; 
}

function VData(data) {
	data = trimToDigits(data);
	if (data.length < 8) return false;
	dia = data.substr(0,2);
	mes = data.substr(2,2);
	ano = data.substr(4,4);
	
	if(ano >= 0 && ano < 1900) return false; 
	if(ano > 2100 || ano < 0 || mes > 12 || mes < 1) return false; 
	numero = ((parseInt(ano) - 1884) / 4) 
	dias = (numero == Math.floor(numero)) ? "312931303130313130313031" : "312831303130313130313031"; 
	diamax = parseInt(dias.substring((mes - 1) * 2, ((mes - 1) * 2) + 2)); 
	if(dia < 1 || dia > diamax) return false; 	
	
	return true;
}

// VERIFICA CNPJ
function VCNPJ(cnpj) {
	var b = [6,5,4,3,2,9,8,7,6,5,4,3,2]
	if((cnpj = cnpj.replace(/[^\d]/g,"").split("")).length != 14) return false;
	for(var i = 0, n = 0; i < 12; n += cnpj[i] * b[++i]);
	if(cnpj[12] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
	for(var i = 0, n = 0; i <= 12; n += cnpj[i] * b[i++]);
	if(cnpj[13] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
	return true;
}

// VERIFICA CPF
function VCPF(cpf) {
	if((cpf = cpf.replace(/[^\d]/g,"").split("")).length != 11) return false;
	if(new RegExp("^" + cpf[0] + "{11}$").test(cpf.join(""))) return false;
	for(var s = 10, n = 0, i = 0; s >= 2; n += cpf[i++] * s--);
	if(cpf[9] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
	for(var s = 11, n = 0, i = 0; s >= 2; n += cpf[i++] * s--);
	if(cpf[10] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
	return true;
}

// VERIFICA E-MAIL
function VEmail( strEmail ) {
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	return (filter.test(strEmail));
}



//===============================================================================
//= MASCARAS ====================================================================
//===============================================================================
function addEvent(obj, e, func, s) {
		var r = obj[r = "_" + (e = "on" + e)] = obj[r] || (obj[e] ? [[obj[e], obj]] : []), a, c, d;
		r[r.length] = [func, s || obj], obj[e] = function(e) {
				try {
						(e = e || event).preventDefault || (e.preventDefault = function(){e.returnValue = false;});
						e.stopPropagation || (e.stopPropagation = function(){e.cancelBubble = true;});
						e.target || (e.target = e.srcElement || null);
						e.key = (e.which + 1 || e.keyCode + 1) - 1 || 0;
				} catch(func) {}
				for(d = 1, func = r.length; func; r[--func] && (a = r[func][0], obj = r[func][1], a.call ? c = a.call(obj, e) : (obj._ = a, c = obj._(e), obj._ = null), d &= c !== false));
				return e = null, !!d;
		}
};

function removeEvent(obj, e, func, s) {
		for(var i = (e = obj["_on" + e] || []).length; i;)
				if(e[--i] && e[i][0] == func && (s || obj) == e[i][1])
						return delete e[i];
		return false;
};

maskInput = {
	tagsInput: ['input', 'textarea'], 
	
	setInputRequired: function(input) {
		var inputObrigatorio = 'inputObrigatorio';
		var classes = input.className;
		var pos = (classes.length > 0) ? inputObrigatorio.indexOf(classes.toLowerCase()) : -1;
		if (pos == -1)
			classes += ' ' + inputObrigatorio;
		else {
			classes = classes.split(" ");
			var i = 0;
			while (pos < 0) {
				pos = (classes[i] == inputObrigatorio) ? i : pos; 
				i++;
			}
			classes.join(" ");
		}	
		input.className = classes;
	},
	
	initMask: function() {
		var restrict = new Restrict("form1");
		for (var i = 0; i < this.tagsInput.length; i++) {
			listInputs = document.getElementsByTagName(this.tagsInput[i]);
			for (var y = 0; y < listInputs.length; y++)
				if (('button,image,hidden,submit,reset').indexOf(listInputs[y].type.toLowerCase()) == -1) {
					if (listInputs[y].getAttribute('obrigatorio') != null) this.setInputRequired(listInputs[y]);
					if ((mascara = listInputs[y].getAttribute('mascara')) != null) {
						if (('MOEDA').indexOf(mascara) != -1) { this.formatValor(listInputs[y], 2)};
						if (('FLOAT').indexOf(mascara) != -1) { this.formatValor(listInputs[y], 2, "", ",")};
						if (('DATA,HORA,UF,CPF,CNPJ,CEP,FONE,INT').indexOf(mascara) != -1) {
							switch (mascara) {
								/*  * ".": Qualquer caracter
										* "w": Somente A-z, a-z, 0-9 e _
										* "W": Qualquer caracter, exceto: A-z, a-z, 0-9 e _
										* "d": 0-9
										* "D": Qualquer caracter, exceto 0-9
										* "s": Permite espaço em branco, tabulação, quebra de linha, etc (\f\n\r\t\v)
										* "a": Permite somente letras acentuadas
										* "A": Permite qualquer caracter, exceto letras acentuadas
								*/									
								case 'INT': listInputs[y].mask = '##########'; listInputs[y].expreg = '\\\\d'; break;
								case 'DATA': listInputs[y].mask = '##/##/####'; listInputs[y].expreg = '\\\\d'; break;
								case 'HORA': listInputs[y].mask = '##:##'; listInputs[y].expreg = '\\\\d'; break;
								case 'UF': listInputs[y].mask = '##'; listInputs[y].expreg = 'ABCDEFGIJLMNOPRSTabcdefgijlmnoprst'; break;
								case 'CPF': listInputs[y].mask = '###.###.###-##'; listInputs[y].expreg = '\\\\d'; break;
								case 'CNPJ': listInputs[y].mask = '##.###.###/####-##'; listInputs[y].expreg = '\\\\d'; break;
								case 'CEP': listInputs[y].mask = '##.###-###'; listInputs[y].expreg = '\\\\d'; break;
								case 'FONE': listInputs[y].mask = '(##) ####-####'; listInputs[y].expreg = '\\\\d'; break;
							};
							eval('restrict.field.'+listInputs[y].name+' = "'+listInputs[y].expreg+'"');
							eval('restrict.mask.'+listInputs[y].name+' = "'+listInputs[y].mask+'"');
						};
					}; 
				}; 
		}; 
		restrict.start();
	},
	
	keyAccept: function(obj, accept){
	},
	
	formatValor: function(obj, num, strdig, strdec) {
		obj.c = !isNaN(num) ? Math.abs(num) : 2;
		obj.dec = typeof strdec != "string" ? "," : strdec, obj.dig = typeof strdig != "string" ? "." : strdig;
		obj.keyAccept = this.keyAccept;
		addEvent(obj, "keypress", function(e) {
			if(e.key > 47 && e.key < 58) {

				var s, l = (s = (obj.value.replace(/^0+/g, "") + String.fromCharCode(e.key)).replace(/\D/g, "")).length, num;
				if(obj.maxLength + 1 && l >= obj.maxLength) return false;
				l <= (num = obj.c) && (s = new Array(num - l + 2).join("0") + s);
				for(var i = (l = (s = s.split("")).length) - num; (i -= 3) > 0; s[i - 1] += obj.dig);
				num && num < l && (s[l - ++num] += obj.dec);
				obj.value = s.join("");
			}
			e.key > 30 && e.preventDefault();
			this.keyAccept(obj, ((e.key < 30) || (e.key > 47 && e.key < 58)));
		});
		addEvent(obj, "keyup", function() {
			var obj = this, s, l = (s = (obj.value.replace(/^0+/g, "")).replace(/\D/g, "")).length, num;
			if(obj.maxLength + 1 && l >= obj.maxLength) return false;
			l <= (num = obj.c) && (s = new Array(num - l + 2).join("0") + s);
			for(var i = (l = (s = s.split("")).length) - num; (i -= 3) > 0; s[i - 1] += obj.dig);
			num && num < l && (s[l - ++num] += obj.dec);
			obj.value = s.join("");
		});
	}
}

Restrict = function(form){
	this.form = form, this.field = {}, this.mask = {}, this.name = {};
}
Restrict.field = Restrict.inst = Restrict.c = null;
Restrict.prototype.start = function(){
		var $, __ = document.forms[this.form], s, x, j, c, sp, o = this, l;
		var p = {".":/./, w:/\w/, W:/\W/, d:/\d/, D:/\D/, s:/\s/, a:/[\xc0-\xff]/, A:/[^\xc0-\xff]/};
		for(var _ in $ = this.field)
				if(/text|textarea|password/i.test(__[_].type)){
						x = $[_].split(""), c = j = 0, sp, s = [[],[]];
						for(var i = 0, l = x.length; i < l; i++)
								if(x[i] == "\\" || sp){
										if(sp = !sp) continue;
										s[j][c++] = p[x[i]] || x[i];
								}
								else if(x[i] == "^") c = (j = 1) - 1;
								else s[j][c++] = x[i];
						o.mask[__[_].name] && (__[_].maxLength = o.mask[__[_].name].length);
						__[_].pt = s, addEvent(__[_], "keydown", function(e){
								var r = Restrict.field = e.target;
								if(!o.mask[r.name]) return;
								r.l = r.value.length, Restrict.inst = o; Restrict.c = e.key;
								setTimeout(o.onchanged, r.e = 1);
						});
						addEvent(__[_], "keyup", function(e){
								(Restrict.field = e.target).e = 0;
						});
						addEvent(__[_], "keypress", function(e){
								o.restrict(e) || e.preventDefault();
								var r = Restrict.field = e.target;
								if(!o.mask[r.name]) return;
								if(!r.e){
										r.l = r.value.length, Restrict.inst = o, Restrict.c = e.key || 0;
										setTimeout(o.onchanged, 1);
								}
						});
				}
}
Restrict.prototype.restrict = function(e){
		var o, c = e.key, n = (o = e.target).name, r;
		var has = function(c, r){
				for(var i = r.length; i--;)
						if((r[i] instanceof RegExp && r[i].test(c)) || r[i] == c) return true;
				return false;
		}
		var inRange = function(c){
				return has(c, o.pt[0]) && !has(c, o.pt[1]);
		}
		return (c < 30 || inRange(String.fromCharCode(c))) ?
				(this.onKeyAccept && this.onKeyAccept(o, c), true) :
				(this.onKeyRefuse && this.onKeyRefuse(o, c),  false);
}
Restrict.prototype.onchanged = function(){
		var ob = Restrict, si, moz = false, o = ob.field, t, lt = (t = o.value).length, m = ob.inst.mask[o.name];
		if(o.l == o.value.length) return;
		if(si = o.selectionStart) moz = true;
		else if(o.createTextRange){
				var obj = document.selection.createRange(), r = o.createTextRange();
				if(!r.setEndPoint) return false;
				r.setEndPoint("EndToStart", obj); si = r.text.length;
		}
		else return false;
		for(var i in m = m.split(""))
				if(m[i] != "#")
						t = t.replace(m[i] == "\\" ? m[++i] : m[i], "");
		var j = 0, h = "", l = m.length, ini = si == 1, t = t.split("");
		for(i = 0; i < l; i++)
				if(m[i] != "#"){
						if(m[i] == "\\" && (h += m[++i])) continue;
						h += m[i], i + 1 == l && (t[j - 1] += h, h = "");
				}
				else{
						if(!t[j] && !(h = "")) break;
						(t[j] = h + t[j++]) && (h = "");
				}
		o.value = o.maxLength > -1 && o.maxLength < (t = t.join("")).length ? t.slice(0, o.maxLength) : t;
		if(ob.c && ob.c != 46 && ob.c != 8){
				if(si != lt){

						while(m[si] != "#" && m[si]) si++;
						ini && m[0] != "#" && si++;
				}
				else si = o.value.length;
		}
		!moz ? (obj.move("character", si), obj.select()) : o.setSelectionRange(si, si);
}
