Ext.namespace("Ext.ux","Ext.ux.form");

Ext.QuickTips.init();

// Extends Javascript Functions

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };

//
// form extends
//
Ext.ux.colfield = function(form, type, label, name, width, objconffield, objconf )

{

	var config = {
		width: width
	};

	Ext.apply( config, objconf );

	var newField = Ext.ux.retfield( type, label, name, objconffield )
	return newField;
}

Ext.ux.retfield = function( type, label, name, width, objconf )
{
	
	if(type == 'cpfcnpj'){

		var newField = {}, config = {
			fieldLabel: label,
			name: name,
			id: name,
			xtype:'textfield',
			width: width,
			preventScrollbars: true,
			cls: '',
				onBlur: function(){
								try{verificaExiste();}catch(e){}
						  },
			allowBlank: true
		};

	}else{
	
		var newField = {}, config = {
			fieldLabel: label,
			name: name,
			xtype:'textfield',
			id: name,
			width: width,
			preventScrollbars: true,
			cls: '',
			allowBlank: true
		};

	}

	Ext.apply( config, objconf );

	if( config.width == undefined || config.width == 0 ) delete config.width;


	switch( type )
	{
		case 'e':
			config.vtype = 'email';
		case 't':
		case 'text':
			var newField = new Ext.form.TextField( config );
			break;
		case 'tn':
		case 'textnome':
			var newField = new Ext.form.TextField( config );
			newField.on('change', function( field, str ) { field.setValue(Ext.ux.form.masknome(str)); });
			break;
		case 'tel':
			config.maskRe = /[0-9]/;
			config.mask = '(##) ####-####';
			config.minLength = 14;
			//config.valueDefault = '(13';
			var newField = new Ext.form.TextField( config );

			Ext.ux.form.Masking( newField, type );
			break;
		case 'rg':
			config.maskRe = /[0-9]/;
			config.mask = '##.###.###-#';
			config.minLength = 10;
			//config.valueDefault = '(13';
			var newField = new Ext.form.TextField( config );

			Ext.ux.form.Masking( newField, type );
			break;	
			

		case 'cpfcnpj':
			config.maskRe = /[0-9]/;
			config.mask = config.mask1 = '###.###.###-##';
			config.mask2 = '##.###.###/####-##';
			config.minLength = 14;
			var newField = new Ext.form.TextField( config );

			Ext.ux.form.Masking( newField, type );
			newField.on('valid', function( field ) {
				var v = field.getValue(), n = v.replace( /[^0-9]/g, '' );
				if( n.length == 11 && !Ext.ux.form.chkcpf(n))  field.markInvalid('O CPF está incorreto, verifique novamente');
				if( n.length == 14 && !Ext.ux.form.chkcnpj(n)) field.markInvalid('O CNPJ está incorreto, verifique novamente');
				if( n.length > 11 && n.length < 14 ) field.markInvalid('O CNPJ está incompleto');
			});
			
			break;
		case 'd':
		case 'data':
		case 'date':
			config.maskRe = /[0-9\/]/;
			config.mask = '##/##/####';
			var newField = new Ext.form.DateField( config );
			Ext.ux.form.Masking( newField, type );
			
			break;
		case 'hora':
		case 'hour':
			config.maskRe = /[0-9\/]/;
			config.mask = '##:##';
			var newField = new Ext.form.TextField( config );
			Ext.ux.form.Masking( newField, type );
			
			break;
		case 'cep':
			config.maskRe = /[0-9]/;
			config.mask = '#####-###';
			config.minLength = 9;
			var newField = new Ext.form.TextField( config );
			Ext.ux.form.Masking( newField, type );
			break;

		case 'a':
			if( config.width > 0 ) config.width += 4;
			var newField = new Ext.form.TextArea( config );
			break;
	}
	return newField;
}

Ext.ux.form.getSelection = function( el )
{
	var si = false, moz = false, objsel, ret = {};
	if( ( si = el.selectionStart )) moz = true;
	else if( el.createTextRange )
	{
		var objsel = el.ownerDocument.selection.createRange(), r = el.createTextRange();
		if( !r.setEndPoint ) return false;
		r.setEndPoint( "EndToStart", objsel );
		si = r.text.length;
	}

	else return {};

	return { moz: moz, si: si, objsel: objsel };
}

Ext.ux.form.setFieldPosition = function( el, si, moz, objsel )
{
	if( moz === false ) { objsel.move("character", si); objsel.select(); }
	if( moz === true  ) el.setSelectionRange(si, si);
}

//
// filters and validations
//

Ext.ux.form.Masking = function( field, type )
{
	field.on( 'render', function(o) {
		var el = Ext.get( o.id );
		o.maxLength = ( o.mask1 && o.mask2 ? Math.max( o.mask1.length, o.mask2.length ) : o.mask.length );
		o.chkmask = function(e,el,o,hc)
		{
			var si, t = '', tt, lt, m;
			if( this.oldValue == el.value ) return;
			o.twomask( el, o );
			m = o.mask;
			if( hc ) Ext.apply( this, Ext.ux.form.getSelection( el ));
			for(var i = 0, lt = ( tt = el.value.split('') ).length; i < lt; i++ )
				t += ( o.maskRe.test( tt[i] ) ? tt[i] : '' );
			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 = this.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 = "");
				}

			el.value = t.join("").substr(0,m.length);
			if(this.si != lt){
				while(m[this.si] != "#" && m[this.si]) this.si++;
				ini && m[0] != "#" && this.si++;
			}

			else this.si = el.value.length;
			if( hc ) Ext.ux.form.setFieldPosition( el, this.si, this.moz, this.objsel );
		}
		o.twomask = function(el,o)
		{
			if( !o.mask1 || !o.mask2 ) return;
			var t = el.value, r = '';
			var tm1 = o.mask1.replace( /[^#]/g, '' ).length;

			for( var x = 0, l = t.length; x < l; x++ )
				r += ( o.mask.charAt(x) == '#' || x >= o.mask.length ? t.charAt(x) : '' );
			o.mask = ( r.length <= tm1 ? o.mask1 : o.mask2 );
		}
		el.on('keydown',function(e,el) {
			
			Ext.apply( this, Ext.ux.form.getSelection( el ));
			if( this.si > 1 && e.getCharCode() == e.BACKSPACE && this.mask.charAt([this.si-1]) != '#' )
			{
				var x = this.si;
				while( x > 0 && this.mask.charAt(--x) != '#' );
				el.value = el.value.substring( 0, x ) + el.value.substring( this.si, el.value.length );
				this.si = x;
				if( !this.moz )
				{
					this.objsel.move( "character", this.si );
					this.objsel.select();
				} else {
					el.setSelectionRange(this.si, this.si);
				}

				e.preventDefault();
				return false;
			}

			if( !e.isNavKeyPress() && !e.isSpecialKey() && e.getCharCode() != e.DELETE && e.getCharCode() != e.BACKSPACE )
			{
				if( this.si >= this.maxLength && el.value.length >= this.maxLength )
				{
					e.preventDefault();
					return false;
				}
			}

			this.chkmask(e,el,this,true);
			this.oldValue = el.value;

		},o);
		el.on('keyup',function(e,el){
			this.chkmask(e,el,this,true);
		},o);

		el.on('blur',function(e,el){
			if( this.valueDefault != undefined && el.value == this.valueDefault ) this.setValue('');
			this.chkmask(e,el,this,false);
		},o);
		el.on('focus', function(e,el){
			if( el.value == '' && this.valueDefault != undefined ) el.value = this.valueDefault;
		},o);
		el.on('click', function(e,el){
			Ext.apply( this, Ext.ux.form.getSelection( el ));
			if( this.valueDefault != undefined && el.value == this.valueDefault && this.si == 0 )
				Ext.ux.form.setFieldPosition( el, this.valueDefault.length, this.moz, this.objsel );
		},o);
	});
}

Ext.ux.form.masknome = function( str )
{
	var ret = '', v = str.trim().toLowerCase().replace( '/', '/ ' );
	var a = v.split(" ");
	var prep = ['de','do','dos','da','das','e','ou','del','ltda','ltda.','apto','apto.','ap','ap.','apt','apt','conj','conj.','cj','cj.','sala','sl.','andar'];
	var ignore = ['me','sa','s/a'];
	for( i=0; i<a.length; i++ ) ret += (i>0?' ':'') + ( prep.indexOf(a[i].toLowerCase()) == -1 ? ( ignore.indexOf(a[i].toLowerCase()) == -1 ? a[i].substr(0,1).toUpperCase() + a[i].substr(1) : a[i].toUpperCase() ) : a[i].toLowerCase() );
	return ret;
}

Ext.ux.form.chkcpf = function(cpf)
{
	var 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 )
	{
      	var numeros = cpf.substring(0,9); var digitos = cpf.substring(9); var soma = 0;
            for( var i = 10; i > 1; i-- ) soma += numeros.charAt(10 - i) * i;
            var resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
            if( resultado != digitos.charAt(0) ) return false;
            numeros = cpf.substring(0,10); soma = 0;
            for( var 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 true;
	}
	return false;
}

Ext.ux.form.chkcnpj = function(cnpj)
{
      var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
      var digitos_iguais = 1;
      if( cnpj.length != 14 ) return false;
      for( var i = 0; i < cnpj.length - 1; i++ ) if( cnpj.charAt(i) != cnpj.charAt(i + 1)) { digitos_iguais = 0; break; }
      if( !digitos_iguais )
	{
		var tamanho = cnpj.length - 2; var numeros = cnpj.substring(0,tamanho);
		var digitos = cnpj.substring(tamanho); var soma = 0; var 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 true;
	}
	return false;
}
