/*---------------------------------------------------------------------------
 * document: formulario.js
 * author:   Miere L. Teixeira ( miere00 at gmail.com )
 * license:  GPLv3
 *---------------------------------------------------------------------------*/

 function encodePass(original, hidden) {
	var encoded = hex_md5(original.value);
	//alert(original.value + " :: " + encoded);
	hidden.value = encoded;
 }

 function clearPass(form) {
	for (var i=0; i< form.elements.length; i++) {
		element = form.elements[i];
		if (element.getAttribute("type") == "password")
			element.value = "";
	}
 }

 // Colunas dos Campos (fields)
 FNAME = 0;
 FTYPE = 1;
 FVALUE = 2;

/* --------------------------------------------------------------------------
 *  Function    : confirmPassword
 *  Description :
 * --------------------------------------------------------------------------*/
    function confirmPassword (self, obj) {
        str = obj;
        if (typeof(obj) == "string")
            obj = eval("self.form." + str);
        if (!obj) {
            obj = document.getElementById(str);
            if (!obj){
                debug("Não foi tratar a confirmação de senha: campo não encontrado.");
                return false;
            }
        }

        if (self.value == obj.value && self.value == "")
            return true;
		//  || self.value.length < 6
        if (self.value != obj.value) {
			alert("Confirmação de senha não confere!");
			obj.focus();
            return false;
		}

        return true;
    }
    
/* --------------------------------------------------------------------------
 *  Function    : numberField
 *  Description : garante que se digite apenas numeros nesse campo
 * --------------------------------------------------------------------------*/
	function CPFCNPJField (field, e) {
		var key, campo;

		// Obtem o codigo da letra a ser inserida e o campo
        if (!e) e = window.Event;
		if (!e.type == "keydown") return false;
        if (e.keyCode) key = e.keyCode;
        if (e.which) key = e.which;
        if (e.target) campo = e.target;
        else if (e.srcElement) campo = e.srcElement;
        
        if (key == 9) { tabulate(e); e.returnValue = true; return true; }
		else if (key == 8
		||  key == 35
		||  key == 36
		||  key == 37
		||  key == 39
		||  key == 46) { e.returnValue = true; return true; }
		else if (key < 48 || key > 57) { e.returnValue = false; return false; }
		
		var breaks = null;
		var valor = "";
		var num = field.value + " ";
		num = num.replace(/[\.\/\- ]*/g, "");
		
		// CNPJ
		if (num.length >= 11) breaks = [
				[0, 2, "."],
				[2, 3, "."],
				[5, 3, "/"],
				[8, 4, "-"]
			];
		// CPF
		else breaks = [
				[0, 3, "."],
				[3, 3, "."],
				[6, 3, "-"]
			];
		
		pos = 0;
		for (var i=0; i<breaks.length; i++) {
			if (num.length < (breaks[i][0] + breaks[i][1])) break;
			valor+= num.substr(breaks[i][0], breaks[i][1]) + breaks[i][2];
			pos = breaks[i][0] + breaks[i][1];
		}
		
		valor += num.substr(pos);
		field.value = valor;
	}
    
/* --------------------------------------------------------------------------
 *  Function    : phoneField
 *  Description : garante que se digite apenas numeros nesse campo
 * --------------------------------------------------------------------------*/
	function phoneField (field, e) {
		var key, campo;

		// Obtem o codigo da letra a ser inserida e o campo
        if (!e) e = window.Event;
		if (!e.type == "keydown") return false;
        if (e.keyCode) key = e.keyCode;
        if (e.which) key = e.which;
        if (e.target) campo = e.target;
        else if (e.srcElement) campo = e.srcElement;
        
        // Se foi usada a tecla "Tab" vai para o proximo campo...
        if (key == 9) { tabulate(e); e.returnValue = true; return true; }
        // Outras teclas permitidas...
		else if (
		    key == 8
		||  key == 35
		||  key == 36
		||  key == 37
		||  key == 39
		||  key == 46) { e.returnValue = true; return true; }
		// Numeros...
		else if (key < 48 || key > 57) { e.returnValue = false; return false; }
		
		var valor = "";
		var num = field.value + " ";
		num = num.replace(/[\(\)\.\/\- ]*/g, "");
		
		var breaks = [
				[0, 0, "("],
				[0, 2, ")"],
				[2, 0, " "],
				[2, 4, "-"],
				[6, 4, " "],
				[10, 0, "("],
				[10, 2, ")"],
				[12, 0, " "],
				[12, 4, "-"]
			];
		
		pos = 0;
		for (var i=0; i<breaks.length; i++) {
			if (num.length < (breaks[i][0] + breaks[i][1])) break;
			
			//alert(num + " [" + breaks[i][0] + ", " + num.substr(breaks[i][0], breaks[i][1]));
			valor+= num.substr(breaks[i][0], breaks[i][1]) + breaks[i][2];
			pos = breaks[i][0] + breaks[i][1];
		}
		
		valor += num.substr(pos);
		field.value = valor;
	}
	
	function validateCPFCNPJ(valor) {
		if (valor.length <= 14) return validateCPF(valor);
		else return validateCNPJ(valor);
	}
	
/* --------------------------------------------------------------------------
 *  Function    : validateCNPJ
 *  Description :
 * --------------------------------------------------------------------------*/
	function validateCNPJ(CNPJ) {
		if (CNPJ.length < 18) return false;
		CNPJ = CNPJ.replace(/[\/\.\- ]*/g, "");
		
		var a = [];
		var b = new Number;
		var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
		for (i=0; i<12; i++){
			a[i] = CNPJ.charAt(i);
			b += a[i] * c[i+1];
		}
		if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
		b = 0; for (y=0; y<13; y++) { b += (a[y] * c[y]); }
		if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
		if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13]))
			return false;
		return true;
	}

/* --------------------------------------------------------------------------
 *  Function    : validateCPF
 *  Description :
 * --------------------------------------------------------------------------*/
    function validateCPF(cpf) {
		cpf = cpf.replace(/[\.\/\- ]*/g, "");
		if (cpf.length != 11) return false;

        if (cpf == "00000000000" ||
            cpf == "11111111111" ||
            cpf == "22222222222" ||
            cpf == "33333333333" ||
            cpf == "44444444444" ||
            cpf == "55555555555" ||
            cpf == "66666666666" ||
            cpf == "77777777777" ||
            cpf == "88888888888" ||
            cpf == "99999999999")
                return false;

        var a = [];
        var b = new Number;
        var c = 11;

        for (i=0; i<11; i++){
            a[i] = cpf.charAt(i);
            if (i < 9) b += (a[i] * --c);
        }

        if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
        b = 0; c = 11;
        for (y=0; y<10; y++) b += (a[y] * c--);
        if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
        if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]))
            return false;
        return true;
    }

	function clearMe(obj) {
		if (!obj) return;
		obj.value = "";
	}

	function hide(id) {
		var obj = document.getElementById(id);
		if (!obj) return;
		obj.style.display = 'none';
	}

	function selectMe(id, value) {
		var uf = document.getElementById(id);
		if (value > 0) {
			for (var i=0; i<uf.options.length; i++) {
				var option = uf.options[i];
				if (parseInt(option.value, 10) == value) {
					uf.selectedIndex = i;
				}
			}
		}
	}

	function fieldValue(clear, field, id) {
		if (clear && field.value == id)
			field.value = "";
		else if (!clear && field.value == "")
			field.value = id;
	}

	function toogleDisabled (field) {
		var b = field.disabled;
		field.disabled = (b ? false : true);
		if (b) field.className = field.className.replace(/ *disabled/, "");
		else field.className+= " disabled";
	}

/* --------------------------------------------------------------------------
 *  Function    : Formulario
 *  Description :
 * --------------------------------------------------------------------------*/
	function Formulario (form) {
		this.form = form;

		f = document.forms[form];
		if (!f) {
			alert("[Formulario]: Não foi possivel encontrar o formulário!");
			return;
		}

		this.fields = [];
		this.separator = "\t\t|\t\t";
		this.modified = false;

		this.addField = function (name, tipo, value) {
			var field = [];
			field[FNAME] = name;
			field[FTYPE] = tipo;
			field[FVALUE] = value;

			this.fields[this.fields.length] = field;
		}

		this.parse = function (value) {
			value = value.split(this.separator);
			for (var i=0; i<value.length; i++) {
				var pos = value[i].indexOf('=');
				value[i] = [value[i].substring(0, pos), value[i].substring(pos+1)];
			}

			return value;
		}

		this.hasChanged = function(){
			if (this.locked) return false;

			for (var i=0; i<this.fields.length; i++) {
				var field = this.fields[i];
				var f = eval("document.forms[this.form]." + field[FNAME]);
				if (!f) {
					alert("[Formulário] O campo '" + field[FNAME] + "' foi removido???");
					return true;
				}
				switch (field[FTYPE]) {
					case "Select":
					case "select":
						if (field.options[field.options.selectedIndex].value != field[FVALUE])
							return true;
						break;
					case "input":
					case "string":
					case "hidden":
					case "textarea":
					default:
						if (f.value != field[FVALUE])
							return true;
						break;
				}
			}

			return false;
		}
		this.discard = function () { this.locked = true; }
		this.clear = function () { this.locked = false; this.fields = []; }

		this.reload = function (url) {
			for (var i=0; i<this.fields.length; i++) {
				var name = this.fields[i][FNAME];
				var tipo = this.fields[i][FTYPE];
				var value = "";
				var field = eval("document.forms[this.form]." + name);

				switch (tipo) {
					case "Select":
					case "select":
						selectMe(field.getAttribute('id'), field.options[field.options.selectedIndex].value );
						break;
					case "hidden":
					case "string":
					case "input":
					case "textarea":
					default:
						this.fields[i][FVALUE] = field.value;
						break;
				}
			}
		}

		this.load = function (url) {
			var response = sendXML(url);
			response = this.parse(response);
			for (var i=0; i<this.fields.length; i++) {
				var name = this.fields[i][FNAME];
				var tipo = this.fields[i][FTYPE];
				var value = "";

				for (var j = 0; j < reponse.length; j++)
					if (response[j][FNAME] = name) {
						value = response[j][1];
						break;
					}

				var field = eval("document.forms[this.form]." + name);
				if (!field) {
					alert('[Formulário] Erro: não encontrei o campo ' + name);
					continue;
				}
				
				switch (tipo) {
					case "Select":
					case "select":
						selectMe(field.getAttribute('id'), value);
						break;

					case "SuperSelect":
					case "superSelect":
						field = eval(name + "SuperSelect");
						field.select(value);
						break;

					case "SelectBox":
					case "selectBox":
						field = eval(name + "SelectBox");
						if (value.indexOf(this.separator) >= 0)
							value = value.split(this.separator);
						else
							value = [ value ];

						for (var i = 0; i < value.length; i++) {
							var item = field.get(value);
							field.select(item.id);
						}
						break;

					case "string":
					case "input":
					case "textarea":
					default:
						field.value = value;
						break;
				}
			}
		}

		this.submit = function (url) {
			var string = "";
			for (var i = 0; i < this.fields.length; i++) {
				var name = this.fields[i][FNAME];
				var tipo = this.fields[i][FTYPE];
				var field = eval("document.forms[this.form]." + name);
				var value = "";
				
				if (!field) {
					alert('[Formulário] Erro: não encontrei o campo ' + name);
					continue;
				}
				
				switch (tipo) {
					case "Select":
					case "select":
						value = field.options[field.options.selectedIndex].value;
						break;
					case "SelectBox":
					case "selectBox":
					case "SuperSelect":
					case "superSelect":
						value = field.value;
						break;
					case "cpf":
						if (validateCPF(field.value)) {
							alert('Campo de CPF inválido!');
							field.focus();
							return null;
						}

						value = field.value;
						break;
					case "checkbox":
						value = (field.checked ? 1 : 0);
						break;
					case "double":
					case "float":
						value = field.value.replace(/,/g, ".");
						break;
					case "string":
					case "input":
					case "hidden":
					case "textarea":
					default:
						value = field.value;
						break;
				}

				if (string != "") string+= "&";
				string+= name + "=" + escape(value);
			}

			response = sendPost(url, string);
			if (response.toLowerCase().indexOf('erro') >= 0) {
				alert(response);
				return null;
			}

			this.modified = false;
			return response;
		}
	}
