/*	----------------------------------------------------------------- 
	Classe Swiss Knife - Utilitários de Desenvolvimento
	Desenvolvida por Anderson Triacca - anderson@andersontriacca.com
	Data de Criação: 19/02/2007
	Última Modificação: 14/09/2009
-----------------------------------------------------------------	*/
/*
*
*	Declaração da Classe
*
*/
function SwissKnife() {
	/*
	*
	* 	@description			Adiciona Ouvintes a ações de DOM
	*
	*	@param		obj			Objeto a ser monitorado
	*	@param		evento		Evento do objeto a ser monitorado
	*	@param		funcao		função a disparar junto com o evento
		@return					void
	*
	*/
	SwissKnife.prototype.addListener = addListener;		
	function addListener(obj, evento, funcao) {
		if(window.attachEvent) {
			obj.attachEvent('on'+evento, funcao);
		} else{
			obj.addEventListener(evento, funcao, false);
		} 
	}
	
	/*
	*
	* 	@description			Busca Valores de Querystring
	*
	*	@param		string		Nome da variável a buscar
	*	@return					valor contido na variável "string"
	*
	*/
	var req = window.location.search.substr(1,window.location.search.length);
	var dbl = req.split('&');
	var aPrm = new Array();
	var aVal = new Array();
	var objQS = new Object();
	for (i=0;i < dbl.length;i++) {
	  aPrm[i+1] = dbl[i].substring(0,dbl[i].indexOf('='));
	  aVal[i+1] = unescape(dbl[i].substring(dbl[i].indexOf('=')+1,dbl[i].length));
	  objQS[aPrm[i+1]] = aVal[i+1];
	}
	SwissKnife.prototype.retornarQueryString = retornarQueryString;		
	function retornarQueryString(string) {
	  return eval("objQS." + string);
	}
	
	/*
	*
	* 	@description			Substitui o conteúdo de uma DIV por um objeto SWF
	*
	*	@param		swf			Caminho do SWF a substituir
	*	@param		alvo		ID do elemento DOM a ser preenchido com o SWF
	*	@param		altura		Altura do SWF
	*	@param		largura		Largura do SWF
	*	@param		[variavel]	Array com as variáveis a Inserir dentro do SWF
	*	@param		[valor]		Array com os valores a Inserir dentro do SWF
	*	@return					void
	*
	*/
	SwissKnife.prototype.addSwf = addSwf;		
	function addSwf(swf, alvo, largura, altura, variavel, valor){
		var so = new SWFObject(swf, alvo, largura, altura, "8", "");
		if(variavel){
			for(i=0;i<variavel.length;i++){
				so.addVariable(variavel[i], valor[i]);
			}
		}
		so.addParam("wmode", "transparent");
		so.write(alvo);
	}
	
	/*
	*
	* 	@description			Sorteia um Número Randômico entre 1 e "limite"
	*
	*	@param		limite		Maior número a ser gerado
	*	@return					Número sorteado
	*
	*/
	SwissKnife.prototype.randomico = randomico;
	function randomico(limite){
		limite += 1;
		num = Math.floor(Math.random()*limite);
		if(num == 0){
			randomico(limite-1);
		} else{
			return num;
		}
	}
	
	/*
	*
	* 	@description			Verifica valores nos índices de um Array
	*
	*	@param		array		Array a ser consultado
	*	@param		valor		Valor a buscar dentro do Array
	*	@return		boolean		False se o valor não for encontrado no array, o valor se o mesmo for encontrado
	*
	*/
	SwissKnife.prototype.in_array = in_array;
	function in_array(array, valor){
		var retorno = false;
		for(i=0;i<array.length;i++){
			if(array[i] == valor){
				retorno = valor;	
			}
		}
		return retorno;
	}
	
	/*
	*
	* 	@description			Faz validação e limpeza automática dos campos do formulário
	*
	*	@return					void
	*
	*/
	SwissKnife.prototype.validaFormularios = validaFormularios;
	function validaFormularios(){
		// Decalaração das Variáveis
		formularios = new Array();
		var inputs = new Array();
		var textareas = new Array();
		var valores_padrao = new Array();
		contador = 0;
		// Pegando todos formulários, inputs text e textareas e largando nas variáveis
		$('form').each(function(){
			formularios[contador] = $(this);
			inputs[contador] = new Array();
			textareas[contador] = new Array();
			valores_padrao[contador] = new Array();
			$('input', this).each(function(){
				if($(this).attr('type') == 'text'){
					inputs[contador].push($(this));
					valores_padrao[contador].push($(this).attr('value'));
				}
			})
			$('textarea', this).each(function(){
				textareas[contador].push($(this));	
				valores_padrao[contador].push($(this).attr('innerHTML'));
			})
		})
		// Fazendo a limpeza dos inputs de texto
		for(i=0;i<inputs.length;i++){
			for(j=0;j<inputs[i].length;j++){
				var contador = i;
				var valor = false;
				inputs[i][j].attr('rel', j);
				inputs[i][j].focus(function(j){
					valor = in_array(valores_padrao[contador], $(this).attr('value'));
					if(valor){
						$(this).attr('value', '');	
					}
				})
				inputs[i][j].blur(function(){
					if($(this).attr('value') == '' && valor){
						$(this).attr('value', valor);	
					} else if($(this).attr('value') == ''){
						numero_input = $(this).attr('rel');
						$(this).attr('value', valores_padrao[contador][numero_input]);	
					}
				})
			}
		}
		// Fazendo a limpeza dos textareas
		for(i=0;i<textareas.length;i++){
			for(j=0;j<textareas[i].length;j++){
				var contador = i;
				var valor = false;
				textareas[i][j].focus(function(){
					valor = in_array(valores_padrao[contador], $(this).attr('value'));
					if(valor){
						$(this).attr('value', '');	
					}
				})
				textareas[i][j].blur(function(){
					if($(this).attr('value') == '' && valor){
						$(this).attr('value', valor);	
					}
				})
			}
		}
		// Monitorando o submit dos Formulários
		for(i=0;i<formularios.length;i++){
			var contador = i;
			formularios[i].submit(function(){
				var retorno = true;
				if(!validaInputs($(this), inputs[contador], valores_padrao[contador])){
					retorno = false;
				} else{
					if(!validaTextareas($(this), textareas[contador], valores_padrao[contador])){
						retorno = false;
					}
				}
				return retorno;
			})
		}
	}
	
	/*
	*
	* 	@description			Faz validação dos campos Input do formulário
	*
	*	@param		form		Formulário a ser validado
	*	@param		campos		Array contendo os inputs a serem validados
	*	@param		valores		Array contendo os valores originais dos campos
	*	@return					boolean
	*
	*/
	function validaInputs(form, campos, valores){
		var retorno = true;
		var campo = false;
		for(k=0;k<campos.length;k++){
			if(campos[k].attr('accept') == 'binded'){
				if(campos[k].attr('value') == '' || !!in_array(valores, campos[k].attr('value'))){
					retorno = false;
				}
				if(campos[k].attr('id') == 'email'){
					var expression = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
					if(!expression.test(campos[k].attr('value'))){
						retorno = false;
					}
				}
				if(!retorno){
					alert('O campo "'+campos[k].attr('title')+'" é obrigat\u00F3rio');
					campos[k].focus();
					return false;
				}
			}
		}
		return true;
	}
	
	/*
	*
	* 	@description			Faz validação dos textareas do formulário
	*
	*	@param		form		Formulário a ser validado
	*	@param		campos		Array contendo os inputs a serem validados
	*	@param		valores		Array contendo os valores originais dos campos
	*	@return					boolean
	*
	*/
	function validaTextareas(form, campos, valores){
		var retorno = true;
		var campo = false;
		for(k=0;k<campos.length;k++){
			if(campos[k].attr('accept') == 'binded'){
				if(campos[k].attr('value') == '' || !!in_array(valores, campos[k].attr('value'))){
					retorno = false;
				}
				if(campos[k].attr('id') == 'email'){
					var expression = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
					if(!expression.test(campos[k].attr('value'))){
						retorno = false;
					}
				}
				if(!retorno){
					alert('O campo "'+campos[k].attr('title')+'" é obrigat\u00F3rio');
					campos[k].focus();
					return false;
				}
			}
		}
		return true;
	}
	
	/*
	*
	* 	@description			Função que pré-carrega uma imagem no cache no navegador
	*
	*	@param		caminho		Caminho da imagem a pré-carregar
	*	@return		boolean		true se a imagem estiver carregada, false se não estiver
	*
	*/
	SwissKnife.prototype.preCarrega = preCarrega;
	function preCarrega(caminho){
		var objImagem = new Image();
		objImagem.src=caminho;
		objImagem.onload = function(){
			return true;
		}
		objImagem.onerror = function(){
			return false;
		}
	}
	
	/*
	*
	* 	@description			Função que criptografa uma string no padrão base64
	*
	*	@param		input		String		String a Ser criptografada
	*	@return					String		String criptografada
	*
	*/
	SwissKnife.prototype.base64_encode = base64_encode;
	var keyStr = "ABCDEFGHIJKLMNOP"+"QRSTUVWXYZabcdef"+"ghijklmnopqrstuv"+"wxyz0123456789+/"+"=";
	function base64_encode(input) {
	  input = escape(input);
	  var output = "";
	  var chr1, chr2, chr3 = "";
	  var enc1, enc2, enc3, enc4 = "";
	  var i = 0;
	
	  do {
		 chr1 = input.charCodeAt(i++);
		 chr2 = input.charCodeAt(i++);
		 chr3 = input.charCodeAt(i++);
	
		 enc1 = chr1 >> 2;
		 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
		 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
		 enc4 = chr3 & 63;
	
		 if (isNaN(chr2)) {
			enc3 = enc4 = 64;
		 } else if (isNaN(chr3)) {
			enc4 = 64;
		 }
	
		 output = output +
			keyStr.charAt(enc1) +
			keyStr.charAt(enc2) +
			keyStr.charAt(enc3) +
			keyStr.charAt(enc4);
		 chr1 = chr2 = chr3 = "";
		 enc1 = enc2 = enc3 = enc4 = "";
	  } while (i < input.length);
	
	  return output;
	}
	
	/*
	*
	* 	@description			Função que descriptografa uma string do padrão base64
	*
	*	@param		input		String		String a Ser descriptografada
	*	@return					String		String descriptografada
	*
	*/
	SwissKnife.prototype.base64_decode = base64_decode;
	function base64_decode(input) {
	  var output = "";
	  var chr1, chr2, chr3 = "";
	  var enc1, enc2, enc3, enc4 = "";
	  var i = 0;
	  var base64test = /[^A-Za-z0-9\+\/\=]/g;
	  if (base64test.exec(input)) {
		 alert("Anten\u00E7\u00E3o! Alguns caracteres s\u00E3o inv\u00E1lidos e podem ocorrer erros na convers\u00E3o.");
	  }
	  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
	
	  do {
		 enc1 = keyStr.indexOf(input.charAt(i++));
		 enc2 = keyStr.indexOf(input.charAt(i++));
		 enc3 = keyStr.indexOf(input.charAt(i++));
		 enc4 = keyStr.indexOf(input.charAt(i++));
	
		 chr1 = (enc1 << 2) | (enc2 >> 4);
		 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
		 chr3 = ((enc3 & 3) << 6) | enc4;
	
		 output = output + String.fromCharCode(chr1);
	
		 if (enc3 != 64) {
			output = output + String.fromCharCode(chr2);
		 }
		 if (enc4 != 64) {
			output = output + String.fromCharCode(chr3);
		 }
	
		 chr1 = chr2 = chr3 = "";
		 enc1 = enc2 = enc3 = enc4 = "";
	
	  } while (i < input.length);
	
	  return unescape(output);
	}
}
