////////////////////////////////////////////////////
///                                              ///
/// Funktionen zur Verarbeitung von Formularen   ///
///                                              ///
////////////////////////////////////////////////////
var num_str='0123456789'
var InputControlList = new Array();
var SubmitFunctionList = new Array();

function Submit(FormName, CLSID, target, askText, doCheck) {
	if (doCheck) {
		if (!CheckForm(FormName)) return
	}

	if (!is_empty(askText)) {
		if (!confirm(askText)) return;
	}
	
	if (!document.forms[FormName]) {
		location.href = CLSID;
		return;
	}
	if (target) {
		document.forms[FormName].target = target;
	}
	
	document.forms[FormName].action = CLSID;

	JSOK = true;
	if (SubmitFunctionList[FormName]) {
		JSOK = false;
		evalString = "JSOK = " + SubmitFunctionList[FormName] + ";";
		eval(evalString);
	}

	if (JSOK) document.forms[FormName].submit();
}

function CheckForm(FormName) {
	

//alert('form: ' + FormName + '  len: ' + InputControlList[FormName].length);
	for(i = 0; i < InputControlList[FormName].length; i++) {
		objInputControl = InputControlList[FormName][i];
//alert('i: ' + i + '  crtl: ' + objInputControl.ElementName);
//alert('i: ' + i);
		if (!validate(objInputControl, false)) return false;
	}
	
	return true;
}

function ask(CLSID, askText) {
	confirmOK = confirm(askText);
	if (confirmOK)	location.href = CLSID;
	return;
}

////////////////////////////////////////////////////
///                                              ///
/// Klassen zur Steuerung von Formularen         ///
///                                              ///
////////////////////////////////////////////////////

function InputControl(FormName, ElementName, ElementType, mMin, mMax) {
	ElementName = "'" + ElementName + "'";
	
	this.FormName = FormName;
	this.ElementName = ElementName;
	this.ElementType = ElementType;
	this.is_required = '';
	this.mMin = mMin;
	this.mMax = mMax;
	this.mVK = 9;
	this.mNK = 2;
	
	this.set = function (value) {
		objForm = document.forms[this.FormName];
		evalString = "objElement = objForm.elements[" + this.ElementName + "]";
		eval(evalString);
		
		objElement.value = value;
	}
}

function validate (objInputControl, showAlert) {

	objForm = document.forms[objInputControl.FormName];
	evalString = "objElement = objForm.elements[" + objInputControl.ElementName + "]";
	eval(evalString);
//	objElement = objForm.elements[objInputControl.ElementName];

	crtlType = "text";
	switch(objInputControl.ElementType){
		case "char": ErrorCode = 0; break;
		case "text": ErrorCode = 0; break;
		case "list": ErrorCode = 0; break;
		case "time": 
			ErrorCode = VAT(objElement, objElement.value, objInputControl.mMin, objInputControl.mMax); 
			if (ErrorCode > 0) {
				if (showAlert) alert('Falsches Zeitformat. Code: ' + ErrorCode);
				objElement.focus();
				objElement.select();
			}
			break; 				
		case "date": 
			ErrorCode = VAD(objElement, objElement.value, objInputControl.mMin, objInputControl.mMax); 
			if (ErrorCode > 0) {
				if (showAlert) alert('Falsches Datumsformat. Code: ' + ErrorCode);
				objElement.focus();
				objElement.select();
			}
			break; 		
		case "long": 
			ErrorCode = VAI(objElement, objElement.value, true, objInputControl.mVK, objInputControl.mMin, objInputControl.mMax); 
			if (ErrorCode > 0) {
				switch (ErrorCode) {
					case 1: if (showAlert) alert('Die angegebene Zahl ist zu klein.'); break;
					case 2: if (showAlert) alert('Die angegebene Zahl ist zu groß.'); break;
					default: if (showAlert) alert('Es sind nur ganze Zahlen erlaubt. Code: ' + ErrorCode); break;
				}
				objElement.focus();
				objElement.select();
			}
			break; 		
		case "money": 
			ErrorCode = VAF(objElement, objElement.value, true, objInputControl.mVK, objInputControl.mNK, objInputControl.mMin, objInputControl.mMax);
			if (ErrorCode > 0) {
				if (showAlert) alert('Falsches Format für einen Geldbetrag. Code: ' + ErrorCode);
				objElement.focus();
				objElement.select();
			}			
			break; 
		case "double": 
			ErrorCode = VAF(objElement, objElement.value, true, objInputControl.mVK, objInputControl.mNK, objInputControl.mMin, objInputControl.mMax);
			if (ErrorCode) {
				switch (ErrorCode) {
					case 1: if (showAlert) alert('Die angegebene Zahl ist zu klein.'); break;
					case 2: if (showAlert) alert('Die angegebene Zahl ist zu groß.'); break;
					default: if (showAlert) alert('Es sind nur ganze Zahlen erlaubt. Code: ' + ErrorCode); break;
				}
				objElement.focus();
				objElement.select();
			}			
			break; 
		case "password": ErrorCode = VAC(objElement, objElement.value); break; 
		case "option": ErrorCode = 0; break; 
		case "combo": ErrorCode = 0; crtlType="select"; break; 
		case "mutex": ErrorCode = 0; crtlType="select"; break; 
		case "file": ErrorCode = 0; break; 
		default: ErrorCode = 99; break;
	}

	if (ErrorCode > 0) {
		objElement.focus();
		objElement.select();
		return false;
	}
	
	if (crtlType == "select") {
		if ((objElement.selectedIndex == 0) && objInputControl.is_required) {
			alert(objInputControl.is_required);
			objElement.focus();
			objElement.select();
			return false;
		}
	}
	else {
		if (is_empty(objElement.value) && objInputControl.is_required) {
			if (showAlert) alert(objInputControl.is_required);
			objElement.focus();
			objElement.select();
			return false;
		}
	}
		
	return true;
}

function addControl (FormName, objInputControl) {
	listkey = InputControlList[FormName].length;
	InputControlList[FormName][listkey] = objInputControl;
}

function  is_empty (Wert) {
	jetzt = Wert.replace(/\s/, "");
	while (jetzt.search(/\s/) != -1) {
		jetzt = jetzt.replace(/\s/, "")
	}

	if (jetzt.length == 0) return true;
	else return false;
}
	
////////////////////////////////////////////////////
///                                              ///
/// Funktionen zur Validierung der Eingabe       ///
///                                              ///
////////////////////////////////////////////////////

function OKPI(e){
  /// Test auf erlaubte Zeichen in einem Integer
  var c=GCC(e)
  if (!c.match(/^[0-9]$/)) return false;
  else return true;
}

function OKPD(e){
  /// Test auf erlaubte Zeichen in einem Datum
  var c=GCC(e)
  if (!c.match(/^[0-9\.]$/)) return false;
  else return true;
}

function OKPT(e){
  /// Test auf erlaubte Zeichen in einem Zeit-String
  var c=GCC(e)
  if (!c.match(/^[0-9\:]$/)) return false;
  else return true;
}

function OKPF(e){
  var c=GCC(e)
  if(c!=","&&c!="-"&&c!="1"&&c!="2"&&c!="3"&&c!="4"&&c!="5"&&c!="6"&&c!="7"&&c!="8"&&c!="9"&&c!="0"&&c!=String.fromCharCode(8))
    return false;
  return true;
}

function OKPC(e){
  return true;
}

function VAC(f,v){
  return 0;
}

function VAI(f,v,cbe,vk_f,min,max){
  // ReturnCodes:
  // 0 - Fehlerfrei
  // 1 - Zahl zu klein
  // 2 - Zahl zu groß
  // 99 - Falsches Format
  
  retCode = 0;
  if (is_empty(v)) {
    retCode = 0;
    return (retCode);
  }

  if(ACI(v)==false){
    retCode = 99;
    return (retCode);
  }

  val=GVK(vk_f,v,0);

  if(min != null){
    if(Number(val)<Number(min)){
      retCode = 1;
      val=min;
    }
  }
  if(max != null){
    if(Number(val)>Number(max)){
      retCode = 2;
      val=max;
    }
  }

  f.value = val;
  
  return (retCode);
}

function VAT(f,v,min,max){
  // ReturnCodes:
  // 0 - Fehlerfrei
  // 1 - Zeit zu klein
  // 2 - Zeit zu groß

  retCode = 0;

  if (is_empty(v)) {
    retCode = 0;
    return (retCode);
  }

  if(ACT(f,v)==false){
//    f.value='';
    retCode = 99;
    return (retCode);
  }

  d=f.value.split(":");
  if(min != null){
    var b=true;
    mi=min.split(":");
    if(d[2]<mi[0])
      b=false;
    else if(d[2]==mi[0]){
      if(d[1]<mi[1])
        b=false;
      else if(d[1]==mi[1]){
        if(d[0]<mi[2])
          b=false;
      }
    }
    if(b==false){
      retCode = 1;
      f.value=mi[2]+'.'+mi[1]+'.'+mi[0];
    }
  }

  if(max != null){
    var b=true;
    ma=max.split("/");
    if(d[2]>ma[0])
      b=false;
    else if(d[2]==ma[0]){
      if(d[1]>ma[1])
        b=false;
      else if(d[1]==ma[1]){
        if(d[0]>ma[2])
          b=false;
      }
    }
    if(b==false){
      retCode = 2;
      f.value=ma[2]+'.'+ma[1]+'.'+ma[0];
    }
  }

  return (retCode);
}

function VAD(f,v,min,max){
  // ReturnCodes:
  // 0 - Fehlerfrei
  // 1 - Datum zu klein
  // 2 - Datum zu groß

  retCode = 0;

  if (is_empty(v)) {
    retCode = 0;
    return (retCode);
  }

  if(ACD(f,v)==false){
    f.value='';
    retCode = 99;
    return (retCode);
  }

  d=f.value.split(".");
  if(min != null){
    var b=true;
    mi=min.split("/");
    if(d[2]<mi[0])
      b=false;
    else if(d[2]==mi[0]){
      if(d[1]<mi[1])
        b=false;
      else if(d[1]==mi[1]){
        if(d[0]<mi[2])
          b=false;
      }
    }
    if(b==false){
      retCode = 1;
      f.value=mi[2]+'.'+mi[1]+'.'+mi[0];
    }
  }

  if(max != null){
    var b=true;
    ma=max.split("/");
    if(d[2]>ma[0])
      b=false;
    else if(d[2]==ma[0]){
      if(d[1]>ma[1])
        b=false;
      else if(d[1]==ma[1]){
        if(d[0]>ma[2])
          b=false;
      }
    }
    if(b==false){
      retCode = 2;
      f.value=ma[2]+'.'+ma[1]+'.'+ma[0];
    }
  }

  return (retCode);
}

function VAF(f,v,cbe,vk_f,nk_f,min,max){
  // ReturnCodes:
  // 0 - Fehlerfrei
  // 1 - Zahl zu klein
  // 2 - Zahl zu groß

  retCode = 0;

  if(is_empty(v)) {
    retCode = 0;
    return (retCode);
  }

  if(ACF(v)==false){
    f.value='';
    retCode = 99;
    return (retCode);
  }

  if(min != null){
    if(MKNum(v)<MKNum(min)){
      retCode = 1;
    }
  }

  if(max != null){
    if(MKNum(v)>MKNum(max)){
      retCode = 2;
    }
  }

  vor=GVK(vk_f,v,0);
  nach=GNK(nk_f,v);

  f.value = vor+','+nach;
  return (retCode);

}


function GCC(e){
  if(document.all) return String.fromCharCode(e.keyCode)
    return String.fromCharCode(e.which)
}

function GVK(vk_f,v,tp){
  var end=v.lastIndexOf(",");
  var str;
  var new_str="";
  var i;
  var j;

  if(v.charAt(0)=='-'){
    var m=true;
    v=v.substring(1,v.length);
  }
  else
    var m=false;

  if(end==0)
    str='0';
  else if(end==-1)
    str=v;
  else
    str=v.substring(0,end);

  for(i=0;i<str.length;i++){
    if(num_str.indexOf(str.charAt(i))>-1){
      new_str=new_str+str.charAt(i);
    }
  }

  str=String(Number(new_str));

  for(j=0,new_str="",i=str.length-1;j<vk_f&&i>=0;i--,j++){
    if(j>0&&(j%3)==0&&tp!=0&&str.charAt(i)!='-'){
      new_str='.'+new_str;
    }
    new_str=str.charAt(i)+new_str;
  }

  if(m==true&&Number(new_str)>0)
    new_str='-'+new_str;

  return new_str;
}

function GNK(nk_f,v){
  var start=v.lastIndexOf(",")+1;
  var str;
  var new_str="";
  var i;

  if(start==0){
    new_str='';
    while(new_str.length<nk_f)
      new_str=new_str+'0';
  }
  str=v.substring(start,v.length);
  for(i=0;i<str.length;i++){
    if(num_str.indexOf(str.charAt(i))>-1){
      new_str=new_str+str.charAt(i);
    }
  }
  if(nk_f){
    if(new_str.length>nk_f){
      new_str=new_str.substr(0,nk_f);
    }
    else if(new_str.length<nk_f){
      while(new_str.length<nk_f)
        new_str=new_str+'0';
    }
  }
  return new_str;
}

function ACT(f,v)
{
  if(v.length==0)
    return true;

  d=v.split(":");
  if (d.length != 2) return false;

  if (Number(d[0]) > 23) return false;
  if (Number(d[1]) > 59) return false;
  
  a = d[0].length;
  if (a==0) return false;
  if (a==1) d[0]='0' + d[0];

  a = d[1].length;
  if (a!=2) return false;

  f.value = d[0] + ":" + d[1];
  return true;
}


function ACD(f,v)
{
  if(v.length==0)
    return true;
  isplit=v.indexOf('.');

  if(v.length>=6&&isplit==-1){
    if(v.length==6){
      var y=v.substr(4,2);
      if(Number(y)<50)
        y='20'+y
      else
        y='19'+y
      v=v.substr(0,4)+y
    }

    v=v.substr(0,2)+'.'+v.substr(2,2)+'.'+v.substr(4,4)
    if(f)
      if(f.value)
        f.value=v
    isplit=v.indexOf('.');
  }

  if(isplit==-1||isplit==v.length)
    return false;

  SD=v.substring(0,isplit);
  monthSplit=isplit+1;

  isplit=v.indexOf('.',monthSplit);
  if(isplit==-1 ||(isplit+1)==v.length)
    return false;

  SM=v.substring((SD.length+1),isplit);
  SY=v.substring(isplit+1);

  while(SM.length<2)
    SM='0'+SM

  SM=SM.substring(0,2)

  while(SD.length<2)
    SD='0'+SD

  SD=SD.substring(0,2)

  while(SY.length<2)
    SY='0'+SY

  if(Number(SY)<50)
    SY='20'+SY
  else if(Number(SY)<100)
    SY='19'+SY

  SY=SY.substring(0,4)

  v=SD+'.'+SM+'.'+SY

  if(f)
    if(f.value)
      f.value=v

  if(!ACI(SM))
    return false;
  else if(!ACNR(SM,1,12))
    return false;
  else if(!ACI(SY))
    return false;
  else if(!ACNR(SY,0,null))
    return false;
  else if(!ACI(SD))
    return false;
  else if(!ACDay(SY,SM,SD))
    return false;
  else{
    return true;
  }
}

function ACDay(checkYear,checkMonth,checkDay){
  maxDay=31;
  if(checkMonth==4||checkMonth==6||checkMonth==9||checkMonth==11)
    maxDay=30;
  else if(checkMonth==2){
    if(checkYear%4>0)
      maxDay=28;
    else if(checkYear%100==0&&checkYear%400>0)
      maxDay=28;
    else
      maxDay=29;
  }
  return ACNR(checkDay,1,maxDay);
}

function ACI(v){
  if(v.length==0)
    return true;
  var start_format=".+-0123456789";
  var number_format=".0123456789";
  var check_char;

  check_char=start_format.indexOf(v.charAt(0));
  if(check_char<1)
    return false;
  for(var i=1;i<v.length;i++){
    check_char=number_format.indexOf(v.charAt(i));
    if(check_char<0)
    return false;
  }
  return true;
}

function ACNR(v, min_value, max_value){
  if(v.length==0)
    return true;
  if(min_value!=null){
    if(v<min_value)
      return false;
  }
  if(max_value!=null){
    if(v>max_value)
      return false;
  }
  return true;
}

function ACF(v){
  if(v.length==0)
    return true;
  var start_format=",.+-0123456789";
  var number_format=",.0123456789";
  var check_char;

  check_char=start_format.indexOf(v.charAt(0))
  if(check_char<0)
    return false;

  for(var i=1;i<v.length;i++){
    check_char=number_format.indexOf(v.charAt(i))
    if(check_char<0)
      return false;
  }
  return true
}
