// client side validation codes

var myvalidators = new Array();	
var myvalidator_idx = 0;
var isSubmitted = false;

function open2MyValidate() {

	var validateResult = false;

	var errorMsgList = new Array();
	var errorMsgList_index = 0;
	var isRequiredMsgList = new Array();
	var isRequiredMsg_index = 0;
	var skipEmptyField = "";
	
	var checkTotalList = new Array();
	var checkTotalList_index = 0;
	
	var checkTotalValue;
	
	var isRequiredFlag = false;
	var checkTotalMsg;
	var checkedValue;
	var skipChecking = false;
	var hasNumError = false;
	
	for (var i=0;i<myvalidators.length;i++) {
	
		var validatorName = myvalidators[i][0];

		if (validatorName=="mandatoryIfValidator") {
			var checkField = myvalidators[i][2];
			checkedValue = $F(checkField);

			if (checkedValue==null) {
				skipChecking = true;
			} else {
				skipChecking = false;
			}	
		}
		
		if(skipChecking==false) {	

				if (validatorName=="isRequiredValidator") {
					if (isRequiredValidator(myvalidators[i][1],myvalidators[i][2])==false) {
						errorMsgList[errorMsgList_index++] = getIndex(myvalidators[i][1])+" "+myvalidators[i][2];
						skipEmptyField = myvalidators[i][1];
						isRequiredFlag = true;
					}
				}
				
				if (myvalidators[i][1]!=skipEmptyField) {
					if (validatorName=="numberValidator") {
						if (clientNumberValidator(myvalidators[i][1],myvalidators[i][3],myvalidators[i][4],isRequiredFlag)==false) {
							// check if the error message has been added to errorMsgList
							if (hasNumError == false)
							{
								errorMsgList[errorMsgList_index++] = myvalidators[i][2];
								hasNumError = true;
							}
						}
						if (myvalidators[i][5]=="checkTotal") {
							checkTotalList[checkTotalList_index++] = myvalidators[i][1];
							checkTotalValue = myvalidators[i][6];
							checkTotalMsg = myvalidators[i][7];
						}
					}else if (validatorName=="alphaValidator") {
						if (clientAlphaValidator(myvalidators[i][1],myvalidators[i][3],isRequiredFlag)==false) {
							errorMsgList[errorMsgList_index++] = getIndex(myvalidators[i][1])+" "+myvalidators[i][2];
						}
					}
				}
		}
		
	}	

	if (errorMsgList.length>0) {
		var TotalErrorMessage = "";
		for (var i=0;i<errorMsgList.length;i++) {
			TotalErrorMessage += errorMsgList[i]+ "\n";
		}
		alert(TotalErrorMessage);
	} else if (clientCheckTotalValidator(checkTotalList,checkTotalValue)==false) {
		alert(checkTotalMsg);
	} else {
		return true;
	}
	
	return validateResult;
	
}



function clientCheckTotalValidator(fieldNameList,value) {
	if (fieldNameList.length==0) {
		return true;
	}
	
	var allEmpty = true;
	for (var i=0;i<fieldNameList.length;i++) {
		tmp = $F(fieldNameList[i]);
		if (tmp.length>0) {
			allEmpty = false;
		}
	}
	
	if (allEmpty==true) {
		return true;
	}

	for (var i=0;i<fieldNameList;i++) {
		if (fieldNameList[i].length==0) {
			fieldNameList[i] = "0";
		}
	}	
	
	var sum = 0;
	var IntValue = parseInt(value);
	for (var i=0;i<fieldNameList.length;i++) {
		var val = $F(fieldNameList[i]);
		if (val.length!=0) {
			sum += parseInt(val);
		}	
	}
	
	if (sum==IntValue) {
		return true;
	} else {
		return false;
	}

}


function isRequiredValidator(fieldName,errorMsg) {
	var value = $F(fieldName);
	if (value.length==0) {
		return false;
	} else {
		return true;
	}

}

function clientAlphaValidator(fieldName,validatePattern,isRequiredFlag) {
	var value = $F(fieldName);
	if (isRequiredFlag==false && value.length==0) {
		return true;
	}

	var RegularExpression  =  new RegExp(validatePattern);
	if (value.match(RegularExpression)) {
		return true;
	}	
	else {
		return false;
	}
}

function clientNumberValidator(fieldName,minValue,maxValue,isRequiredFlag) {
	var value = $F(fieldName);
	if (isRequiredFlag==false && value.length==0) {
		return true;
	}


	if (isNaN(value)) {
		return false;
	} else {
		var minValueLen = minValue.length;
		var maxValueLen = maxValue.length;
		var intValue = parseFloat(value);		
		// check max, ignore min parameter
		if (minValueLen==0) {
			if (intValue <= parseFloat(maxValue)) {
				return true;
			}
			else {
				return false;
			}
		// check min, ignore min parameter
		} else if (maxValueLen==0) {
			if (intValue >= parseFloat(minValue)) {
				return true;
			}
			else {
				return false;
			}
		//check range
		} else {
			if (intValue >= parseFloat(minValue) && intValue <= parseFloat(maxValue)) {
				return true;
			}
			else {
				return false;
			}
		}
	
	}
	
}


function getIndex(str){
	var returnValue;
	var token = str.split(":");
	var endIndex = token.length-2;
	var ind = null;
	for (var j=0;j<token.length;j++) {
		if (j==endIndex) {
			ind=token[j];
			break;
		}
	}
	
	if (isNaN(ind)) {
		returnValue = "";
	} else {	
		returnValue = parseInt(ind)+1;
	}
		
	return returnValue;
}
function actionLinkRefresh(arg1, formId, evenId) {

	var formNameSuffix = getPortletSuffix(arg1.id) + ':' + formId;

	var form = getForm(formNameSuffix);
	try {
		registerEventValue(formNameSuffix, evenId, null); 
		form.submit();
	} catch(e) {	
	}
}
function actionLinkSubmit(arg1, formId, evenId) {
	var formNameSuffix = getPortletSuffix(arg1.id) + ':' + formId;
	var form = document.getElementById(formNameSuffix);
	try {
		if (open2CheckIfSubmitted()) {
			registerEventValue(formNameSuffix, evenId, null); 
			open2SubmitForm(formNameSuffix);
		}
	} catch(e) {	
	}
}

function actionLinkSubmitDim(formName, evenId) {
	try {
		registerEventValue(formName, evenId, null); 
		open2SubmitForm(formName);
	} catch(e) {	
	}
}
function open2CheckIfSubmitted(){
	if(!isSubmitted){
		isSubmitted = true;
		return true;
	} else {
		return false;
	}
}


function open2SubmitForm(formId) {
	var form = getForm(formId);
	if (open2MyValidate()==true) {
		try {
			form.submit();
		} catch(e) {	

		}
	}	
}

function getPortletSuffix(id) {
	var index = id.indexOf(':');
	var suffix = id.substring(0, index);
	return suffix;
}

function getForm(formId) {
	return document.getElementById(formId);
}

function registerEventValue(formId,action,value) {
	try {
			var divId = formId + "_divSetEvent";
			var form = getForm(formId);

		if (form != null) 
			{
				var div = getOrCreateDiv( form, divId);
				var eventInput = document.createElement("INPUT");
				eventInput.type = "hidden";
				eventInput.name = action;
				if (value != null) {
					eventInput.value = value;
				}
				div.appendChild(eventInput);
			}
	}
	catch (e) {
	}
}
//highlight a field, typically in another color than white
function highlightField(obj) {
  if($(obj) != null){
	  $(obj).setStyle({backgroundColor: 'yellow'});
	}
}
//undo the highlighting of a field, typically put the backgroundcolor back to white
function resetFieldColor(obj) {
  if($(obj) != null)
	  $(obj).setStyle({backgroundColor: 'white'});
}
//showValidationError (for the moment doing only highlightField)
function showValidationError(field) {
		highlightField(field);
}
//hideValidationError ((for the moment doing only resetFieldColor)
function hideValidationError(field) {
		resetFieldColor(field);
}
//showValidationError simultaneously for 2 fields 
function showCompareValidationError(field1, field2) {
	showValidationError(field1);
	showValidationError(field2);
}
//hideValidationError simultaneously for 2 fields 
function hideCompareValidationError(field1, field2) {
	hideValidationError(field1);
	hideValidationError(field2);
}
//check whether required field has a non-empty value
function validateRequiredField(field) {
	var value = $F(field);
	//typing just 1 or more spaces is allowed
	//remark: the obligation to type something else than space should be defined in another function
    if(value.length == 0) {
		showValidationError(field);
		return false;
	} else {	
		hideValidationError(field);		
		return true;
	}
}
//check whether field is an email value
function validateEmail(field) {	
  var value = $F(field);
  if(value == "") {
		hideValidationError(field);
		return true;
  }  
  if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(value)){
		hideValidationError(field);	
		return (true)
  } else {
		showValidationError(field);
		return false;
  }
}
//check whether field is a cardnumber value
function validateCardNumber(field) {
  var i, n, c, r, t;
  var value = $F(field);
  if(value == "") {
		hideValidationError(field);
		return true;
  }  
  // First, reverse the string and remove any non-numeric characters.
  r = "";
  for (i = 0; i < value.length; i++) {
    c = parseInt(value.charAt(i), 10);
    if (c >= 0 && c <= 9)
    {
      r = c + r;
    }
  }
  // Check for a bad string.
  if (r.length <= 1) {
		showValidationError(field);
		return false;
  }
  // Now run through each single digit to create a new string. Even digits
  // are multiplied by two, odd digits are left alone.
  t = "";
  for (i = 0; i < r.length; i++) {
    c = parseInt(r.charAt(i), 10);
    if (i % 2 != 0){
      c *= 2;
    }
    t = t + c;
  }
  // Finally, add up all the single digits in this string.
  n = 0;
  for (i = 0; i < t.length; i++) {
    c = parseInt(t.charAt(i), 10);
    n = n + c;
  }
  // If the resulting sum is an even multiple of ten (but not zero), the
  // card number is good.
  if (n != 0 && n % 10 == 0) {
		hideValidationError(field);
		return (true)
  } else {
		showValidationError(field);
		return false;
  }
}

function validateLengthInterval(field,minValue,maxValue) {
  validateRangeField(field,minValue,maxValue);
}
//check whether the length of the value in a field is between the minValue and maxValue (minValue <= field <= maxValue)
function validateRangeField(field,minValue,maxValue) {
	var valueText = $F(field);
	var value = valueText.length
	var numberOfChecks = 0;
	var numberOfFailures = 0;
  
  if(minValue != null) {
    numberOfChecks++;
		if(value < minValue) {
		  numberOfFailures++;
		} 
	} 
  if(maxValue != null) {
    numberOfChecks++;
		if(value > maxValue) {
			numberOfFailures++;
		} 
	} 
  if(numberOfChecks == 0) {
    hideValidationError(field);
    return true;
  } else {
    if (numberOfFailures == 0) {
      hideValidationError(field);
      return true;
    } else {
      showValidationError(field);
      return false;
    }
  }
}
//check whether field1 operator field2? the operator is a parameter ('eq' or 'not' standing resp. for == or !=)
function validateCompareFields(field1,field2,operator) {
	if(operator == 'eq')
		return validateEquality(field1,field2);
	else if(operator == 'notEq')
		return validateNotEquals(field1,field2);
	
}



//check whether field 1 == field2
function validateEquality(field1,field2) {
	var value1 = $F(field1);
	var value2 = $F(field2);
	
	if(value1 == value2) {
		hideCompareValidationError(field1, field2);
		return true;
	}
	else {
		showCompareValidationError(field1, field2);
		return false;
	}
}
//check whether field1 differs from field2
function validateNotEquals(field1,field2) {
	var value1 = $F(field1);
	var value2 = $F(field2);
	
	if(value1 != value2) {
		hideCompareValidationError(field1, field2);
		return true;
	}
	else {
		showCompareValidationError(field1, field2);
		return false;
	}
}
//check whether a field matches a regex
function validateRegExp(field,pattern) {
	var value = $F(field);
	var re = new RegExp(pattern);	
	
	if(value == "") {
		hideValidationError(field);
		return true;
	}
	
	if(value.match(re)) {
		hideValidationError(field);		
		
		return false;
	}
	else {
		showValidationError(field);
		return true;
	}
}
//check whether a field has a specific length
function validateLengthExactly(field, exactValue) {
	var value = $F(field);
	if(value.length != exactValue) {
		showValidationError(field);
		return false;
	} else {
		hideValidationError(field);
		return true;
	}
}
/*check whether a field equals a StringToCompare
without generating validationErrors*/
function testEqual(field,StringToCompare){
	var value = $F(field);
	if(value == StringToCompare) {
		return true;
	}
	else {
		return false;
	}
}

/* Force Maxlength on textareas */
function restrictTextAreaLength(field,maxlength) {
	var obj = $(field);
	var value = obj.value;
    if (value.length > maxlength) {
    	obj.value=obj.value.substring(0,maxlength);
    	return false;
    }
    return true;
}




function blockKey(o,w){

  o.value = o.value.replace(w,'');
}





