(function($) {
	$.fn.ieValidate = function(uf) {
		var input=$(this);
		var estado=uf.toLowerCase();

		$.extend({
			ufConfig:function(uf){
				var ufConfig={
					ac:[{uf:uf, qt_min:13, qt_max:13, dv_a:11, dv_b:12, modulo:11, digitoInicial:['01'], 			  peso_a:[4,3,2,9,8,7,6,5,4,3,2], 	 	peso_b:[5,4,3,2,9,8,7,6,5,4,3,2]}],
					al:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['24'], 			  peso_a:[9,8,7,6,5,4,3,2],       	 	peso_b:[]}],
					ap:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['03'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					am:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					ba:[{uf:uf, qt_min:8,  qt_max:8,  dv_a:7,  dv_b:6,  modulo:0,  digitoInicial:['00'],			  peso_a:[7,6,5,4,3,2], 					peso_b:[8,7,6,5,4,3,2]}],
					ce:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'],			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					df:[{uf:uf, qt_min:13, qt_max:13, dv_a:11, dv_b:12, modulo:11, digitoInicial:['07'],			  peso_a:[4,3,2,9,8,7,6,5,4,3,2], 	 	peso_b:[5,4,3,2,9,8,7,6,5,4,3,2]}],
					es:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'],			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					go:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['10','11','15'], peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					ma:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['12'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					mt:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					ms:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['28'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					mg:[{uf:uf, qt_min:13, qt_max:13, dv_a:11, dv_b:12, modulo:11, digitoInicial:['00'], 			  peso_a:[1,2], 							 	peso_b:[3,2,11,10,9,8,7,6,5,4,3,2]}],
					pa:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['15'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					pb:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					pr:[{uf:uf, qt_min:10, qt_max:10, dv_a:8,  dv_b:9,  modulo:11, digitoInicial:['00'], 			  peso_a:[3,2,7,6,5,4,3,2], 			 	peso_b:[4,3,2,7,6,5,4,3,2]}],
					pe:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:7,  dv_b:8,  modulo:11, digitoInicial:['00'], 			  peso_a:[8,7,6,5,4,3,2], 				peso_b:[9,8,7,6,5,4,3,2]}],
					pi:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					rj:[{uf:uf, qt_min:8,  qt_max:8,  dv_a:7,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[2,7,6,5,4,3,2], 				peso_b:[]}],
					rn:[{uf:uf, qt_min:9,  qt_max:10, dv_a:8,  dv_b:9,  modulo:11, digitoInicial:['20'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[10,9,8,7,6,5,4,3,2]}],
					rs:[{uf:uf, qt_min:10, qt_max:10, dv_a:9,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[2,9,8,7,6,5,4,3,2], 			peso_b:[]}],
					ro:[{uf:uf, qt_min:14, qt_max:14, dv_a:13, dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[6,5,4,3,2,9,8,7,6,5,4,3,2], peso_b:[]}],
					rr:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:9,  digitoInicial:['00'], 			  peso_a:[1,2,3,4,5,6,7,8], 			 	peso_b:[]}],
					sc:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					sp:[{uf:uf, qt_min:12, qt_max:12, dv_a:8,  dv_b:11, modulo:11, digitoInicial:['00'], 			  peso_a:[1,3,4,5,6,7,8,10],			 	peso_b:[3,2,10,9,8,7,6,5,4,3,2]}],
					se:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}],
					to:[{uf:uf, qt_min:9,  qt_max:9,  dv_a:8,  dv_b:0,  modulo:11, digitoInicial:['00'], 			  peso_a:[9,8,7,6,5,4,3,2], 			 	peso_b:[]}]
				}
				return eval("ufConfig."+uf+"[0]");
			}
		});
		estado=$.ufConfig(estado);

		valor=input.val().replace(/[^0-9]/gi,'');

		if(estado.digitoInicial[0]!='00'){
			var error=true;
			for(i=0;i<estado.digitoInicial.length;i++){
				if(valor.substr(0,2)==estado.digitoInicial[i]){error=false;}
			}
			if(error){
				return false;
			}
		}

		var somazero=0;
		for(i=0;i<valor.length;i++){
			somazero=somazero+valor.charAt(i);
		}
		if(somazero==0){
			return false;
		}
		
		if(!isNaN(valor) && (valor.length>=estado.qt_min && valor.length<=estado.qt_max)){
			return valida(valor);
		}else{
			return false;
		}

		function valida(valor){
			valor=new String(valor);
			var digito='';
			var p,d;
			if(estado.uf!='rn'){
				var peso=estado.peso_a;
				var index=estado.dv_a;
			}else{
				var peso=(valor.length==9?estado.peso_a:estado.peso_b);
				var index=(valor.length==9?estado.dv_a:estado.dv_b);
			}
			var resto=0;
			var soma=0;
			var ordem=1;

			if(estado.uf=='ba'){
				estado.modulo=(((valor.charAt(0)>=0 && valor.charAt(0)<6) || valor.charAt(0)==8)?10:11);
			}else if(estado.uf=='ap'){
				var valor100digito=valor.substr(1,7);
				if(valor100digito>=3000001 && valor100digito<=3017000){p=5;d=0;}
				else if(valor100digito>=3017001 && valor100digito<=3019022){p=9;d=1;}
				else if(valor100digito>=3019023){p=0;d=0;}
			}

			while(peso.length>0 && ordem<3){
				soma=0;
				if(estado.uf=='mg' && ordem==1){
					var p=0;
					for(i=0;i<11;i++){
						if(i==3){p=0;}
						produto=(peso[p]*valor.charAt(i));
						produto=new String(produto);
						for(j=0;j<produto.length;j++){soma+=parseInt(produto.charAt(j));}
						p=(p==0?1:0);
					}
				}else{
					if(estado.uf=='ap'){
						soma+=p;
					}
					var numValor;
					for(i=0;i<peso.length;i++){
						numValor=valor.charAt(i);
						if(ordem==2 && (estado.uf=='sp' || estado.uf=='pr') && i==8){
							numValor=digito;
						}else if(ordem==2 && estado.uf=='pe' && i==7){
							numValor=digito;
						}else if(ordem==2 && estado.uf=='ba' && i==6){
							numValor=digito;
						}else if(ordem==2 && (estado.uf=='ac' || estado.uf=='mg') && i==11){
							numValor=digito;
						}
						soma+=(peso[i]*numValor);
					}
					resto=soma%estado.modulo;
				}

				if(estado.modulo==11 && estado.uf!='ba'){
					if(estado.uf=='sp'){
						resto=new String(resto);
						digito=resto.charAt((resto.length)-1);

					}else if(estado.uf=='rn'){
						digito=(soma*10)%estado.modulo;
						if(digito>9){digito=0;}

					}else if(estado.uf=='mg' && ordem==1){
						digito=(10*(Math.ceil((soma/10))))-soma;

					}else if(estado.uf=='ap'){
						digito=(11-resto);
						if(digito==10){
							digito=0;
						}else if(digito==11){
							digito=d;
						}

					}else if(estado.uf=='al'){
						resto=((soma*10) - parseInt((soma*10)/estado.modulo)*estado.modulo);
						digito=(resto==10?0:resto);

					}else if(estado.uf=='am'){
						if(soma<estado.modulo){
							digito=estado.modulo-soma;
						}else{
							digito=((resto<=1)?0:(estado.modulo-resto));
						}

					}else if(estado.uf=='go'){
						if(valor.substr(0,8)==11094402){
							digito=(valor.charAt(8)==0?0:1);
						}else if(resto==0){
							digito=0;
						}else if(resto==1){
							digito=((valor.substr(0,8)>=10103105 && valor.substr(0,8)<=10119997)?1:0);
						}else{
							digito=estado.modulo-resto;
						}

					}else{
						digito=(resto<2?((estado.uf!='ro')?0:((estado.modulo-resto)-10)):(estado.modulo-resto));
					}

				}else if(estado.modulo==9){
					digito=resto;

				}else if(estado.uf=='ba'){
					digito=estado.modulo-resto;
					if(resto==0 || (estado.modulo==11 && resto==1)){
						digito=0;
					}
				}

				if(valor.charAt(index)!=digito){
					return false;
				}

				if(estado.uf!='rn'){
					peso=estado.peso_b;
					index=estado.dv_b;
					ordem++;
				}else{
					ordem=3;
				}
			}
			return true;
		}
	}
})(jQuery);
