function isFieldFormatValid(field, format) {

	var regexp;

	switch(format) {
		case 'alpha':
			regexp = /^[a-zA-Z\.\-]*$/;
			if(!regexp.test(field.value))
				return false;
			break;
		case 'alphanum':
			regexp = /^\w+$/;
			if(!regexp.test(field.value))
				return false;
			break;
		case 'unsigned':
			regexp = /^\d+$/;
			if(!regexp.test(field.value))
				return false;
			break;
		case 'integer':
			regexp = /^[\+\-]?\d*$/;
			if(!regexp.test(field.value))
				return false;
			break;
		case 'real':
			regexp = /^[\+\-]?\d*\.?\d*$/;
			if(!regexp.test(field.value))
				return false;
			break;
		case 'email':
			regexp = /^[\w-\.]+\@[\w\.-]+\.[a-z]{2,4}$/;
			if(!regexp.test(field.value))
				return false;
			break;
		case 'phone':
			regexp = /^[\d\.\s\-]+$/;
			if(!regexp.test(field.value))
				return false;
			break;
		case 'date':
			regexp = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
			if(!regexp.test(field.value))
				return false;
			if((RegExp.$1 > 31) || (RegExp.$2 > 12))
				return false;
			var dateTest = new Date(RegExp.$3, Number(RegExp.$2-1), RegExp.$1);
			if(dateTest.getMonth() != Number(RegExp.$2-1))
				return false;
			break;
		case 'time':
			regexp = /^(\d{2})\:(\d{2})\:(\d{2})$/;
			if(!regexp.test(field.value))
				return false;
			if((RegExp.$1 > 23) || (RegExp.$2 > 59) || (RegExp.$3 > 59))
				return false;
			break;
		case 'cnpj':
			if(!isCNPJ(field.value))
				return false;
			else
				return true;
			break;
		case 'cpf':
			if(!isCPF(field.value))
				return false;
			else
				return true;
			break;
		case 'cep':
			if(!isCEP(field.value))
				return false;
			else
				return true;
			break;
		default:
			break;
	}

	return true;

}

function getErrorMessage(field, errorType) {

	var msg;
	var label;

	try {
		if(field.getAttribute('framework-form-label') != '') {
			label = field.getAttribute('framework-form-label');
		}
		else {
			label = field.name;
		}
	}
	catch(e) {
	}

	switch(errorType) {
		case 'emptyField':
			msg = 'O campo "'+ label +'" é obrigatório.';
			break;
		case 'invalidFormat':
			msg = 'O campo "'+ label +'" não possui um formato válido.';
			break;
	}

	return msg;

}

function isFormValid(form) {

	var elements = form.elements;
	var x;
	var error = Array();
	var error_msg = '';
	var i = 0;
	var hasError;

	//for(x in elements) {
	for(x = 0; x < elements.length; x++) {
		
		try	{
			if(elements[x].getAttribute('framework-form-required') == '1') {

				hasError = false;
				switch(elements[x].type) {
					case 'text':
					case 'hidden':
					case 'password':
					case 'file':
					case 'textarea':
						if(elements[x].value == '') {
							hasError = true;
							error[i] = getErrorMessage(elements[x], 'emptyField');
							i++;
						}
						break;
					case 'radio':
					case 'checkbox':
						var fieldLength = elements[elements[x].name].length;
						var fieldChecked = false;

						var k = 0;
						for(k; k < fieldLength; k++) {
							if(elements[elements[x].name][k].checked)
								fieldChecked = true;
						}
						if(!fieldChecked) {
							hasError = true;
							error[i] = getErrorMessage(elements[x], 'emptyField');
							i++;
						}
						break;
					case 'select-multiple':
					case 'select-one':
						var fieldLength = elements[x].options.length;
						var fieldSelected = false;
						var k = 0;
						for(k; k < fieldLength; k++) {
							if(elements[x].options[k].selected && elements[x].options[k].value != '')
								fieldSelected = true;
						}
						if(!fieldSelected) {
							hasError = true;
							error[i] = getErrorMessage(elements[x], 'emptyField');
							i++;
						}
						break;
					default:
						break;
				}

				if(!hasError) {
					setHighlightOK(form, elements[x]);
				}
				else {
				
					setHighlightError(form, elements[x]);
				}

			}
		}
		catch(e) {
		}

		try	{
			if((elements[x].getAttribute('framework-form-format') != null) && (elements[x].value != '')) {

				hasError = false;

				if(!isFieldFormatValid(elements[x], elements[x].getAttribute('framework-form-format'))) {
					hasError = true;
					error[i] = getErrorMessage(elements[x], 'invalidFormat');
					i++;
				}

				if(!hasError) {
					setHighlightOK(form, elements[x]);
				}
				else {
					setHighlightError(form, elements[x]);
				}

			}
		}
		catch(e) {
		}

	}

	if(error.length) {
		
		for(x in error) {
			error_msg += error[x] + "%sep%";
		}

		try {
			if(form.getAttribute('framework-form-errordiv') == '1') {
				error_msg = error_msg.replace(/%sep%/g, '<br />');
				var errordiv = document.getElementById('div_'+form.name+'_output');
				errordiv.className = 'formTextError';
				errordiv.innerHTML = error_msg;
			}
			else {
				error_msg = error_msg.replace(/%sep%/g, '\n');
				alert(error_msg);
			}
		}
		catch(e) {
			alert(e);
		}

		return false;

	}

	try {
		if(form.getAttribute('framework-form-errordiv') == '1') {
			var ok_msg = '';
			var errordiv = document.getElementById('div_'+form.name+'_output');
			errordiv.innerHTML = ok_msg;
		}
	}
	catch(e) {
	}

	return true;

}

function setHighlightOK(form, field) {

	try {
		if(form.getAttribute('framework-form-highlight') == '1') {
			var div_label = document.getElementById('div_'+form.name+'_'+field.name);
			div_label.className = 'formText';
			field.className = 'formField';
		}
	}
	catch(e) {
	}

}

function setHighlightError(form, field) {

	try {
		if(form.getAttribute('framework-form-highlight') == '1') {   			
			field.className = 'formFieldError';
		}
	}
	catch(e) {
	}

}

function setFieldMask(field, maskType, event) {
	
	var ie = document.all;

	switch(maskType) {
		case 'cnpj':
			var keySet = '0123456789';
			var maxsize = 18;
			var mask = '##.###.###/####-##';
			break;
		case 'cpf':
			var keySet = '0123456789';
			var maxsize = 14;
			var mask = '###.###.###-##';
			break;
		case 'cep':
			var keySet = '0123456789';
			var maxsize = 9;
			var mask = '#####-###';
			break;
		case 'date':
			var keySet = '0123456789';
			var maxsize = 10;
			var mask = '##/##/####';
			break;
		case 'time':
			var keySet = '0123456789';
			var maxsize = 8;
			var mask = '##:##:##';
			break;
	}

	var keyCode = (ie) ? window.event.keyCode : event.which;

	if(keyCode == 8) {
		field.value = field.value.substring(-1, (field.value.length - 1));
	}

	var key = String.fromCharCode(keyCode);
	if((keySet.indexOf(key) == -1) && (keyCode != 0) && (keyCode != 13)) {
		return false;
	}
	
	var i = field.value.length;

	if((i >= maxsize) && (keyCode != 0) && (keyCode != 13)) {
		return false;
	}

	var output = mask.substring(0,1);
	var outputText = mask.substring(i);
	if(outputText.substring(0,1) != output) {
		field.value += outputText.substring(0,1);
	}

	return true;

}

function isCNPJ(value) {

	var CNPJ = value;

	if(CNPJ.length < 18)
		return false;

	if((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-"))
		return false;

	if(document.layers && parseInt(navigator.appVersion) == 4) {
		x = CNPJ.substring(0,2);
		x += CNPJ.substring(3,6);
		x += CNPJ.substring(7,10);
		x += CNPJ.substring(11,15);
		x += CNPJ.substring(16,18);
		CNPJ = x;
	}
	else {
		CNPJ = CNPJ.replace(".","");
		CNPJ = CNPJ.replace(".","");
		CNPJ = CNPJ.replace("-","");
		CNPJ = CNPJ.replace("/","");
	}

	var nonNumbers = /\D/;
	if(nonNumbers.test(CNPJ))
		return false;

	var a = [];
	var b = new Number;
	var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];

	for(i=0; i<12; i++) {
		a[i] = CNPJ.charAt(i);
		b += a[i] * c[i+1];
	}
	if(b == 0)
		return false;
	if((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
	b = 0;
	for(y=0; y<13; y++) {
		b += (a[y] * c[y]);
	}
	if((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
	if((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13]))
		return false;

	return true;

}

function isCPF(value) {
	
	var CPF = value;

	if(CPF.length < 14)
		return false;

	if((CPF.charAt(3) != ".") || (CPF.charAt(7) != ".") || (CPF.charAt(11) != "-"))
		return false;

	if(document.layers && parseInt(navigator.appVersion) == 4) {
		x = CPF.substring(0,3);
		x += CPF.substring(4,7);
		x += CPF.substring(8,11);
		x += CPF.substring(12);
		CPF = x;
	}
	else {
		CPF = CPF.replace(".","");
		CPF = CPF.replace(".","");
		CPF = CPF.replace("-","");
	}

	var nonNumbers = /\D/;
	if(nonNumbers.test(CPF))
		return false;

	if(CPF == "00000000000" || CPF == "11111111111" || CPF == "22222222222" || CPF == "33333333333" || CPF == "44444444444" || CPF == "55555555555" || CPF == "66666666666" || CPF == "77777777777" || CPF == "88888888888" || CPF == "99999999999")
		return false;

	var a = [];
	var b = new Number;
	var c = 11;
	for(i=0; i<11; i++) {
		a[i] = CPF.charAt(i);
		if(i < 9) b += (a[i] * --c);
	}
	if((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
	b = 0;
	c = 11;
	for(y=0; y<10; y++) b += (a[y] * c--);
	if((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
	if((CPF.charAt(9) != a[9]) || (CPF.charAt(10) != a[10]))
		return false;

	return true;

}

function isCEP(value) {
	
	var CEP = value;

	if(CEP.length < 9)
		return false;

	if((CEP.charAt(5) != "-"))
		return false;

	if(document.layers && parseInt(navigator.appVersion) == 4) {
		x = CEP.substring(0,5);
		x += CEP.substring(6);
		CEP = x;
	}
	else {
		CEP = CEP.replace("-","");
	}

	var nonNumbers = /\D/;
	if(nonNumbers.test(CEP))
		return false;

	return true;

}