/*
	Programador .......: Marcelo Salton Disconzi
	Empresa ...........: Dataview Soluções Tecnológicas
	Data de criação ...: 10/05/2009
	Classe de Arquivo .: Arquivos de script - classe de funcionalidades
	Projeto ...........: Reformulação do modelo de Intranets
	Ultima Alteração ..: 14/05/2009
	Funcionalidades....: Contem métodos úteis a várias outras classes, miscelania
	Arguments .........: -
	
	future features....: modificar o método getElementsByAttribute para pegar também por valor de attributo
						 e testar a prototipação de objetos Object, IE
						 Testar o funcionamento da prototypação com Object
						 (Check Cpf //tá errado! o método deve ser limpo de referências externas)
						 colocar mask na classe do form
*/

function Color()
{
	this.tr  = { hhover:{bkg:null,brd:'1px blue solid',fon:'red'},
				 hout:{bkg:null,brd:'1px red solid',fon:'#888'},
				 par  :{bkg:'#fff',brd:null},
				 impar:{bkg:'#fcf3f4',brd:null},
				 hover:{bkg:'#a82f3e',brd:null,fon:'#fff'},
				 check:{bkg:'#91e6f8',brd:null},
				 out:{bkg:null,brd:null,fon:'blue'}
				}

	this.inp = { hover:{bkg:'#d2f192',brd:'1px #000 dotted',fon:'#000'},
				 out:  {bkg:'#fff',brd:'1px #888 solid',fon:'#888'},
				 off:  {bkg:'#ddd',brd:'1px #ccc solid',fon:'#999'},
				 focs:  {bkg:'#7fb7eb',brd:'1px #7fb7eb solid',fon:'#fff'}}

	this.fast = { hover:{bkg:'#888',brd:null,frg:'#fff'},
				  out: {bkg:'transparent',brd:null,frg:'#777'},
				  clic: {bkg:'#f2bf76',brd:null,frg:'#000'},
				  check: {bkg:'#a2dd7c',brd:null,frg:'#000'}
				}
}


function Util()
{
	this.addEvent = function(obj,evtype,func)
	{
		try
		{
			obj.addEventListener(evtype,func,true);
		}
		catch(err) // for IE
		{
			obj.attachEvent("on"+evtype,func,true);
		}
		finally
		{
			if(arguments.length==5)
				arguments[4].listeners.push({nome:arguments[3],'evtype':evtype,'func':func});
		}
	}
	//----------------------------------------------------------------------------------------------
	this.removeEvent = function(obj,_class,nome)
	{
		for(var i = 0; i< _class.listeners.length; i++)
		{
			if(nome==_class.listeners[i].nome)
			{
				try
				{	
					obj.removeEventListener(_class.listeners[i].evtype,_class.listeners[i].func,true);
				}
				catch(err)
				{
					obj.detachEvent("on"+_class.listeners[i].evtype,_class.listeners[i].func,true);
				}
				return true;
			}	
		}
		return false;
	}	
	//----------------------------------------------------------------------------------------------
	this.gE = function(id)
	{
		return document.getElementById(id)
	}
	//----------------------------------------------------------------------------------------------
	this.hex2Unicode = function(str)
	{
		return str.replace('\\x','\\u00')
	}
 	//----------------------------------------------------------------------------------------------
	this.url_encode = function(str)
	{ 
        var hex_chars = "0123456789ABCDEF"; 
        var noEncode = /^([a-zA-Z0-9\_\-\.])$/; 
        var n, strCode, hex1, hex2, strEncode = ""; 

        for(n = 0; n < str.length; n++)
            if (noEncode.test(str.charAt(n)))
				strEncode += str.charAt(n); 
            else
			{ 
                strCode = str.charCodeAt(n);
                hex1 = hex_chars.charAt(Math.floor(strCode / 16));
                hex2 = hex_chars.charAt(strCode % 16);
                strEncode += "%" + (hex1 + hex2);
            } 
        return strEncode; 
    } 
 	//----------------------------------------------------------------------------------------------
    this.url_decode = function(str)
	{ 
        var n, strCode, strDecode = ""; 

        for (n = 0; n < str.length; n++)
			if (str.charAt(n) == "%")
			{ 
                strCode = str.charAt(n + 1) + str.charAt(n + 2); 
                strDecode += String.fromCharCode(parseInt(strCode, 16)); 
                n += 2; 
            }
			else 
				strDecode += str.charAt(n); 
        return strDecode; 
    }
 	//----------------------------------------------------------------------------------------------
	this.mrand = function(vmin,vmax)
	{
		var seed = new Date();
		var rand = ( Math.round(Math.random()*seed.getTime()) % (vmax+1));
		return (rand < vmin) ? mrand(vmin,vmax) : rand;
	}
	//----------------------------------------------------------------------------------------------
	this.getAbsoluteScreenSize = function()
	{
		var lure = document.body.appendChild(document.createElement('b'));
		lure.style.position='absolute';
		lure.style.fontSize=0;
		lure.style.padding=0;
		lure.style.right=0;
		lure.style.bottom=0;
		return {width:lure.offsetLeft,height:lure.offsetTop}
	}
	//----------------------------------------------------------------------------------------------
	this.getElementsByAttribute = function(att)
	{	
		var arr =[];
		var ss = (arguments.length == 1) ? document : arguments[1];
		var inp = ss.getElementsByTagName('*'); // what porra is this?
		for(var i = 0; i< inp.length; i++)
		{
				
			if(inp[i].getAttribute(att) !=  null)
				arr.push(inp[i]);
		}
		return arr;
		
		//maldito IE, projeto do Object.prototype abortado
	}
	//----------------------------------------------------------------------------------------------
	this.dfMask = function(e,l,s,c,f) 
	{
		//possibilitar a escolha de um array de caracteres para ser usada na mascara, escolhe via construtor
		
		
		//110,190,188
		//------------------------------------------------------------------------------------------
		// e = evento / l = array de tamanho dos segmentos / t = tamanho da string
		//s = spacamento, c = caracter do spacamento
		// função retorna true qdo a mascara estiver completamente preenchida
	    // f = fixed tape mode, number or char (N,C)
		m = 0;  //tamanho máximo da entrada
		var t,sta,end;// target // start select // fim select
		var lim = new Array();  
		var exc = new Array(8,9,17,116) // exceções | inicialmente só backspace,tab,ctrl e f5
		if(arguments.length > 5)
			exc = new Array(8,9,17,116,110,190); // forma cachorra, melhorar depois
		c = new Array(s+1).join(c);
		t = (document.ISGECKO) ? e.currentTarget : e.srcElement;
		
		if(document.ISGECKO)
		{
			sta = end = t.selectionStart;
		}
		else
			sta = end = Math.abs(document.selection.createRange().moveStart("character", -1000000));		
		
		if(!t.value.length) // adiciona só no lenght 0, não há necessidade de repetição
		{
			if(document.ISGECKO)
			{
				t.onclick  = function(){t.selectionStart = t.value.length; t.selectionEnd   = t.value.length;}
				t.onselect = function(){t.selectionStart = t.value.length; t.selectionEnd  = t.value.length;}
			}
			else
			{
				t.onclick = function(e){var range = t.createTextRange(); range.moveStart("character", t.value.length); range.moveEnd("character", t.value.length); range.select();}
				t.onselect = function(e){var range = t.createTextRange(); range.moveStart("character", t.value.length); range.moveEnd("character", t.value.length); range.select();}
			}
		}
		for(var i in l){ m+= l[i]; lim[i] = (m+(s*i));}
		
		m = (m + (l.length - 1)*s);
		
        t.setAttribute('maxlength',m); // evita a entrada de 3 no final
		switch(f)
        {
            case 'N':
                var flag = (e.keyCode > 105 || e.keyCode < 48 || (e.keyCode > 57 && e.keyCode < 96)); 
            	break;
            case 'C':
                var flag = !(e.keyCode > 105 || e.keyCode < 48 || (e.keyCode > 57 && e.keyCode < 96)); 
        		break;
        }
        
        if(flag || t.value.length >= m) // apenas números
		{
			for(var i in exc)  // percorre o vetor de exceções
			{
				if(exc[i] == e.keyCode)
				{
					for(var j in lim)
					{
						if(sta == (lim[j]+s+1))
						{
							if(e.keyCode == 8) // inicialmente sem sentido (1 valor apenas)
							{
								t.value = t.value.substr(0,t.value.length-s);
							}
							else
								continue;
						}
					}
					return false;
				}
			}
			
			try{e.preventDefault();}catch(err){e.returnValue = false}
			
			return ((t.value.length+1) >=m) ? true : false;
		}
		else
		{
			for(var i = 0; i< l.length -1; i++) 
				if(t.value.length == lim[i])
					t.value += c;
				
			if((t.value.length+1) >=m)
			{
				var key;
				switch(String.fromCharCode(e.keyCode)) // IE LIXO
				{
					case 'a':case '1': key = 1; break;
					case 'b':case '2': key = 2; break;
					case 'c':case '3': key = 3; break;
					case 'd':case '4': key = 4; break;
					case 'e':case '5': key = 5; break;
					case 'f':case '6': key = 6; break;
					case 'g':case '7': key = 7; break;
					case 'h':case '8': key = 8; break;
					case 'i':case '9': key = 9; break;
					case '`':case '0': key = 0; break;
					default : String.fromCharCode(e.keyCode);
				}

				t.value = t.value+''+key;
				try{e.preventDefault();}catch(err){e.returnValue = false}
				return true;
			}
			else
				return false;
		}
	}
	//----------------------------------------------------------------------------------------------
	this.checkCpf = function(str)
	{		
		str = str.normalize(); //tá errado! o método deve ser limpo de referências externas

		var x = new Array(0,0), y = 0;
	
		for(var i = 1; i < 3; i++)
		{
			y = 0;
			for(var j = 1; j < 10; j++)
				y += (parseInt(str.charAt(j-1)) * ((10+i) - j));
			
			y = (!(i%2)) ? y += (2*x[0]) : y;
			y = (y%11);
			x[i-1] = (!y || y == 1) ? 0 : (11 - y);
		}
		
		return (str.substr(9,11) == x.join('')) ? true : false;
	}
}
