
var validationObjectList = new Array();
var validListCount = 0;

function validateFunction(functionName, js, paramsList, errorsList, groupCloneId, blockId){
	var validateFunction = new Object();
	validateFunction.name = functionName;
	validateFunction.js = js;
	validateFunction.paramsList = eval(paramsList);
	validateFunction.errorsList = eval(errorsList);
	validateFunction.groupCloneId = groupCloneId;
	validateFunction.blockId = blockId;
	return validateFunction;
}

function validateResult(status, code){
	var validateResult = new Object();
	validateResult.status = status;
	validateResult.code = code;
	return validateResult;

}

function asyncValidateFunction(questionName, functionName, questionValue, paramsList){
	var asyncValidateFunction = new Object();
	asyncValidateFunction.questionName = questionName;
	asyncValidateFunction.functionName = functionName;
	asyncValidateFunction.questionValue = questionValue;
	var params = paramsList;
	var validateParamsList = new Array();
	if(params){
		for(var i = 0; i < params.length; i++){
			var param = params[i];			
			var value = param.value;
			if (value.substr(0,1) == "$"){
				value = getValueQuestion(value.substr(1));
			}
			var validateParam = new Object();
			validateParam.name = param.name;
			validateParam.value = value;
			validateParamsList[i] = validateParam;
		}		 
	}
	asyncValidateFunction.validateParamsList = validateParamsList;
	return asyncValidateFunction;
}


function getErrorMsg( func, code ) {
	var errors = func.errorsList;
	if( errors != null ) {
		for(var e = 0; e < errors.length; e++) {
			if( code == errors[e].code ) {
				return errors[e].error.replace(/&quot;/g, "\"");
			}
		}
	}
	return code;
}


function addValidateFunction(questionName, functionName, type, paramsList, errorsList, groupCloneId, blockId){
	var validateObject = getValidateObject(questionName);
	if(validateObject){
		validateObject.validateFunctions[validateObject.validateFunctionsCount] = validateFunction(functionName, type, paramsList, errorsList, groupCloneId, blockId);
		validateObject.validateFunctionsCount++;		
	}else{
		var validateObject = new Object();
		validateObject.questionName = questionName;
		validateObject.validateFunctionsCount = 0;
		validateObject.validateFunctions = new Array();
		validateObject.validateFunctions[validateObject.validateFunctionsCount] = validateFunction(functionName, type, paramsList, errorsList, groupCloneId, blockId);
		validateObject.validateFunctionsCount++;

		validationObjectList[validListCount] = validateObject;
		validListCount++;
	}

}

function getValidateObject(questionName){
	for(var i= 0; i < validationObjectList.length; i++){
		var validateObject = validationObjectList[i];
		if(validateObject.questionName == questionName){
			return validateObject;
		}
	}
	return null;
}


function showMessage(questionName) {       
	$("#" + questionName + "_ERROR_MESSAGE").show();
}

function hideMessage(questionName) {    
	$("#" + questionName + "_ERROR_MESSAGE").hide();
}



function getFuncStr(func, value) {
	var funcStr = func.name + "('" + value + "'";
	var params = func.paramsList;                       
	if(params){
		for(var p = 0; p < params.length; p++){
			var param = params[p];
			var pvalue = param.value;
			if (pvalue.substr(0,1) == "$"){
				pvalue = getValueQuestion(pvalue.substr(1));
			}
			funcStr += ",'" + pvalue + "'";
		}
	}
	funcStr += ')';

	return funcStr;
}


function validateQuestion(e) { 

	var questionName = e.data.questionName;
	var validateObject = getValidateObject(questionName); 

	if(validateObject){

		var value = getValueQuestion(validateObject.questionName);

		if(e.data.questionValue != null && e.data.questionValue.length >0){
			value = e.data.questionValue;
		}

		var validateObjectFlag = true;
		
		var errorDiv = $("#"+questionName+"_ERROR_MESSAGE");
		errorDiv.children().remove('div'); 
		var elemsFromList = $("#LERROR_"+questionName);

		for(var j = 0; j < validateObject.validateFunctions.length; j++){                   
			
			var validateFunc = validateObject.validateFunctions[j];
			var divRunValidate = "RUN_VALIDATE_"+questionName+"_"+validateFunc.name;
			elemsFromList.append('<div id="' + divRunValidate + '" style="display: none;"></div>');

			if(validateFunc.js == "true"){            
				validateJS(validateFunc, value, questionName)
			} else { 
				asyncValidate(validateFunc, value, questionName);
			}
				
		}

		
	}

}

function asyncValidate(validateFunc, value, questionName){
	var data = formAsynchParam;
	data += "&command=invokeAction";
	data += "&actionName=asyncValidate";
	data += "&functionName=" + validateFunc.name;
	
	if(value && value != null && value != ""){
		data += "&questionValue=" + encodeValue(value);
	}
	
	if(questionName && questionName != null && questionName != ""){
		data += "&formQuestionName=" + questionName;
	}
	data += "&formCloneId=" + validateFunc.groupCloneId;
 
	var vResult = validateResult(false, "");
	$.ajax
	(
			{   type: 'post',
				url: '/htmlresp',
				dataType: "html",
				data: data,        
				error: function (XMLHttpRequest, textStatus, errorThrown)
				{},
				success: function(response)
				{	
					resp = jQuery.trim(response);
					resp = resp.substring(1,resp.length-1);
					vResult = validateResult($.evalJSON(resp).status, $.evalJSON(resp).code);                
					if('true' == $.evalJSON(resp).status){	
						vResult = validateResult(true, ''); 
					}
					var elemsFromList = $("#LERROR_"+questionName);
					elemsFromList.children().remove('#RUN_VALIDATE_'+questionName+'_'+validateFunc.name);
					setErrorStatus(validateFunc, vResult, questionName, value);
				}
			}
	);

}



function validateJS(validateFunc, value, questionName){
	var vResult = validateResult(false, '');
	if( isArray(value) ) {
		for( v in value ) {                   
			var funcStr = getFuncStr(validateFunc, value[v]);
			vResult = eval(funcStr);
			if( !vResult.status ) {   
				break;
			}
		}
	} else {
		var funcStr = getFuncStr(validateFunc, value);
		vResult = eval(funcStr);            
	}
	var elemsFromList = $("#LERROR_"+questionName);
	elemsFromList.children().remove('#RUN_VALIDATE_'+questionName+'_'+validateFunc.name); 
	setErrorStatus(validateFunc, vResult, questionName, value);
}


function setErrorStatus (validateFunc, vResult, questionName, value){
	
	var errorDiv = $("#"+questionName+"_ERROR_MESSAGE");
	var answerDivs = $('#'+questionName+' :input[name$="'+questionName+'"]');		
	var elemsFromList = $("#LERROR_"+questionName);
	var checkedMark = $("#"+questionName+"_CHECKED");
	
	var divId = "QERROR_"+questionName+"_"+validateFunc.name;			
	var divFromListId = "LERROR_"+questionName+"_"+validateFunc.name;
	var listElem = $("div[ @id ^= '"+divFromListId+"' ]");
	var caution = $("#FORM_ERRORS_LIST_"+validateFunc.blockId+"_CAUTION");
	
	if(vResult.status == false){
		var err = getErrorMsg(validateFunc, vResult.code);
		errorDiv.append('<div id="'+divId+'">'+err+'</div>');
		
		if( listElem.length > 0 ) {
			listElem.css('display',''); 
			listElem.text(err);
		}else {
			if( elemsFromList != null ) {
				elemsFromList.append('<div id="'+divFromListId+'" class="SBIerrorLine">'+err+'</div>');
			} 
		}
		
	}else { 
		listElem.css('display','none');
		
	}
	
	if($("#FORM_ERRORS_LIST_"+validateFunc.blockId+" > div[id='LERROR_" + questionName + "'] > div:visible").length > 0){
		showMessage(questionName);
						
		checkedMark.css("display", "none");
		
		checkedMark.addClass("checkedNotOk");
		checkedMark.removeClass("checkedOk");
		
		$(answerDivs).each(function() {
			$(this).parent().addClass("questionNotOk");
			$(this).parent().removeClass("questionOk");
		} );
		
	}else if( $("#LERROR_" + questionName+ "> div[id^='RUN_VALIDATE_" + questionName + "']").length < 1 ) {
		hideMessage(questionName);		
		checkedMark.css("display", "");
		if( value && value != null && value != "" && value.length > 0 ) {
			checkedMark.addClass("checkedOk");
			checkedMark.removeClass("checkedNotOk");
		}
		$(answerDivs).each(function() {
			$(this).parent().removeClass("questionNotOk");
			$(this).parent().addClass("questionOk");
			$(this).parent().parent().removeClass("questionNotOk");
			$(this).parent().parent().addClass("questionOk");
		});
		
	}
	
	if($("#FORM_ERRORS_LIST_"+validateFunc.blockId+" > div:visible > div:visible").length > 0){
		caution.css('display','');
	}else{
		caution.css('display','none');
	}

}


function verificationEmpty(e) {
	var display = "none";
	var value = $(this).val();
	validateQuestion({data:{questionName:e.data.questionName, questionValue: value}});
	if( $(this).val().length < 1 ) {
		display = "inline";
		$(this).addClass("questionNotOk");
	} else {
		$(this).removeClass("questionNotOk");  
	}
	$(this).parent().children('div').each(
			function() {
				$(this).css('display',display);
			}
	);
	$(this).parents().find('td').eq(0).each(
			function() {
				$(this).find('input').each(
						function() {   
							if( $(this).val().length < 1 ) {
								$(this).addClass("questionNotOk");                
								$(this).parent().children('div.verificationError').each(
										function() {
											$(this).css('display','inline');
										}
								);
							} else {
								$(this).removeClass("questionNotOk");                 
								$(this).parent().children('div.verificationError').each(
										function() {
											$(this).css('display','none');
										}
								); 
							}

						}
				);  
			}  
	);
	$(this).parent().parent().find("div").removeClass("questionOk")
	$(this).parents().find("td").eq(0).removeClass("questionNotOk");      
}



function validateAndSubmit(sectionName, action, buttonName){
	$("#SUBMIT_ACTION").val(action);

	$("#Form_" + sectionName).find("input[@disabled][@type='radio'], input[@disabled][@type='checkbox'], input[@disabled][@type='text'], input[@disabled][@type='hidden'], select[@disabled], textarea[@disabled]").each
	(
			function()
			{
				$(this).attr('readonly','readonly');
				$(this).attr('disabled','');
			}
	);	

	$("#Form_" + sectionName).submit();
}

function submitAndCorrectData(sectionName){
	$("#FORM_COMMAND").val("correct");

	$("#Form_" + sectionName).find("input[@disabled][@type='radio'], input[@disabled][@type='checkbox'], input[@disabled][@type='text'], input[@disabled][@type='hidden'], select[@disabled], textarea[@disabled]").each
	(
			function()
			{	
				$(this).attr('readonly','readonly');
				$(this).attr('disabled','');

			}
	);
	$("#Form_" + sectionName).submit();
}

// Test for upper case letters (only good up to char 127)
function isUpper(aChar)
{
  myCharCode = aChar.charCodeAt(0);
  if((myCharCode > 64) && (myCharCode <  91)) {
     return true;
  }
  return false;
}

function isNumber(x) 
{ 
  if( isNaN(x) ) {
      return false;
  }
  return true;
}

function isInteger (x)
{
    var i;    
    if (!isEmpty(x)) {        
        for (i = 0; i < x.length; i++)
        {
            var c = x.charAt(i);        
            if (!isDigit(c)) { return false; }
        }
    }    
    return true;
}
function isEmpty(s)
{
  return ((s == null) || (s.length == 0))
}
/*
function isDigit (c)
{
  return ((c >= "0") && (c <= "9"))
}

*/

function isDigit(num) {
    var string="1234567890";
    if (string.indexOf(num)!=-1){
        return true;
    }
    return false;
}

function isLetter(letter) {
    var string="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (string.indexOf(letter)!=-1){
        return true;
    }
    return false;
}
