jsForm = function(form, opt){
	this.form = $(form?form:document.forms[0]);
	
	if(!this.form){
		alert('Formulario invalido!');
		return false;
	}
	
	this.elementos=Object();
	
	if(!opt) opt={};
	
	var i=0, element, jstype;
	
	while(element = $(this.form[i++])){
	
		if(element.disabled)
			element.setAttribute('disabledFirst', element.disabled);
		
		if(element.name)
			this.elementos[element.name] = $(element);
		
		if(jstype = element.getAttribute('jstype')){
			element.addClassName('input_mask').addClassName('mask_'+jstype);
		}
		
		if(element.tagName.toLowerCase() == 'select'){
			if($(element[0])){
				if($(element[0]).value.length<=0){
					$(element[0]).setStyle({backgroundColor:'#F5F5F5'}).disabled=true;
				}
			}
			element.setAttribute('firstValue', element.selectedIndex);
			element.observe('change', function(){
				this.title = this[this.selectedIndex].innerHTML;
			});
			element.setAttribute('innerHTML_inicio', element.innerHTML);
		}
		else element.setAttribute('firstValue', element.value);
		
		if(element.checked)
			element.setAttribute('firstValueChecked', 1);
		
		element.observe('keyup', function(){
			element_keyup(this);
		}).observe('blur', function(){
			element_blur(this);
		});
		
		var tip = element.getAttribute('tip');
		if(tip){
			 tip = tip.split('|');
			 element.observe('focus', (function(tip){
				return function(){
					balao(tip[0], this, tip[1]);
				}
			 })(tip)).observe('blur', (function(tip){
				return function(){
					balao(tip[0]);
				}
			 })(tip));
		}
		
		
	}
	
	this.oncleanAll = opt.oncleanAll;
	
	this.send = function(button){
		var i=0, element, error=false, firstError, msg;
		
		while(element = this.form[i++]){
			if(msg = testFormItem(element)){
				error=msg;
				if(!firstError)
					firstError = element;
				break;
			}
			
		}
		
		if(!error){
			var checkOnDone = opt.checkOnDone;
			if(checkOnDone)
				if(!(checkOnDone = opt.checkOnDone(this.form, button))){
					this.form.submit();
				}
				else {
					if(typeof checkOnDone == 'string')
						return alert(checkOnDone);
					else return checkOnDone;
				}
			this.form.submit();
		}
		else {
			var msg = firstError.getAttribute('msg');
			if(typeof error =='string')
				balao('validacao_form', firstError, error, 2000);
			else if(msg)
				balao('validacao_form', firstError, msg, 2000);
			else
				balao('validacao_form',firstError,"Preencha este campo corretamente!", 2000, 1);
			firstError.focus();
		}
		
	}
	
	this.cleanAll = function(readOnlyToo){
		var i=0, element, resetedTagNameSave=[],off=false;
		while(element = this.form[i++]){
			off=false;
			
			if((element.disabled||element.readOnly)&&!readOnlyToo)
				continue;
			
			element.disabled = element.getAttribute('disabledFirst');
				
			switch(element.tagName.toLowerCase()){
				case 'input':
					switch(element.getAttribute('type').toLowerCase()){
						case 'text':
						case 'password':
						case 'textarea':
							element.value = '';
						break;
						case 'radio':
							resetedTagNameSave.each(function(v){
								if(v==element.name)
									off=true;
							});
							if(!off){
								resetedTagNameSave.push(element.name);
								document.getElementsByName(element.name)[0].checked=true;
							}
						break;
						case 'checkbox':
							element.checked=false;
						break;
					}
				break;
				case 'select':
					element.innerHTML = element.getAttribute('innerHTML_inicio');
					element.selectedIndex = 0;
					element.title=element.value;
				break;
				case 'textarea':
					element.value = '';
				break;
			}
			if(typeof element.onchange == 'function'&&!off)
				element.onchange();
		}
		
		if(typeof this.oncleanAll == 'function')
			this.oncleanAll();
		
		return this;
	}
	
	this.reset = function(){
		var i=0, element;
		while(element = this.form[i++]){
			if(element.tagName.toLowerCase() == 'select'){
				element.innerHTML = element.getAttribute('innerHTML_inicio');
				element.selectedIndex = element.getAttribute('firstValue');
				element.disabled =  element.getAttribute('disabledFirst');
			}
			else
				element.value = element.getAttribute('firstValue');
			if(element.getAttribute('firstValueChecked')){
				element.checked=true;
				if(typeof element.onchange == 'function')
					element.onchange();
			}
		}
	}
	
	Xaprb.InputMask.setupElementMasks();
	
};

testFormItem = function(element){
	element = $(element);
	var	value	=	element.value,
	jstype		=	element.getAttribute('jstype'),
	jsneed		=	element.getAttribute('jsneed')==true
	inputType	=	element.getAttribute('type');
	
	var radio_return=false, allUnchecked=true;
	if(inputType=='radio'){
		if(jsneed){
			$$('input[name='+element.name+']').each(function(e){
				if(e.checked){
					if(!e.value)
						radio_return='Selecione uma opção!';
					allUnchecked=false;
				}
			});
			if(allUnchecked&&!radio_return)
				radio_return='Selecione uma opção!';
			return radio_return;
		}
	}
	
	
	switch(jstype){
		
		case 'number':
			if((jsneed||value)&& /\N/.test(value))
				return true;
		break;		
		case 'phonefull':
			if((jsneed||value)&&value.length!=13)
				return 'Fone Inválido!';
		break;
		case 'date':
			if((jsneed||value)&& !/^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$/.test(value)){
				return 'A data informada é inválida!';
			}
		break;
		case 'cpf':
			if((jsneed&&!valida_cpf(value.replace(/[\-\.\/]/g,'')))||(value&&!valida_cpf(value.replace(/[\-\.\/]/g,'')))){
				return 'O CPF informado é inválido!';
			}
		break;
		case 'cnpj':
			if((jsneed&&!valida_cnpj(value.replace(/[\-\.\/]/g,'')))||(value&&!valida_cnpj(value.replace(/[\-\.\/]/g,'')))){
				return 'O CNPJ informado é inválido!';
			}
		break;
		case 'rg':
			if((jsneed||value)&&value.length<12){
				return 'O RG informado é inválido!';
			}
		break;
		case 'email':
			if((jsneed||value)&&(!/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i.test(value))){
				return 'O email informado é inválido!';
			}
		break;
		case 'percent':
			if(jsneed&&value.length<1){
				return 'Porcentagem inválida!';
			}
			if(jsneed||value){
				while(value.indexOf('0')==0)
					value = value.substr(1);
				element.value = value;
					
				if(value.indexOf('%')<0){
					element.value = value = value+'%';
				}
				if(value.indexOf('%')!=value.length-1){
					return 'Porcentagem inválida!';
				}
				if(!/(^100\%)|(^[0-9]{1,2}\%)|(^[0-9]{1,2}[\.|\,][0-9]{1,2}\%)/.test(value)){
					return 'Porcentagem inválida!';
				}
			}
		break;
		
	}
	
	//Procura valores em campos siblings / irmãos tornando este necessario
	var needif = element.getAttribute('needif');
	if(needif){
		needif = needif.split('|');
		var elementSiblings, elementSibling, needifout;
		eval("elementSiblings = element."+needif[0]);
		elementSiblings.each(function(sibling){
			eval("elementSibling = sibling."+needif[1]);
			if(elementSibling.length>0&&value.length<=0)
				if(!needifout)
					needifout = element.getAttribute('msg') || true;
			
		});
		if(needifout)
			return needifout;
	}
	
	//Comparação entre dois campos input
	var twin = element.getAttribute('twin'), msg, twinCheck=false;
	if(twin){
		msg = element.getAttribute('twinmsg');
		$$('input:([twin='+twin+'])').each(function(e){
			if(!msg&&e.getAttribute('twinmsg'))
				msg = e.getAttribute('twinmsg');
				
			if(element.value!=e.value)
				twinCheck =  msg?msg:'Os campos não coincidem';
		});
		if(twinCheck)
			return twinCheck;
	}
	
	var jneedValue = element.getAttribute('jsneed');
	if(jneedValue>1)
		if(value.length<jneedValue)
			return true;
	
	if(jsneed&&(value.length==0))
		return true;
	
	return false;
	
};

element_keyup = function(element){
	var type = element.getAttribute('jstype');
	
	switch(type){
		
		case 'money':
			var numero = element.value;
			if(!numero)
				return;
			if(numero.indexOf(',') > 0) {
				numero = numero.replace(/[^0-9,\.]/gi, '');
			}
			else {
				numero = numero.replace('.', '');
				numero = numero.replace(',', '.');
				numero = number_format(numero, 0, ',', '.');
			}
			element.value = numero;
		break;
		
	};
	
};

element_blur = function(element){
	var type = element.getAttribute('jstype');
	switch(type){
		case 'money':
			if(!element.value)
				return;
			var value = element.value.replace('.', '').replace(',', '.');
			element.value = number_format(value, 2, ',', '.');
		break;
		case 'percent':
			var value = element.value;
			value = value.replace(/\%/g,'').replace(/\,/g,'.');
			
			if(isNaN(value))
				element.value='';
			else
				if(value>100)
					element.value='100%';
					
			if(element.value.indexOf('%')<0&&/\d/.test(element.value)){
				element.value = element.value+'%';
			}
		break;
		
	};
	
};


function valida_cnpj(cnpj){
	var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
	digitos_iguais = 1;
	if (cnpj.length < 14 && cnpj.length < 15)
		return false;
	for (i = 0; i < cnpj.length - 1; i++)
		if (cnpj.charAt(i) != cnpj.charAt(i + 1))
			{
				digitos_iguais = 0;
				break;
			}
	if (!digitos_iguais)
		{
		tamanho = cnpj.length - 2
		numeros = cnpj.substring(0,tamanho);
		digitos = cnpj.substring(tamanho);
			soma = 0;
		pos = tamanho - 7;
		for (i = tamanho; i >= 1; i--)
			{
				soma += numeros.charAt(tamanho - i) * pos--;
				if (pos < 2)
				pos = 9;
			}
		resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
		if (resultado != digitos.charAt(0))
		return false;
		tamanho = tamanho + 1;
		numeros = cnpj.substring(0,tamanho);
		soma = 0;
		pos = tamanho - 7;
		for (i = tamanho; i >= 1; i--)
		{
		soma += numeros.charAt(tamanho - i) * pos--;
		if (pos < 2)
		pos = 9;
		}
		resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
		if (resultado != digitos.charAt(1))
		return false;
		return true;
	}
	else
	return false;
}

function valida_cpf(cpf){
var numeros, digitos, soma, i, resultado, digitos_iguais;
digitos_iguais = 1;
if (cpf.length < 11)
	return false;
for (i = 0; i < cpf.length - 1; i++)
	if (cpf.charAt(i) != cpf.charAt(i + 1))
		  {
		  digitos_iguais = 0;
		  break;
		  }
if (!digitos_iguais)
	{
	numeros = cpf.substring(0,9);
	digitos = cpf.substring(9);
	soma = 0;
	for (i = 10; i > 1; i--)
		  soma += numeros.charAt(10 - i) * i;
	resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
	if (resultado != digitos.charAt(0))
		  return false;
	numeros = cpf.substring(0,10);
	soma = 0;
	for (i = 11; i > 1; i--)
		  soma += numeros.charAt(11 - i) * i;
	resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
	if (resultado != digitos.charAt(1))
		  return false;
	return true;
	}
else
	return false;
}
