/* suppor for all forms */

/*
Sets wanted action and submit data form
*/
function actionCall(action){
	//setParameter('action',action);
	document.data.action.value = action;
	document.data.submit();
	//if form was send to next window (modal?)- reset target to self
	if( document.data.getAttribute('target') != ""){
		document.data.setAttribute("target","");
	}
}

/*
Sets parametr for action called in future (call this prior to actionCall)
*/
function setParameter(name,value){
	if( el = eval("document.data."+name)){ // check existence of element
		el.value=value
		return;
	}
	form=document.data;
	input=document.createElement('input');
	input.setAttribute("type","hidden");
	input.setAttribute("name",name);
	input.setAttribute("value",value);
	eval("document.data."+name+"=input"); // IE doesnt add reference document.form.name which is needed for checking if element exist
	form.appendChild(input);
}
/* change target for form */
function setTarget2Modal(){
	document.data.setAttribute("target","plaantModalWindow");
}
/*
Used by form field onChange triggers. 
*/
function fieldChanged(field,forceSubmit,validationParameters) {
  if(validationParameters != undefined){
    if(!validateField(field,validationParameters)){
      field.className = "inputError";
      return false;
    }
  }
  formChanged = true;
  if(forceSubmit){
    setParameter("submitFieldName",field.name);
    actionCall("deskFormSubmitByField");
  }
  field.className = undefined;
  return true;
}

function validateFields() {
  var errorMnd = false;
  var firstField;
  if(mandatoryFields != undefined){
	  var mndFields = mandatoryFields.split(";");
	  for (var i=0; i < mndFields.length; i++) {
	    var fieldName = mndFields[i];
	    var realField = document.getElementsByName (fieldName).item(0);
	    if(realField.value.length == 0){
	      realField.className = "inputError";
		  if(firstField == undefined){
	    	firstField = realField;
	      }
	      errorMnd = true;
	    }
	  }
  }
  if(mandatoryReferenceFields != undefined){
	  var mndReferenceFields = mandatoryReferenceFields.split(";");
	  for (var i=0; i < mndReferenceFields.length; i++) {
	    fieldName = mndReferenceFields[i];
	    realField = document.getElementById (fieldName);
        realField.className = "inputError";
	    if(firstField == undefined){
	    	firstField = realField;
	    }
	    errorMnd = true;
	  }
  }
  if(errorMnd){
      alert(langMsg0027);
      firstField.focus();
      return false;
  }else{
	  return true;
  }
}


function validateField(field,validationParameters) {
  if(validationParameters.isNotNull == "true"){
    if(field.value.length == 0){
      alert(langMsg0027);
      return false;
    }
  }
  if(validationParameters.fieldType == "string"){
    return validateString(field,validationParameters);
  }else if(validationParameters.fieldType == "integer"){
    return validateInteger(field,validationParameters);
  }else if(validationParameters.fieldType == "numeric"){
    return validateNumber(field,validationParameters);
  }else if(validationParameters.fieldType == "date"){
    return validateDate(field,validationParameters);
  }else if(validationParameters.fieldType == "time"){
    return validateTime(field,validationParameters);
  }  
  return true;
}

function validateString(field,validationParameters) {
  if(validationParameters.formatPatternForInput != undefined){
    if(!checkValidStringPattern(field,validationParameters.formatPatternForInput)){
      return false;
    }else{
      return true;
    }
  }
  if(validationParameters.maxSize > 0){
    if(field.value.length > validationParameters.maxSize){
      alert(langMsg0029 + validationParameters.maxSize);
      return false;
    }
  }
  return true;
}

function checkValidStringPattern(field, pattern) {
  var numbers = "0123456789";
  var hex = "0123456789abcdefABCDEF";
  if(field.value.length != pattern.length){
    alert(langMsg0032);
    return false;
  }
  var ok = true;
  for (var i=0; i < pattern.length; i++) {
    var ch = pattern.charAt(i);
    var fieldCh = field.value.charAt(i);
    if(ch == "#"){
      if(numbers.indexOf(fieldCh) == -1) ok = false;
    }else if(ch == "U" || ch == "L" || ch == "?"){
      if(numbers.indexOf(fieldCh) != -1) ok = false;
    }else if(ch == "A") {
    }else if(ch == "*"){
    }else if(ch == "H"){
      if(hex.indexOf(fieldCh) != -1) ok = false;
    }else{
      if(ch != fieldCh) ok = false;
    }
    if(!ok){
      alert(langMsg0032);
      return false;
    }
  }
  return true;
}

function validateDate(field,validationParameters) {
  var date = createDate(field,validationParameters);
  if(date == null){
    return false;
  }else{
    return true;
  }
}

function validateTime(field,validationParameters) {
  var dArray;
  var timeSeparator = validationParameters.timeSeparator;
  var timeFormat = validationParameters.timeFormat;
 
  try {
    if(timeFormat.length == 1){
      dArray = new Array();
      dArray[0] = field.value;
    }else{
      if (field.value.indexOf(timeSeparator) >= 0){
        dArray = field.value.split(timeSeparator);
      }else{
        alert(langMsg0032);
        return false;
      }
    }
    if(dArray.length != timeFormat.length){
      alert(langMsg0032);
      return false;
    }
    for(var i = 0; i < timeFormat.length; i++){
		var timePartString = dArray[i];
		if (timePartString.length > 2) {
	      alert(langMsg0032);
	      return false;
		}
		var timePart = parseInt(timePartString, 10);
		if (isNaN(timePart) || timePart < 0) {
	      alert(langMsg0032);
	      return false;
		}
    }
	return true;
  } catch(e) {
    alert(langMsg0032);
    return false;
  }
}


function validateInteger(field,validationParameters) {
  var allowedChars = "0123456789-";
  for (var i=0; i < field.value.length; i++) {
    var ch = field.value.charAt(i);
    if (allowedChars.indexOf(ch) == -1) {
       alert(langMsg0080 + ": '" + ch + "'");
       return false;
    }	
  }
  if(!checkForDoubleInput(field,"-",0)){
    return false;
  }
  var num = createNumber(field,validationParameters);
  if(num == null){
    return false;
  }
  if(!isNumberInRange(num,validationParameters)){
    return false;
  }
  return true;
}

function validateNumber(field,validationParameters) {
  var allowedChars = "0123456789-";
  allowedChars = allowedChars.concat(validationParameters.decimalSeparator);
  for (var i=0; i < field.value.length; i++) {
    var ch = field.value.charAt(i);
    if (allowedChars.indexOf(ch) == -1) {
       alert(langMsg0080 + ": '" + ch + "'");
       return false;
    }	
  }
  if(!checkForDoubleInput(field,"-",0)){
    return false;
  }
  if(!checkForDoubleInput(field,validationParameters.decimalSeparator)){
    return false;
  }
  var num = createNumber(field,validationParameters);
  if(num == null){
    return false;
  }
  if(!isNumberInRange(num,validationParameters)){
    return false;
  }
  return true;
}

function isNumberInRange(num,validationParameters) {
  var low;
  var high;
  var ok = true;
  if(validationParameters.low != "null" && validationParameters.low.length > 0 ){
    low = Number(validationParameters.low);
    if(num < low){
      ok = false; 
    }
  }
  if(validationParameters.high != "null" && validationParameters.high.length > 0 ){
    high = Number(validationParameters.high);
    if(num > high){
      ok = false; 
    }
  }
  if(!ok){
    alert(langMsg0028 + " " + low + "..." + high);
  }
  return ok;
}

function checkForDoubleInput(field, znak, position) {
  var charPos = field.value.indexOf(znak);
  if(charPos != -1){
    if((position != undefined && charPos != position) || 
      charPos != field.value.lastIndexOf(znak)){
       alert(langMsg0080 + ": " + znak);
       return false;
    }
  }
  return true;
}

function createNumber(field,validationParameters) {
  var leftPart = "";
  var rightPart = "";
  var num;
  decPos = field.value.indexOf(validationParameters.decimalSeparator);
  if(decPos == -1){
    leftPart = field.value;
    num = Number(leftPart);
  }else{
    leftPart = field.value.substr(0,decPos);
    rightPart = field.value.substr(decPos + 1);
    num = Number(leftPart.concat(".").concat(rightPart));
  }
  
  if(validationParameters.precision != "null" && validationParameters.precision > 0){
    if((leftPart.length + rightPart.length) > validationParameters.precision){
      alert(langMsg0029 + validationParameters.precision);
      return null;
    }
  }
  if(validationParameters.scale != "null" && validationParameters.scale > 0){
    if(rightPart.length > validationParameters.scale){
      alert(langMsg0081 + ": " + validationParameters.scale);
      return null;
    }
  }
  return num;
}

function createDate(field, validationParameters){
  var dateVal;
  var dArray;
  var d, m, y;
  var dSt, mSt, ySt;
  var ok = true;
 
  try {
    if (field.value.indexOf(validationParameters.dateSeparator) >= 0){
      dArray = field.value.split(validationParameters.dateSeparator);
    }else{
      alert(langMsg0032);
      return null;
    }
    switch (validationParameters.dateFormat) {
      case "dmy" :
        d = parseInt(dArray[0], 10);
        dSt = dArray[0];
        m = parseInt(dArray[1], 10) - 1;
        mSt = dArray[1];
        y = parseInt(dArray[2], 10);
        ySt = dArray[2];
        break;
      case "ymd" :
        d = parseInt(dArray[2], 10);
        dSt = dArray[2];
        m = parseInt(dArray[1], 10) - 1;
        mSt = dArray[1];
        y = parseInt(dArray[0], 10);
        ySt = dArray[0];
        break;
      case "mdy" :
      default :
        d = parseInt(dArray[1], 10);
        dSt = dArray[1];
        m = parseInt(dArray[0], 10) - 1;
        mSt = dArray[0];
        y = parseInt(dArray[2], 10);
        ySt = dArray[2];
        break;
    }
	if (dSt.length > 2 || mSt.length > 2 || ySt.length != 4 ) {
      alert(langMsg0032);
      return null;
	}
	if ((isNaN(d) | (d < 0)) ||	(isNaN(m) | (m < 0)) || (isNaN(y) | (y < 0))) {
      alert(langMsg0032);
      return null;
	}
    dateVal = new Date(y, m, d);
  } catch(e) {
    alert(langMsg0032);
    return null;
  }
  return dateVal;
}

