//*****************************************************************************************************************************************
//	Inicializacoes
//*****************************************************************************************************************************************

function initFormInputs(form) {
	for (var i = 0; i < form.elements.length; i++) {
		initInput(form.elements[i]);
	}
}

function initInput (input) {
	if ((input.type == "text")&&(input.getAttribute("inputType")!=null)){
		// Carregamento dos dados anteriores;
		if(trim(input.value)!=""){
			input.setAttribute("inputValue", getDigits(input.value));
		}
		// Associa??o dos eventos
		if ((eval(input.getAttribute("inputType")+"OnKey")!=null)&&(eval(input.getAttribute("inputType")+"OnKey") == "catchNumberEvent")) {
				input.onkeydown=catchNumberEvent;
				input.onkeypress=catchNumberEvent;
				input.onkeyup=catchNumberEvent;
		}

		if (eval(input.getAttribute("inputType")+"OnBlur") == "catchValDateEvent"){
			input.onblur=catchValDateEvent;
		} else if (eval(input.getAttribute("inputType")+"OnBlur") == "catchValDateTimeEvent"){
			input.onblur=catchValDateTimeEvent;
		} else if (eval(input.getAttribute("inputType")+"OnBlur") == "catchValNumberEvent"){
			input.onblur=catchValNumberEvent;
		}
		input.onselect=catchSelectEvent;
		// formatacao dos dados
		formatInputValue(input);
	} else if (input.type == "text"){
		input.onkeydown=catchTextEvent;
		input.onkeypress=catchTextEvent;
		input.onkeyup=catchTextEvent;
	} else if ((input.type == "checkbox")||(input.type == "radio")){
		input.onkeydown=catchChoiceEvent;
		input.onkeypress=catchChoiceEvent;
		input.onkeyup=catchChoiceEvent;
	} else{
		input.onkeydown=catchChangeEvent;
		input.onkeypress=catchChangeEvent;
		input.onkeyup=catchChangeEvent;
	}
}

//*****************************************************************************************************************************************
//	Formatacoes
//*****************************************************************************************************************************************

function getFormValues(form) {
	var message = "";
	for (var i = 0; i < form.elements.length; i++) {
		var input = form.elements[i];
		if ((input.type == "text")||
		    ((input.type == "radio")&&(input.checked))||
		    ((input.type == "checkbox")&&(input.checked))){
			message += input.name + "=" + getInputValue(input) +"&";
		}
		else
			continue;
	}
	return message;
}


function formatInputValue (input) {
    var val;
    /*if (input.getAttribute("inputType") == null){
		input.value = formatNumber(input.getAttribute("inputValue"), input.inputFormat, input.inputDirection);
    } else {*/
    if (input.getAttribute("inputType") != null){
        input.size = eval(input.getAttribute("inputType")+"Size");
        input.setAttribute("maxLength", eval(input.getAttribute("inputType")+"Size"));
        val = formatNumber(input.getAttribute("inputValue"),
                eval(input.getAttribute("inputType") + "InputFormat"),
                eval(input.getAttribute("inputType") + "InputDirection"),
                eval(input.getAttribute("inputType") + "FixFormat"),
                input.getAttribute("signed"));

    }
    input.value = val;
    return val;
}

function getInputValue (input) {
	var value = input.getAttribute("inputValue");
	if  (value == null) return input.value;
    if (input.getAttribute("inputType") == null) {
        return trim(formatNumber(input.getAttribute("inputValue"), input.finalFormat, input.inputDirection));
    }
    value = trim(formatNumber(input.getAttribute("inputValue"),
            eval(input.getAttribute("inputType") + "FinalFormat"),
            eval(input.getAttribute("inputType") + "InputDirection"),
            eval(input.getAttribute("inputType") + "FixFormat"),
            input.getAttribute("signed")));
    if (input.getAttribute("signed") != null && input.getAttribute("signed") == "yes") {
        return value.substring(0, 1) + trim(value.substring(1));
    }
    return value;
}

function formatNumber (value, format, direction, fix, signed) {
	if (fix == null) fix = "yes";
	if (direction == null) direction = 'LeftToRight';
	var length = value.length;
	var start = (direction == 'RightToLeft') ? length-1 : 0;
	var inc = (direction == 'RightToLeft') ? -1 : 1;
	var end = (direction == 'RightToLeft') ? -1 : length;
	var formatLength = format.length;
	var pos = (direction == 'RightToLeft') ? formatLength : -1;
	var endPos = (direction == 'RightToLeft') ? -1 : formatLength;
	for (var i = start; i != end; i += inc) {
		pos = (direction == 'RightToLeft') ? format.lastIndexOf('#') : format.indexOf('#');
		if (pos == -1) return;
		format = replaceCharAt(format, pos, value.charAt(i));
	}
	pos += inc;
	// Colocamento do sinal
	if (signed != null){
		if (fix == "yes")
			// caso o formato seja fixo o sinal dever? ser colocado no extremo
			pos = (direction == 'RightToLeft') ? format.indexOf('#') : format.lastIndexOf('#');
		if (signed == "yes"){
			format = replaceCharAt(format, pos, '-');
		} else {
			format = replaceCharAt(format, pos, ' ');
		}
		pos += inc;
	}
    if (fix == "yes")
		return replaceAll(format, '#', ' ');
	else
		return replaceIn(format, pos, endPos, inc, ' ');
}


//*****************************************************************************************************************************************
//	Validacoes
//*****************************************************************************************************************************************

// Alterado por Rui Neves
function validateNumber (input) {
	if ((input.getAttribute("inputValue")!=null)&&(input.getAttribute("inputValue")!="")){
		var number = trim(getInputValue(input));
		if ((input.getAttribute("signed")!=null)&&(eval(input.getAttribute("inputType")+"FixFormat")=="yes")){
			number = trim(number.substring(1));
		}
		if (!isNumber(number)) {
			alert('N?mero inv?lido no campo: '+input.name);
			input.focus();
		}
	}
	// Situacao onde s? existe o sinal
	if ((input.getAttribute("inputValue")!=null)&&(input.getAttribute("inputValue")=="")&&(input.getAttribute("signed")!=null)&&(input.getAttribute("signed")=="yes")){
		alert('N?mero inv?lido no campo: '+input.name);
		input.focus();
	}
}


// Alterado por Rui Neves
function validateDate (input) {
	if ((input.getAttribute("inputValue")!=null)&&(input.getAttribute("inputValue")!="")){
		var date = formatNumber(input.getAttribute("inputValue"), "####-##-##");
		if (!isDate(date)) {
//			alert('Data inv?lida no campo: '+input.name);
			alert('Data inv?lida.');
			input.focus();
		}
	}
}


// Alterado por Rui Neves
function validateDateTime (input) {
	if ((input.getAttribute("inputValue")!=null)&&(input.getAttribute("inputValue")!="")){
		var datetime = formatNumber(input.getAttribute("inputValue"), "####-##-## ##:##:##");
		if (!isDateTime(datetime)) {
//			alert('Data/Hora inv?lida no campo: '+input.name);
			alert('Data/Hora inv?lida.');
			input.focus();
		}
	}
}


function isNumber (text) {
	if (text.length == 0) return true;
	var re = /^[\+\-]?\d+$|^\d*\.*\d+$/;
	return re.test(text);
}


function isDate (date) {
	if (date.length == 0) return true;
	var re = /^\d\d\d\d\-\d\d\-\d\d$/;
	if (!re.test(date)) return false;
	var year = date.substring(0,4);
	var month = date.substring(5,7);
	if (month < 1 || month > 12) return false;
	var day = date.substring(8,10);
	var max = 31;
	if (month == 4 || month == 6 || month == 9 || month == 11) {
		max = 30;
	} else if (month == 2 && !isLeapYear(year)) {
		max = 28;
	} else if (month == 2 && isLeapYear(year)) {
		max = 29;
	}
	if (day < 1 || day > max) return false;
	return true;
}


function isDateTime (datetime) {
	if (datetime.length == 0) return true;
	var re = /^\d\d\d\d\-\d\d\-\d\d\s\d\d\:\d\d\:\d\d$/;
	if (!re.test(datetime)) return false;
	var date = datetime.substring(0,10);
	if (!isDate(date)) return false;
	var time = datetime.substring(11);
	var hour = time.substring(0,2);
	if (hour < 0 || hour > 23) return false;
	var minute = time.substring(3,5);
	if (minute < 0 || minute > 59) return false;
	var second = time.substring(6,8);
	if (second < 0 || second > 59) return false;
	return true;
}


function isLeapYear (year) {
	return ((year % 400 == 0) ||
		((year % 4 == 0)&&(year % 100 != 0)));
}


//*****************************************************************************************************************************************
//	Eventos
//*****************************************************************************************************************************************

// Alterado por Rui Neves
function catchNumberEvent (evt) {
	catchChangeEvent();

    if (!evt) evt = window.event;
    var input = evt.target || evt.srcElement;
    var type = evt.type;

    if (type == "keydown") {
		var key = evt.wich || evt.keyCode;
        if (input.inputAutoBlur && input.getAttribute("inputValue").length == input.maxLength) {
            if (key != 8 && key != 9 && key != 46) {
				var other = eval(input.inputAutoBlurNext);
				if (other != null) other.focus();
				return;
			}
		} else if ((input.signed!=null) && ((key == 109)||(key == 189))) {
			if (input.getAttribute("signed")=="yes")
				input.setAttribute("signed", "");
			else
                input.setAttribute("signed", "yes");
			formatInputValue(input);
		} else if (key >= 48 && key <= 57) {
            inputInsertChars(input, String.fromCharCode(key));
			formatInputValue(input);
        } else if (key >= 96 && key <= 105) {
			inputInsertChars(input, String.fromCharCode(key-48));
            input.value = formatInputValue(input);
		} else if (key == 8 || key == 46) {
			inputRemoveChars(input, 1);
            formatInputValue(input);
            if (!evt.preventDefault)
                return false;
            evt.preventDefault();
        } else if (key == 9) {
            if (!evt.stopPropagation)
                evt.cancelBubble = true;
            else {
                evt.stopPropagation();
            }
        } else {
		}
    }
    // Tentativa de apagar o caracter correspondente ao cursor (back e delete)
	// Abandonada devido ao cursor ser posicionado no final no input
/*	else if (type == "keyup") {
		var key = window.event.keyCode;
		if (key == 8 || key == 46) {
			input.getAttribute("inputValue") = getDigits(input.value);
			formatInputValue(input);
		}
	}*/
}


// Criado por Rui Neves
function catchTextEvent () {
	catchChangeEvent();
	return;
/*
	var input = window.event.srcElement;
	var type = window.event.type;
	if (type == "keyup") {
//alert("Text - "+window.event.type+" - "+window.event.srcElement.name);
		var key = window.event.keyCode;
		var length = input.value.length;
		if (key == 107){
			input.value = input.value.substring(1);
		} else if (key == 111){
			input.value = input.value.substring(0,length-1);
		}
	}
*/
}


function catchSelectEvent (evt) {
    if (!evt) evt = window.event;
    var input = evt.target || evt.srcElement;
	input.value = formatInputValue(input);
}

function catchChoiceEvent (evt) {
	catchChangeEvent();
    if (!evt) evt = window.event;
    var input = evt.target || evt.srcElement;
	var type = window.event.type;
	if (type == "keydown") {
		var key = window.event.keyCode;
		if (key == 13){
			input.click();
			return;
		}
	}
}

function catchChangeEvent () {
	return;
/*
	var input = window.event.srcElement;
	var type = window.event.type;
	if (type == "keydown") {
		var key = window.event.keyCode;
		// Caracter '+' do NumPad - Altera o focus para o elemento com tabIndex seguinte
		if ((key == 107)||(key == 43)){
//alert("Change - "+window.event.type+" - "+window.event.srcElement.name);
			var tabIndex = input.tabIndex;
			for (var i = 0; i < document.all.length; i++) {
				if ((document.all[i].tabIndex!=null) && (document.all[i].tabIndex == tabIndex+1)){
					document.all[i].focus();
					return;
				}
			}
			return;
		// Caracter '/' do NumPad - Altera o focus para o elemento com tabIndex anterior
		} else if ((key == 111)||(key == 47)){
//alert("Change - "+window.event.type+" - "+window.event.srcElement.name);
			var tabIndex = input.tabIndex;
			for (var i = 0; i < document.all.length; i++) {
				if ((document.all[i].tabIndex!=null) && (document.all[i].tabIndex == tabIndex-1)){
					document.all[i].focus();
					return;
				}
			}
			return;
		}
	}
*/
}


function catchValNumberEvent (evt){
    if (!evt) evt = window.event;
	var input = evt.target || evt.srcElement;
	validateNumber(input);
}


function catchValDateEvent (evt){
    if (!evt) evt = window.event;
	var input = evt.target || evt.srcElement;
	validateDate(input);
}


function catchValDateTimeEvent (){
//alert("ValDataHora - "+window.event.type+" - "+window.event.srcElement.name);
    if (!evt) evt = window.event;
	var input = evt.target || evt.srcElement;
	validateDateTime(input);
}

//*****************************************************************************************************************************************
//	Utilitarios
//*****************************************************************************************************************************************

function getDigits(string) {
	var digits="";
	var re = /\d/;
	for(var i=0 ; i<string.length ; i++){
		if (hasDigits(string.charAt(i)))
			digits += string.charAt(i);
	}
	return digits;
}


function hasDigits (text) {
	var re = /\d/;
	return re.test(text);
}


function trimLeft (string) {
	if (string == null) return null;
	for (var i = 0; i < string.length; i++) {
		var ch = string.charAt(i);
		if (ch != ' ') {
			return string.substring(i);
		}
	}
	return ("");
}


function trimRight (string) {
	if (string == null) return null;
	for (var i = string.length-1; i >= 0; i--) {
		var ch = string.charAt(i);
		if (ch != ' ') {
			return string.substring(0,i+1);
		}
	}
	return ("");
}


function trim (string) {
	if (string == null) return null;
	return trimLeft(trimRight(string));
}


function replaceCharAt (value, pos, ch) {
	return value.substring(0,pos) + ch + value.substring(pos+1);
}


function replaceAll (value, search, replace) {
	var pos = value.indexOf(search);
	while (pos != -1) {
		value = replaceCharAt(value, pos, replace);
		pos = value.indexOf(search);
	}
	return value;
}


function replaceIn (value, start, end, inc, replace) {
	for(var i=start; i!=end; i += inc) {
		value = replaceCharAt(value, i, replace);
	}
	return value;
}


function insertChars (orig, value, off) {
	if (off == null) off = orig.length;
	return orig.substring(0,off) + value + orig.substring(off);
}


function removeChars (orig, count, off) {
	if (count == null) count = 1;
	if (off == null) off = orig.length;
    return orig.substring(0,off-count)+orig.substring(off);
}


// Alterado por Rui Neves
function inputInsertChars (input, chars) {
	if (input.getAttribute("inputType") != null){
		input.maxLength= eval(input.getAttribute("inputType")+"MaxLength");
	}
    if (input.getAttribute("inputValue").length == input.maxLength) return;
    if (input.getAttribute("inputValue").length + chars.length > input.maxLength) {
		chars = removeChars(chars, input.maxLength - input.getAttribute("inputValue").length);
	}
    input.setAttribute("inputValue", insertChars(input.getAttribute("inputValue"), chars));
}

function inputRemoveChars (input, count) {
	if (input.getAttribute("inputValue").length == 0) return;
	if (count > input.getAttribute("inputValue").length) count = input.getAttribute("inputValue").length;
    input.setAttribute("inputValue", removeChars(input.getAttribute("inputValue"), count));
}

function setInputValue (input, value) {
    if (input.tagName.toLowerCase() == 'select') {
		for (var i = 0; i < input.options.length; i++) {
			if (input.options[i].value == value) {
				input.selectedIndex = i;
				if (isIE()) {
					input.fireEvent("onchange");
				}
				return;
			}
		}
	}
	switch (input.type.toLowerCase()) {
		case 'checkbox':
			input.checked = value;
			break;

		case 'text':
			if (input.getAttribute("inputType") != null) {
				input.setAttribute("inputValue", value);
				formatInputValue(input);
				break;
			}

		default:
			input.value = value;
	}
}

function isIE () {
	var agt = navigator.userAgent.toLowerCase();
	return agt.indexOf("msie") != -1;
}

function clearOptionsFromSelect (select) {
    // o select pode estar vazio
    if (select == null) {
        return;
    }

    for (var i = select.options.length; i >= 0; i--) {
        var option = select.options.item(i);
        if (option != null && option.value != '') {
            select.options.remove(i);
        }
    }
}
