/**
 * Daqui em diante, está o objeto SinglePoint, entre outros objetos utilitários,
 * que deverão agregar métodos a serem utilizados na View Tier.
 * 
 * @author Bruno Paulino
 */
function SinglePoint() {
	this._author = "Bruno Paulino de Almeida";
	this._vendor = "Single Point Technology";
	this._version = "1.0.0";
	this.debugEnabled = false;
	this.context = "/";

	this.KEY_CODE_NUMPAD_0 = 96;
	this.KEY_CODE_NUMPAD_9 = 105;
	this.KEY_CODE_KEYPAD_0 = 48;
	this.KEY_CODE_KEYPAD_9 = 57;
	this.KEY_CODE_KEYPAD_MINUS = 189;
	this.KEY_CODE_NUMPAD_MINUS = 109;
	this.KEY_CODE_HOME = 36;
	this.KEY_CODE_END = 35;
	this.KEY_CODE_BACKSPACE = 8;
	this.KEY_CODE_DELETE = 46;
	this.KEY_CODE_TAB = 9;
	this.KEY_CODE_ARROW_LEFT = 37;
	this.KEY_CODE_ARROW_UP = 38;
	this.KEY_CODE_ARROW_RIGHT = 39;
	this.KEY_CODE_ARROW_DOWN = 40;
	this.KEY_CODE_KEYPAD_PERIOD = 190;
	this.KEY_CODE_KEYPAD_COMMA = 188;
	this.KEY_CODE_NUMPAD_PERIOD = 194;
	this.KEY_CODE_NUMPAD_COMMA = 110;

	this.FRACTION_NUMBER = 2;
	this.scrollableInterval = null;
}

SinglePoint.prototype = {
	allowType : function(evt, obj) {
		var validChars = obj.getAttribute("validChars") ? obj.getAttribute("validChars").toUpperCase() : obj.getAttribute("validChars");
		var value = obj.value;
		this.debug("Caracteres válidos: " + validChars);
		this.debug("Tecla pressionada: " + evt.keyCode);

		switch(evt.keyCode) {
			case(this.KEY_CODE_HOME):
			case(this.KEY_CODE_END):
			case(this.KEY_CODE_BACKSPACE):
			case(this.KEY_CODE_DELETE):
			case(this.KEY_CODE_TAB):
			case(this.KEY_CODE_ARROW_LEFT):
			case(this.KEY_CODE_ARROW_UP):
			case(this.KEY_CODE_ARROW_RIGHT):
			case(this.KEY_CODE_ARROW_DOWN):
				evt.returnValue = true;
				return(true);
			default :
				var regexp = new RegExp("[" + validChars + "]");

				this.debug(regexp);
				this.debug("regexp.test(" + this.toChar(evt.keyCode, evt) + ") = " + regexp.test(this.toChar(evt.keyCode, evt)));

				if(regexp.test(this.toChar(evt.keyCode, evt))) {
					if(value.indexOf("-") != -1 && this.toChar(evt.keyCode, evt) == "-") {
						obj.value = value.replace("-", "");

						evt.returnValue = false;
						return(false);
					}

					if(value.indexOf(".") != -1 && (this.toChar(evt.keyCode, evt) == "." || this.toChar(evt.keyCode, evt) == ",")) {
						evt.returnValue = false;
						return(false);
					}

					evt.returnValue = true;
					return(true);
				}
		}

		evt.returnValue = false;
		return(false);
	},
	toChar : function(num, evt) {
		var ch = "";
			
		if(evt && evt.shiftKey == true) {
			switch(num) {
				case 192 : ch = "'"; break;
				case 49  : ch = "!"; break;
				case 50  : ch = "@"; break;
				case 51  : ch = "#"; break;
				case 52  : ch = "$"; break;
				case 53  : ch = "%"; break;
				case 54  : ch = "¨"; break;
				case 55  : ch = "&"; break;
				case 56  : ch = "*"; break;
				case 57  : ch = "("; break;
				case 48  : ch = ")"; break;
				case 189 : ch = "_"; break;
				case 187 : ch = "+"; break;
			}
		}
		else {
			switch(num) {
				/* Números NUMPAD */
				case 96 : ch = "0"; break;
				case 97 : ch = "1"; break;
				case 98 : ch = "2"; break;
				case 99 : ch = "3"; break;
				case 100 : ch = "4"; break;
				case 101 : ch = "5"; break;
				case 102 : ch = "6"; break;
				case 103 : ch = "7"; break;
				case 104 : ch = "8"; break;
				case 105 : ch = "9"; break;
				/* Símbolos Matemáticos */
				case 107 : ch = "+"; break;
				case 109 : ch = "-"; break;
				case 189 : ch = "-"; break;
				case 106 : ch = "*"; break;
				case 111 : ch = "/"; break;
				/* Pontuações */
				case 110 : ch = ","; break;
				case 188 : ch = ","; break;
				case 194 : ch = "."; break;
				case 190 : ch = "."; break;
				default : ch = String.fromCharCode(num); break;
			}
		}
		
		return(ch);
	},
	formatNumber : function (obj, factNum) {
		var value = obj.value.replace(",", ".");
		factNum = factNum ? factNum : this.FRACTION_NUMBER;

		if(value == "") {
			value = "0";
		}

		var isDecimal = value.indexOf(".") != -1;
		var isNegative = value.indexOf("-") != -1;
		var newValue = "";

		value = value.replace("-", "");
		value = value.replace(".", "");

		// tira zeros iniciais
		value = value.replace(/^[0]*/, "");

		switch(value.length) {
			case(0):
				if(isDecimal) {
					value = "000";
				}
				else {
					value = "0";
				}
				break;
			case(1):
				if(isDecimal) {
					value = "00" + value;
				}
			case(2):
				if(isDecimal) {
					value = "0" + value;
				}
		}

		for(var index = 0; index < value.length; index++) {
			var num = value.charAt(index);

			if(isDecimal) {
				if(value.length - factNum == index) {
					num = "." + num;
				}
			}

			newValue += num;
		}

		if(isNegative) {
			newValue = "-" + newValue;
		}

		obj.value = newValue;
	},
	get : function(id) {
		return(document.getElementById(id));
	},
	$id : function(id) {
		return(document.getElementById(id));
	},
	getByName : function(name) {
		return(document.getElementsByName(name));
	},
	$name : function(name) {
		return(document.getElementsByName(name));
	},
	getByTag : function(tag) {
		return(document.getElementsByTagName(tag));
	},
	$tag : function(tag) {
		return(document.getElementsByTagName(tag));
	},
	getByClass : function(className) {
		var all = document.all != null ? document.all : document.getElementsByTagName("*");
		var elems = [];
		
		for(var index = 0; index < all.length; index++) {
			var elem = all[index];
			
			if(elem.className.indexOf(className) != -1) {
				elems.push(elem);
			}
		}
		
		return(elems);
	},
	$className : function(className) {
		return(this.getByClass(className));
	},
	debug : function(msg) {
		if(this.debugEnabled) {
			var debugPanel = this.get("SinglePoint.debugPanel");

			if(! debugPanel) {
				var html = "<div id=\"SinglePoint.debugPanel\" style=\"overflow: auto; height: 150px; width: 300px;\"></div>";

				document.body.innerHTML = document.body.innerHTML + html;
				debugPanel = this.get("SinglePoint.debugPanel");
			}

			var now = new Date();
			debugPanel.innerHTML = (now.getHours() < 10 ? "0" + now.getHours() : now.getHours()) + ":" + (now.getMinutes() < 10 ? "0" + now.getMinutes() : now.getMinutes()) + ":" + (now.getSeconds() < 10 ? "0" + now.getSeconds() : now.getSeconds()) + " - " + msg + "<br />" + debugPanel.innerHTML;
		}
	},
	isIE : function() {
		/*@cc_on
			return(true);
		@*/
		return(false);
	},
	replicate : function(expr, times) {
		var buffer = "";

		for(var count = 0; count < times; count++) {
			buffer += expr;
		}

		return(buffer);
	},
	executeCommand : function(cmd) {
		this.$id("__command").value = cmd;
		this.$tag("form")[0].submit();
	},
	register : function(obj, params) {
		for(var param in params) {
			if(obj != null) {
	            if(param.indexOf("on") == 0) {
	            	var funcName = param.slice(2);
					this.addEvent(obj, funcName, params[param]);
	            }
	            else {
		            obj.setAttribute(param, params[param]);
				}
			}
        }
	},
	addEvent : function(o, t, f, l) {
        var d = 'addEventListener', n = 'on' + t, rO = o, rT = t, rF = f, rL = l;

        if(o[d] && !l) {
            return o[d](t, f, false);
        }

        if(!o._evts) {
            o._evts = {};
        }

        if(!o._evts[t]) {
            o._evts[t] = o[n] ? { b: o[n] } : {};
            o[n] = new Function('e', 'var r = true, o = this, a = o._evts["' + t + '"], i; for (i in a) { o._f = a[i]; r = o._f(e||window.event) != false && r; o._f = null; } return r');

            if(t != 'unload') {
                SP.addEvent(window, 'unload', function() {
                    SP.removeEvent(rO, rT, rF, rL);
                });
            }
        }

        if(!f._i) {
            f._i = this.addEvent._i++;
        }

        o._evts[t][f._i] = f;
        // addEvent._i = 1;
    },
    removeEvent : function(o, t, f, l) {
        var d = 'removeEventListener';

        if(o[d] && !l) {
            return o[d](t, f, false);
        }

        if(o._evts && o._evts[t] && f._i) {
            delete o._evts[t][f._i];
        }
    },
    getSource : function(event) {
    	if(event.srcElement) {
			return(event.srcElement);
		}
		else if(event.target) {
			return(event.target);
		}

		return(null);
    },
    removeChildren : function(container) {
    	while(container.childNodes.length > 0) {
    		var child = container.childNodes[0];
    		container.removeChild(child);
    	}
    },
    transcodeFormToURL: function(form, getOnlyParams, replaceParams) {
        if(typeof form == 'string') {
            form = SP.$id(form);
        }

        if(getOnlyParams == null) {
        	getOnlyParams = false;
        }
        
		if(! replaceParams) {
			replaceParams = {};
		}

        var params = "";
		var usedParams = [];

		for(var i = 0; i < form.elements.length; i++) {
			var element = form.elements[i];
			
			if(element && (element.type || element.tagName == "input")) {
				var type = (element.type + "").toLowerCase();
				
				if(element.name.trim().length > 0) {
					if(! replaceParams.contains(element.name)) {
						if(type == "checkbox" || (element.name && params.indexOf(element.name + "=") == -1)) {
							if(!(type == "radio" || type == "checkbox") || element.checked) {
								params += SP.addParam(element.name, element.value);
							}
						}
					}
					else {
						usedParams[usedParams.length] = element.name;
						params += SP.addParam(element.name, replaceParams[element.name]);
					}
				}
			}
		}

		if(params.indexOf("&") == 0) {
			params = params.substring(1);
		}

   		for(var param in replaceParams) {
			if(! usedParams.contains(param) && typeof(eval("Object." + param)) != 'function') {
				params += SP.addParam(param, replaceParams[param]);
			}
   		}

        var formAction = form.action.replace(new RegExp("^http:\/\/[-._A-Za-z0-9]+:?\\d*"), "");

        var url = formAction + "?" + params;

        return(getOnlyParams ? params : url);
    },
    addParam: function(name, value, append) {
    	if(append == null) {
    		append = true;
    	}
    	
    	return(
    		(append ? "&" : "") +
    		name + "=" + escape(value)
    	);
    },
	evalScrollables : function(refreshRate) {
		if(this.scrollableInterval != null) {
			return;
		}
		
		if(refreshRate == null) {
			refreshRate = 20;
		}
		
		this.scrollableInterval = setInterval(function() {
			var scrollables = SP.$className("scrollable");
			var leftRE   = /left: ?(\d)+px/;
			var topRE    = /top: ?(\d)+px/;
			var rightRE  = /right: ?(\d)+px/;
			var bottomRE = /bottom: ?(\d)+px/;
			
			for(var index = 0; index < scrollables.length; index++) {
				var elem = scrollables[index];
				
				if(elem.getAttribute("scrollConfig") != null) {
					var config = elem.getAttribute("scrollConfig");
					
					if(leftRE.test(config)) {
						var left = parseInt(leftRE.exec(config)[1]);
						
						elem.style.left = (left + document.body.scrollLeft) + "px";
					}
					if(topRE.test(config)) {
						var top = parseInt(topRE.exec(config)[1]);
						
						elem.style.top = (top + document.body.scrollTop) + "px";
					}
					if(rightRE.test(config)) {
						var right = parseInt(rightRE.exec(config)[1]);
						
						elem.style.left = (document.body.scrollLeft + document.body.clientWidth - elem.offsetWidth - right) + "px";
					}
					if(bottomRE.test(config)) {
						var bottom = parseInt(bottomRE.exec(config)[1]);
	
						elem.style.top = (document.body.scrollTop + document.body.clientHeight - elem.offsetHeight - bottom) + "px";
					}
				}
			}
		}, refreshRate);
	},
	disableScrollables : function() {
		clearInterval(this.scrollableInterval);
	}
}

var SP = new SinglePoint();

/**
 * Adiciona ao prot?tipo das Strings o m?todo trim().
 * Remove todos os espa?os em branco que cercam a String, ? esquerda e ? direita.
 *
 * @return String sem espa?os adicionais.
 */
String.prototype.trim = function() {
	return(this.replace(/^\s*/, "").replace(/\s*$/, ""));
}

Object.prototype.contains = function(elem) {
	for(var param in this) {
		if(param == elem) {
			return(true);
		}
	}

	return(false);
}

Object.prototype.lpad = function(len, fillChar) {
	if(fillChar == null) {
		fillChar = "0";
	}
	
	var str = this.toString();
	
	while(str.length < len) {
		str = fillChar + str;
	}
	
	return(str);
}

Date.prototype.format = function(pattern) {
	var res = pattern;
	
	res = res.replace("dd", this.getDate().lpad(2));
	res = res.replace("MM", (this.getMonth() + 1).lpad(2));
	res = res.replace("yyyy", this.getYear());
	res = res.replace("HH", this.getHours().lpad(2));
	res = res.replace("mm", this.getMinutes().lpad(2));
	res = res.replace("ss", this.getSeconds().lpad(2));
	
	return(res);
}

function SPValidate() {
	this._author = "Bruno Paulino de Almeida";
	this._vendor = "Single Point Technology";
	this._version = "1.0.0";
}

SPValidate.prototype = {
	Doc : {
		_clean : function(code) {
			if(! code) {
				return("");
			}

			while(! /^\d*$/.test(code)) {
				code = code.replace(/[-.\/]/, "");
			}

			return(code);
		},
		_isATrivialCode : function(code, length) {
			for(var num = 0; num <= 9; num++) {
				if(code == SP.replicate(num, length)) {
					return(true);
				}
			}

			return(false);
		},
		_isATrivialCPF : function(code) {
			return(this._isATrivialCode(code, 11));
		},
		_isATrivialCNPJ : function(code) {
			return(this._isATrivialCode(code, 14));
		},
		_getValidatorDigit : function (sum) {
			var mod = sum % 11;

			if(mod == 0 || mod == 1) {
				return(0);
			}

			return(11 - mod);
		},
		_getCPFValidatorDigit : function(part) {
			var buffer = 0;

			for(var i = 0; i < part.length; i++) {
				var iDigit = parseInt(part.charAt(i));
				var multiplier = (part.length + 1) - i;
				buffer += iDigit * multiplier;
			}

			return(this._getValidatorDigit(buffer));
		},
		_getCNPJValidatorDigit : function(part, splitIndex) {
			var sum = 0;
			var partA = part.substring(0, splitIndex);
			var partB = part.substring(splitIndex);

			for(var i = 0; i < partA.length; i++) {
				var iDigit = parseInt(partA.charAt(i));
				var multiplier = (splitIndex + 1) - i;
				sum += iDigit * multiplier;
			}

			for(var i = 0; i < partB.length; i++) {
				var iDigit = parseInt(partB.charAt(i));
				var multiplier = 9 - i;
				sum += iDigit * multiplier;
			}

			return (this._getValidatorDigit(sum));
		},
		cpf : function(cpf) {
			cpf = this._clean(cpf);

			if(cpf.length == 0) {
		  		return(true);
			}

			if(cpf.length != 11 || this._isATrivialCPF(cpf)) {
				return(false);
			}

			var firstPart = cpf.substring(0, cpf.length - 2);
			var secondPart = cpf.substring(cpf.length - 2);
			var firstValidatorDigit = this._getCPFValidatorDigit(firstPart);
			var secondValidatorDigit = this._getCPFValidatorDigit(firstPart + firstValidatorDigit);

			return(secondPart == (firstValidatorDigit + "" + secondValidatorDigit));
		},
		cnpj : function(cnpj) {
			cnpj = this._clean(cnpj);

	 		if(cnpj.length == 0) {
				return(true);
			}

			if(cnpj.length != 14 || this._isATrivialCNPJ(cnpj)) {
				return(false);
			}

			var firstPart = cnpj.substring(0, cnpj.length - 2);
			var secondPart = cnpj.substring(cnpj.length - 2);
			var firstValidatorDigit = this._getCNPJValidatorDigit(firstPart, 4);
			var secondValidatorDigit = this._getCNPJValidatorDigit(firstPart + firstValidatorDigit, 5);

			return(secondPart == (firstValidatorDigit + "" + secondValidatorDigit));
		}
	}
}

var SPValidate = new SPValidate();

function Chain() {
    this.queue = [];
    this.fn = null;
}

Chain.prototype = {
    chain : function(fn) {
        this.queue.push(fn);

        return(this);
    },
    execute : function() {
        while(this.queue.length != 0) {
            fn = this.queue.shift();

            setTimeout("fn()", 1000);
        }
    }
}

var Chain = new Chain();

function SPConfig() {
    this.loadingText = "Aguarde, carregando...";

    this.SPTreeView_ajaxUrl = "";

    this.set = function(map) {
    	for(var index in map) {
    		if(this[index]) {
    			this[index] = map[index];
    		}
    	}
    };
}

SPConfig = new SPConfig();


/*
 * Version 1.0.0
 */

/**
 * Executa o comando especificado, submetendo o Form.
 */
function executeCommand(command) {
	var hiddenCommand = document.getElementsByName("command")[0];
	hiddenCommand.value = command;
	document.getElementsByTagName("form")[0].submit();
}

/** Define o valor que determina que a Resposta esta completa. */
var CONST_RESPONSE_COMPLETE = 4;
/** Define o valor que determina que a Resposta esta OK. */
var CONST_RESPONSE_STATUS_OK = 200;

/**
 * Funcao responsavel de instanciar um objeto XMLHttpRequest
 * para uma requesicao assincrona.
 * @param urlToConnect
 *   A url que se deseja conectar.
 * @ajax
 */
function init(urlToConnect, method) {
	var xmlHttp = false;

	method = method ? method : "POST";

	// Tenta pegar o objeto de Conexao HTTP pela primeira maneira IE
 	try {
  		xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e) {
	  	// Tenta pegar o objeto de Conexao HTTP pela segunda maneira IE
	  	try {
	   		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	  	catch(e2) {
	   		xmlHttp = false;
	  	}
 	}

	// Se o objeto e false, e houver tipo XMLHttpRequest, nao e IE
 	if(! xmlHttp && typeof XMLHttpRequest != 'undefined') {
  		xmlHttp = new XMLHttpRequest();
 	}

 	// o 3o parametro e o que determina se a conexao sera ASSINCRONA
 	xmlHttp.open(method, urlToConnect, true);
 	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}

/**
 * Varre o array em busca do elemento especificado.
 *
 * @param elem
 *           O elemento a ser procurado pelo array.
 * @return
 *         <tt>True</tt>, caso o elemento especificado seja encontrado.<br />
 *         <tt>False</tt>, caso contr?rio.
 */
Array.prototype.contains = function(elem) {
    for(var i = 0; i < this.length; i++) {
        if(this[i].toLowerCase() == elem || this[i].toUpperCase() == elem) {
            return(true);
        }
    }

    return(false);
}

function validateCPF(cpf) {
    cpf = cleanCode(cpf);

 if(cpf.length == 0)
  return(true);

    if(cpf.length != 11 || isATrivialCPF(cpf))
        return(false);

    var firstPart = cpf.substring(0, cpf.length - 2);
    var secondPart = cpf.substring(cpf.length - 2);
    var firstValidatorDigit = getFirstValidatorDigitForCPF(firstPart);
    var secondValidatorDigit = getSecondValidatorDigitForCPF(firstPart + firstValidatorDigit);

    return(secondPart == (firstValidatorDigit + secondValidatorDigit));
}

function validateCNPJ(cnpj) {
    cnpj = cleanCode(cnpj);

 if(cnpj.length == 0)
  return(true);

    if(cnpj.length != 14 || isATrivialCNPJ(cnpj))
        return(false);

    var firstPart = cnpj.substring(0, cnpj.length - 2);
    var secondPart = cnpj.substring(cnpj.length - 2);
    var firstValidatorDigit = getFirstValidatorDigitForCNPJ(firstPart);
    var secondValidatorDigit = getSecondValidatorDigitForCNPJ(firstPart + firstValidatorDigit);

    return(secondPart == (firstValidatorDigit + secondValidatorDigit));
}

function cleanCode(code) {
    if(code == null)
        return("");

    while(code.indexOf(".") != -1) {
        code = code.replace(".", "");
    }

    while(code.indexOf("-") != -1) {
        code = code.replace("-", "");
    }

    while(code.indexOf("/") != -1) {
        code = code.replace("/", "");
    }

    return(code);
}

function isATrivialCPF(code) {
    if(code == "11111111111")
        return(true);
    else if(code == "22222222222")
        return(true);
    else if(code == "33333333333")
        return(true);
    else if(code == "44444444444")
        return(true);
    else if(code == "55555555555")
        return(true);
    else if(code == "66666666666")
        return(true);
    else if(code == "77777777777")
        return(true);
    else if(code == "88888888888")
        return(true);
    else if(code == "99999999999")
        return(true);
    else if(code == "00000000000")
        return(true);

    return(false);
}

function isATrivialCNPJ(code) {
    if(code == "11111111111111")
        return(true);
    else if(code == "22222222222222")
        return(true);
    else if(code == "33333333333333")
        return(true);
    else if(code == "44444444444444")
        return(true);
    else if(code == "55555555555555")
        return(true);
    else if(code == "66666666666666")
        return(true);
    else if(code == "77777777777777")
        return(true);
    else if(code == "88888888888888")
        return(true);
    else if(code == "99999999999999")
        return(true);
    else if(code == "00000000000000")
        return(true);

    return(false);
}

function analyzeAndReturnValidatorDigit(sum) {
    var mod = sum % 11;

    if(mod == 0 || mod == 1)
        return(0);
    else
        return(11 - mod);
}

function getFirstValidatorDigitForCPF(firstPart) {
    var buffer = 0;

    for(var i = 0; i < firstPart.length; i++) {
        var iDigit = parseInt(firstPart.charAt(i));
        var multiplier = 10 - i;
        buffer += iDigit * multiplier;
    }

    return('' + analyzeAndReturnValidatorDigit(buffer));
}

function getSecondValidatorDigitForCPF(firstPart) {
    var buffer = 0;

    for(var i = 0; i < firstPart.length; i++) {
        var iDigit = parseInt(firstPart.charAt(i));
        var multiplier = 11 - i;
        buffer += iDigit * multiplier;
    }

    return('' + analyzeAndReturnValidatorDigit(buffer));
}

function getFirstValidatorDigitForCNPJ(firstPart) {
    var sum = 0;
    var partA = firstPart.substring(0, 4);
    var partB = firstPart.substring(4);

    for(var i = 0; i < partA.length; i++) {
        var iDigit = parseInt(partA.charAt(i));
        var multiplier = 5 - i;
        sum += iDigit * multiplier;
    }

    for(var i = 0; i < partB.length; i++) {
        var iDigit = parseInt(partB.charAt(i));
        var multiplier = 9 - i;
        sum += iDigit * multiplier;
    }

    return ('' + analyzeAndReturnValidatorDigit(sum));
}

function getSecondValidatorDigitForCNPJ(firstPart) {
    var sum = 0;
    var partA = firstPart.substring(0, 5);
    var partB = firstPart.substring(5);

    for(var i = 0; i < partA.length; i++) {
        var iDigit = parseInt(partA.charAt(i));
        var multiplier = 6 - i;
        sum += iDigit * multiplier;
    }

    for(var i = 0; i < partB.length; i++) {
        var iDigit = parseInt(partB.charAt(i));
        var multiplier = 9 - i;
        sum += iDigit * multiplier;
    }

    return ('' + analyzeAndReturnValidatorDigit(sum));
}

/**
 * Executa o comando especificado, setando no campo hidden nomeado em
 * inputHiddenName o valor de idToSet. Normalmente esta fun??o deve ser usada
 * para chamar m?todos de atualiza??o e dele??o.
 */
function executeCommandSettingId(command, inputHiddenName , idToSet) {
 var hiddenField = document.getElementsByName(inputHiddenName)[0];
 hiddenField.value = idToSet;
 executeCommand(command);
}

/**
 * Executa o comando especificado, setando no campo hidden nomeado em
 * inputHiddenName o valor de valueToSet.
 */
function executeCommandSettingValue(command, inputHiddenName , valueToSet) {
 var hiddenField = document.getElementsByName(inputHiddenName)[0];
 hiddenField.value = valueToSet;
 executeCommand(command);
}

/**
 * Desabilita todos os campos do tipo "input" (menos hidden), "select" e "textarea"
 * de um determinado "container"
 */
function disabledAllFields(containerId){
	var container = document.getElementById(containerId);
   	var inputs = container.getElementsByTagName("input");
   	if(inputs){
    	for(var i = 0 ; i < inputs.length ; i++){
    		var inputField = inputs.item(i);
    		if(inputField.getAttribute("type") != "hidden"){
    			inputField.setAttribute("disabled",true);
    		}
    	}
   	}
   	var selects = document.getElementsByTagName("select");
   	if(selects){
   		for(var j = 0 ; j < selects.length ; j++){
    		var selectField = selects.item(j);
   			selectField.setAttribute("disabled",true);
    	}
   	}
   	var textAreas = document.getElementsByTagName("textarea");
   	if(textAreas){
   		for(var k = 0 ; k < textAreas.length ; k++){
    		var textAreaField = textAreas.item(k);
   			textAreaField.setAttribute("disabled",true);
    	}
   	}
}
/**
 *
 * Esta fun??o corrige os valores num?ricos de um input do tipo "text", estando estes no formato
 * brasileiro, para o formato americano. Esta corre??o ? feita retirando o
 * caracter "." e substituindo "," por "."
 *
 */
function correctNumericValues(idcontainer){

 	  var container = document.getElementById(idcontainer);
      var inputs = container.getElementsByTagName("input");
      for(var i=0 ; i < inputs.length ; i++){
          var input = inputs[i];
          if(input.getAttribute("type")== "text") {
              var value = input.getAttribute("value");
              value = value.replace(".", "");
              value = value.replace(",",".");
              input.setAttribute("value", value);
          }
      }
}

/**
 * Corrige o conte?do de um input, permitindo somente
 * os valores "0123456789."
 *
 */
function allowNumeric(nameField){
	var input = document.getElementsByName(nameField)[0];
	if(!IsNumeric(input.value)){
		newValue = input.value.substring(0,input.value.length-1);
		input.value = newValue;
	}
}



/**
 * Verifica se o conte?do do texto est? entre
 * os valores "0123456789."
 *
 */
function IsNumeric(sText)
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;
   for (i = 0; i < sText.length && IsNumber == true; i++)
      {
      Char = sText.charAt(i);
      if (ValidChars.indexOf(Char) == -1)
         {
         IsNumber = false;
         }
      }
   return IsNumber;
}

/**
 * Corrige o conte?do de um input, permitindo somente
 * os valores "0123456789"
 *
 */
function allowOnlyNumeric(nameField){
	var input = document.getElementsByName(nameField)[0];
	if(!IsOnlyNumbers(input.value)){
		newValue = input.value.substring(0,input.value.length-1);
		input.value = newValue;
	}
}



/**
 * Verifica se o conte?do do texto est? entre
 * os valores "0123456789"
 *
 */
function IsOnlyNumbers(sText)
{
   var ValidChars = "0123456789";
   var IsNumber=true;
   var Char;
   for (i = 0; i < sText.length && IsNumber == true; i++)
      {
      Char = sText.charAt(i);
      if (ValidChars.indexOf(Char) == -1)
         {
         IsNumber = false;
         }
      }
   return IsNumber;
}


/**
 * Executa o comando especificado, setando no campo hidden nomeado em
 * inputHiddenName o valor de idToSet somente se o usu?rio confirmar a opera??o.
 * Normalmente esta fun??o deve ser usada
 * para chamar m?todos de delete.
 */
function confirmAndExecuteCommandSettingId(msgToShow, command, inputHiddenName , idToSet) {
 var userResponse = window.confirm(msgToShow);
 if(userResponse){
	 var hiddenField = document.getElementsByName(inputHiddenName)[0];
	 hiddenField.value = idToSet;
	 executeCommand(command);
 }
 else{
 	return(false);
 }
}