var isIE = /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);
function obj(id) {
	if (typeof(id) != 'object')
		return document.getElementById(id);
	return id;
}
function serialize(obj) {
	var buf = '{';
	var tmp = [];
	for (var p in obj) {
		tmp.push(p + ':\'' + obj[p] + '\'');
	}
	buf += tmp.join(',');
	buf += '}';
	return buf;
}
function unserialize(str) {
	var res = {};
	try {
		eval("res = " + str);
	} catch (e) {}
	return res;
}
function getKey(ev) {
	ev = ev || window.event;
	return (ev.which || ev.keyCode);
}
function getTarget(ev) {
	ev = ev || window.event;
	return (ev.target || ev.srcElement);
}
function addEvent(elm, type, fn, capt) {
	if (elm = obj(elm)) {
		type = type.replace('/^on/i', '').toLowerCase();
		capt = !!capt;
		if (elm.addEventListener)
			elm.addEventListener(type, fn, capt);
		else if (elm.attachEvent)
			elm.attachEvent('on' + type, fn);
		else
			elm['on' + type] = fn;
	}
}
function stopEvent(ev) {
	ev = ev || window.event;
	if (ev.stopPropagation) {
		ev.stopPropagation();
		ev.preventDefault();
	} else {
		ev.cancelBubble = true;
		ev.returnValue = false;
	}
}
function getStyle(elm, property) {
	var d = document;
	if (elm && elm.style) {
		var camel = property.camelize();
		val = elm.style[camel];
		if (!val) {
			if (d.defaultView && d.defaultView.getComputedStyle) {
				var cs = d.defaultView.getComputedStyle(elm, null);
				(cs) && (val = cs.getPropertyValue(property));
			} else if (elm.currentStyle) {
				val = elm.currentStyle[camel];
			}
		}
		(val == 'auto') && (val = null);
	}
	return val;
}
function getPosition(elm) {
	var elm = obj(elm);
	var res = {x: 0, y: 0};
	res.x = elm.offsetLeft || parseInt(elm.style.left.replace('px', '') || '0', 10);
	res.y = elm.offsetTop || parseInt(elm.style.top.replace('px', '') || '0', 10);
	var p = elm.offsetParent;
	while (p) {
		res.x += p.offsetLeft;
		res.y += p.offsetTop;
		p = p.offsetParent;
	}
	return res;
}
function findParentByTagName(elm, tag) {
	var elm = obj(elm);
	if (elm.nodeName.toLowerCase() == tag.toLowerCase())
		return elm;
	do {
		if (elm.nodeName.toLowerCase() == tag.toLowerCase())
			return elm;
	} while ((elm = elm.parentNode) != null);
	return null;
}
function reparentTo(elm, newParent) {
	if (elm.parentNode != newParent) {
		var node = elm.parentNode.removeChild(elm);
		elm = newParent.appendChild(node);
	}
	return elm;
}
function collapsibleFieldsets(form) {
	if (!form)
		return;
	var legs = form.getElementsByTagName('legend');
	var tog = function(ev) {
		var dec = 0, nw = 20;
		var fs = findParentByTagName(getTarget(ev), 'fieldset');
		var collapsed = !!fs.collapsed;
		var tbl = (fs.getElementsByTagName('table') || [null])[0];
		if (!tbl)
			return;
		if (!collapsed) {
			if (!isIE) {
				dec += parseInt(getStyle(fs, 'border-top-width').replace('px', ''), 10);
				dec += parseInt(getStyle(fs, 'padding-top').replace('px', ''), 10);
				dec += parseInt(getStyle(fs, 'border-bottom-width').replace('px', ''), 10);
				dec += parseInt(getStyle(fs, 'padding-bottom').replace('px', ''), 10);
			}
			fs.oldHeight = fs.offsetHeight - dec;
			fs.style.height = (nw - dec) + (isIE ? 'px' : '');
			fs.collapsed = true;
			tbl.style.display = 'none';
		} else {
			fs.style.height = fs.oldHeight;
			fs.collapsed = false;
			tbl.style.display = '';
		}
	}
	for (var i=0; i<legs.length; i++) {
		legs[i].style.cursor = 'pointer';
		addEvent(legs[i], 'click', tog);
	}

}
function next(event, id, nextFunc, nonEmpty) {
	var k = getKey(event);
	var field = getTarget(event);
	var target, targetNode;
	if (k == 13) {
		stopEvent(event);
		if (!!nonEmpty && field.value == '')
			return;
		if (!id && typeof(nextFunc) == 'function')
			nextFunc();
		else if (target = obj(id)) {
			if (typeof(nextFunc) == 'function')
				nextFunc(event);
			targetNode = target.nodeName.toLowerCase();
			if (targetNode == 'button' || (targetNode == 'input' && /^(button|submit|reset)$/.test(target.type))) {
				target.focus();
				target.click();
			} else if (target.focus) {
				target.focus();
			}
		}
	}
}
function addTextAreaControl(elm, maxLength) {
	var count = obj(elm.id + 'Count');
	var control = function(ev) {
		ev = ev || window.event;
		var key = getKey(ev);
		var ign = '#33#34#35#36#37#38#39#40#45#4098#';
		if (ign.indexOf('#'+key+'#') == -1 && (key < 112 || key > 123)) {
			var len = elm.value.length;
			if (len >= maxLength) {
				elm.value = elm.value.substring(0, maxLength);
				count.innerHTML = maxLength;
			} else {
				count.innerHTML = len;
			}
		}
	};
	addEvent(elm, 'keydown', control);
	addEvent(elm, 'keyup', control);
}
function addTypeValidation(elm, type, clear) {
	var elm = obj(elm);
	var func, msg;
	switch (type) {
		case 'date' :
			func = dateValidation;
			msg = "Dados invlidos! Formato: DD/MM/AAAA";
			break;
		case 'cep' :
			func = cepValidation;
			msg = "Dados inválidos! Formato: 99999-999";
			break;
		case 'float' :
			func = floatValidation;
			msg = "Número decimal inválido!";
			break;
		case 'cpf' :
			func = cpfValidation;
			msg = "CPF inválido! Formato: 999.999.999-99";
			break;
		case 'cnpj' :
			func = cnpjValidation;
			msg = "CNPJ inválido! Formato: 99.999.999/9999-99";
			break;
		default :
			func = function() { return true; };
			msg = "";
	}
	addEvent(elm, 'focus', function() { elm.dirty = false; }, true);
	addEvent(elm, 'keypress', function(ev) { runTypeValidation(ev, func, msg, clear); });
	addEvent(elm, 'blur', function(ev) { runTypeValidation(ev, func, msg, clear); });
}
function runTypeValidation(ev, fn, msg, clear) {
	var ev = ev || window.event;
	var elm = getTarget(ev);
	var clear = !!clear;
	if (elm.value == '')
		return;
	if (ev.type == 'keypress') {
		var key = getKey(ev);
		if (key == 9 && !elm.dirty && !fn(elm.value)) {
			stopEvent(ev);
			elm.dirty = true;
			alert(msg);
			if (clear) {
				elm.value = '';
				elm.focus;
			} else {
				elm.select();
				elm.focus();
			}
		} else {
			elm.dirty = false;
		}
	} else if (ev.type == 'blur') {
		if (!elm.dirty && !fn(elm.value)) {
			stopEvent(ev);
			elm.dirty = true;
			alert(msg);
			if (clear) {
				elm.value = '';
				elm.focus;
			} else {
				elm.select();
				elm.focus();
			}
		} else {
			elm.dirty = false;
		}
	}
}
function dateValidation(val) {
	var re = /^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)?\d{2}$/;
	return re.test(val);
}
function cepValidation(val) {
	var re = /^\d{5}-\d{3}$/;
	return re.test(val);
}
function floatValidation(val) {
	var re = /^\-?[0-9]+(\.[0-9]+)?$/;
	return re.test(val);
}
function cpfValidation(val) {
	var re = /^[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}$/;
	return (re.test(val) && cpfCnpjValidation(val));
}
function cnpjValidation(val) {
	var re = /^[0-9]{2}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}\-[0-9]{2}$/;
	return (re.test(val) && cpfCnpjValidation(val));
}
function cpfCnpjValidation(val) {
	val = val.replace(/[^0-9]/g, '');
	if (val.length == 14) {
		sum1 = (val.charAt(0) * 5) + (val.charAt(1) * 4) + (val.charAt(2) * 3) + (val.charAt(3) * 2) + (val.charAt(4) * 9) + (val.charAt(5) * 8) + (val.charAt(6) * 7) + (val.charAt(7) * 6) + (val.charAt(8) * 5) + (val.charAt(9) * 4) + (val.charAt(10) * 3) + (val.charAt(11) * 2);
		rest = sum1 % 11, d1 = rest < 2 ? 0 : 11 - rest;
		sum2 = (val.charAt(0) * 6) + (val.charAt(1) * 5) + (val.charAt(2) * 4) + (val.charAt(3) * 3) + (val.charAt(4) * 2) + (val.charAt(5) * 9) + (val.charAt(6) * 8) + (val.charAt(7) * 7) + (val.charAt(8) * 6) + (val.charAt(9) * 5) + (val.charAt(10) * 4) + (val.charAt(11) * 3) + (val.charAt(12) * 2);
		rest = sum2 % 11, d2 = rest < 2 ? 0 : 11 - rest;
		return ((val.charAt(12) == d1) && (val.charAt(13) == d2));
	} else {
		sum1 = (val.charAt(0) * 10) + (val.charAt(1) * 9) + (val.charAt(2) * 8) + (val.charAt(3) * 7) + (val.charAt(4) * 6) + (val.charAt(5) * 5) + (val.charAt(6) * 4) + (val.charAt(7) * 3) + (val.charAt(8) * 2);
		rest = sum1 % 11, d1 = rest < 2 ? 0 : 11 - rest;
		sum2 = (val.charAt(0) * 11) + (val.charAt(1) * 10) + (val.charAt(2) * 9) + (val.charAt(3) * 8) + (val.charAt(4) * 7) + (val.charAt(5) * 6) + (val.charAt(6) * 5) + (val.charAt(7) * 4) + (val.charAt(8) * 3) + (val.charAt(9) * 2);
		rest = sum2 % 11, d2 = rest < 2 ? 0 : 11 - rest;
		return ((val.charAt(9) == d1) && (val.charAt(10) == d2));
	}
}
String.prototype.trim = function() {
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
};
String.prototype.camelize = function() {
	var res, tmp = this.split('-');
	if (tmp.length == 1)
		return tmp[0];
	res = (this.indexOf('-') == 0 ? tmp[0].charAt(0).toUpperCase() + tmp[0].substring(1) : tmp[0]);
	for (var i=1; i<tmp.length; i++)
		res += tmp[i].charAt(0).toUpperCase() + tmp[i].substring(1);
	return res;
};
String.prototype.stripScripts = function() {
	return this.replace(new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'img'), '');
};
String.prototype.evalScripts = function() {
	var ra = new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'img');
	var rs = new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'im');
	var matches = this.match(ra) || [];
	for (var i=0; i<matches.length; i++) {
		var match = matches[i].match(rs);
		if (match)
			eval(match[1]);
	}
};

