// Form Guard

// Copyright Xin Yang 2003
// Web Site: www.yxScripts.com
// EMail: m_yangxin@hotmail.com

// This script is free as long as the copyright notice remains intact.

var reInt=/^\d+$/;
var reSignedInt=/^(\+|-)?\d+$/;
var reFloat=/^\d+(\.\d+)?$/;
var reSignedFloat=/^(\+|-)?\d+(\.\d+)?$/;
var reChar=/^[\w\-]+$/;
var reEMail=/^\w[\w\-\.]+\@\w[\w\-]+(\.[\w\-]+)+$/;
var reIP=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
var rePostalCA=/^(\w\d){3}$/;
var reNonBlank=/[\S]/;

function rpChar(f) {
  var df=f;

  df=df.replace(/\\/g, '\\\\');
  df=df.replace(/\//g, '\\\/');
  df=df.replace(/\[/g, '\\\[');
  df=df.replace(/\]/g, '\\\]');
  df=df.replace(/\(/g, '\\\(');
  df=df.replace(/\)/g, '\\\)');
  df=df.replace(/\{/g, '\\\{');
  df=df.replace(/\}/g, '\\\}');
  df=df.replace(/\</g, '\\\<');
  df=df.replace(/\>/g, '\\\>');
  df=df.replace(/\|/g, '\\\|');
  df=df.replace(/\*/g, '\\\*');
  df=df.replace(/\?/g, '\\\?');
  df=df.replace(/\+/g, '\\\+');
  df=df.replace(/\^/g, '\\\^');
  df=df.replace(/\$/g, '\\\$');

  return df;
}

function rePhone(f) {
  var df=rpChar(f);

  df=df.replace(/d/gi, '\\d');
  df=df.replace(/w/gi, '(\\w|\\d)');

  return new RegExp('^'+df+'$');
}

function reDate(f) {
  var df=rpChar(f);

  df=df.replace(/dd/gi, '\\d\\d');
  df=df.replace(/mm/gi, '\\d\\d');
  df=df.replace(/yyyy/gi, '\\d\\d\\d\\d');

  return new RegExp('^'+df+'$');
}

function reCharNM(n,m) {
  return new RegExp("\^[\\w\\-]{"+n+","+m+"}\$");
}

function reNumberN(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}\$");
}

function reNumberN2(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\$");
}

function reNumberNM(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}(\\.\\d{1,"+m+"})?\$");
}

function reNumberNM2(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\\.\\d{"+m+"}\$");
}

function _checkIt(re, field, msg) {
  if (!re.test(field.value)) {
    alert(msg);

    field.select();
    field.focus();

    return false;
  }

  return true;
}

function goodPhone(pf, field, msg) {
  return _checkIt(rePhone(pf), field, msg);
}

function goodPostalCA(field, msg) {
  return _checkIt(rePostalCA, field, msg);
}

function goodDate(df, field, msg)
{
	if ( goodDateSpecial(field.value) ) {
    	return true;
    }
    else {
      alert(msg);

      field.select();
      field.focus();
	  
	  return false;
    }
}

function goodDateSpecialUS(field)
{
    //(Schritt 1) Fehlerbehandlung
 	if (!field) {
		return false;
	}
 	field = field.toString();

    //(Schritt 2) Aufspaltung des Datums
 	var fieldSplit = field.split("-");
 	if ( fieldSplit.length != 3 ) {
		return false;
	}

    //(Schritt 3) Entfernung der fuehrenden Nullen und Anpassung des Monats
 	fieldSplit[2] = parseInt (fieldSplit[2], 10);
 	fieldSplit[1] = parseInt (fieldSplit[1], 10) - 1;
 	    // radix "10" wichtig, da sonst Zahlen mit führender "0" im Oktalsystem verarbeitet werden ("08"
        // und "09" sind dann keine gültigen Zahlen...)

    //(Schritt 4) Behandlung Jahr nur zweistellig
 	if (fieldSplit[0].length == 2) {
 		fieldSplit[0] = "20" + fieldSplit[0];
	}
	if (fieldSplit[0].length > 4) {
 		return false;
 	}

 	//(Schritt 5) Erzeugung eines neuen Dateobjektes
	var kontrolldatum = new Date(fieldSplit[0], fieldSplit[1], fieldSplit[2]);

    //(Schritt 6) Vergleich, ob das eingegebene Datum gleich dem JS-Datum ist
 	if (kontrolldatum.getDate() == fieldSplit[2] && kontrolldatum.getMonth() == fieldSplit[1] && kontrolldatum.getFullYear() == fieldSplit[0]) {
    	/*
    	if ( kontrolldatum <= new Date() ) {  // vor oder gleich dem heutigen Datum
			return true;
		}
		else {
			return false;
		}
		*/
		return true;
 	}
 	else {
 	 	return false;
 	}
}

function goodDateSpecial(field)
{
    //(Schritt 1) Fehlerbehandlung
 	if (!field) {
		return false;
	}
 	field = field.toString();

    //(Schritt 2) Aufspaltung des Datums
 	var fieldSplit = field.split(".");
 	if ( fieldSplit.length != 3 ) {
		return false;
	}

    //(Schritt 3) Entfernung der fuehrenden Nullen und Anpassung des Monats
 	fieldSplit[0] = parseInt (fieldSplit[0], 10);
 	fieldSplit[1] = parseInt (fieldSplit[1], 10) -1;
 	 	// radix "10" wichtig, da sonst Zahlen mit führender "0" im Oktalsystem verarbeitet werden ("08"
        // und "09" sind dann keine gültigen Zahlen...)

    //(Schritt 4) Behandlung Jahr nur zweistellig
 	if (fieldSplit[2].length == 2) {
 		fieldSplit[2] = "20" + fieldSplit[2];
	}
	if (fieldSplit[2].length > 4) {
 		return false;
 	}
    
	//(Schritt 5) Erzeugung eines neuen Dateobjektes
	var kontrolldatum = new Date(fieldSplit[2], fieldSplit[1], fieldSplit[0]);

    //(Schritt 6) Vergleich, ob das eingegebene Datum gleich dem JS-Datum ist
 	if (kontrolldatum.getDate() == fieldSplit[0] && kontrolldatum.getMonth() == fieldSplit[1] && kontrolldatum.getFullYear() == fieldSplit[2]) {
    	/*
    	if ( kontrolldatum <= new Date() ) {  // vor oder gleich dem heutigen Datum
			return true;
		}
		else {
			return false;
		}
		*/
		return true;
 	}
 	else {
 	 	return false;
 	}
}

function goodIP(field, msg) {
  return _checkIt(reIP, field, msg);
}

function goodChar(field, msg) {
  return _checkIt(reChar, field, msg);
}

function goodEMail(field, msg) {
  return _checkIt(reEMail, field, msg);
}

function goodInt(field, msg) {
  return _checkIt(reInt, field, msg);
}

function goodSignedInt(field, msg) {
  return _checkIt(reSignedInt, field, msg);
}

function goodFloat(field, msg) {
  return _checkIt(reFloat, field, msg);
}

function goodSignedFloat(field, msg) {
  return _checkIt(reSignedFloat, field, msg);
}

function goodIntLen(n, field, msg) {
  return _checkIt(reNumberN(n,0), field, msg);
}

function goodSignedIntLen(n, field, msg) {
  return _checkIt(reNumberN(n,1), field, msg);
}

function goodIntLen2(n, field, msg) {
  return _checkIt(reNumberN2(n,0), field, msg);
}

function goodSignedIntLen2(n, field, msg) {
  return _checkIt(reNumberN2(n,1), field, msg);
}

function goodCharLen(n, m, field, msg) {
  return _checkIt(reCharNM(n,m), field, msg);
}

function goodFloatLen(n, m, field, msg) {
  return _checkIt(reNumberNM(n,m,0), field, msg);
}

function goodSignedFloatLen(n, m, field, msg) {
  return _checkIt(reNumberNM(n,m,1), field, msg);
}

function goodFloatLen2(n, m, field, msg) {
  return _checkIt(reNumberNM2(n,m,0), field, msg);
}

function goodSignedFloatLen2(n, m, field, msg) {
  return _checkIt(reNumberNM2(n,m,1), field, msg);
}

function nonBlank(field, msg) {
  return _checkIt(reNonBlank, field, msg);
}

function _rangeIt(field, r1, r2, msg) {
  if (field.value>=r1 && field.value<=r2) {
    return true;
  }
  else {
    alert(msg);

    field.select();
    field.focus();

    return false;
  }
}

function rangeInt(field, r1, r2, msg) {
  if (goodInt(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedInt(field, r1, r2, msg) {
  if (goodSignedInt(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeFloat(field, r1, r2, msg) {
  if (goodFloat(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedFloat(field, r1, r2, msg) {
  if (goodSignedFloat(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeIntLen(n, field, r1, r2, msg) {
  if (goodIntLen(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedIntLen(n, field, r1, r2, msg) {
  if (goodSignedIntLen(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeIntLen2(n, field, r1, r2, msg) {
  if (goodIntLen2(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedIntLen2(n, field, r1, r2, msg) {
  if (goodSignedIntLen2(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeFloatLen(n, m, field, r1, r2, msg) {
  if (goodFloatLen(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedFloatLen(n, m, field, r1, r2, msg) {
  if (goodSignedFloatLen(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeFloatLen2(n, m, field, r1, r2, msg) {
  if (goodFloatLen2(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedFloatLen2(n, m, field, r1, r2, msg) {
  if (goodSignedFloatLen2(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function _dd(n) {
  return (n<10)?"0"+n:""+n;
}

function _getOffset(n) {
  var d=new Date();
  if (n!=0) {
    d.setTime(d.getTime()+n*86400000);
  }
  return d.getFullYear()+""+_dd(d.getMonth()+1)+""+_dd(d.getDate())+"";
}

function _stringIt(df, d) {
  var y4=df.search(/yyyy/i), m2=df.search(/mm/i), d2=df.search(/dd/i);
  return d.substring(y4, y4+4)+d.substring(m2, m2+2)+d.substring(d2, d2+2);
}

function rangeDate(df, field, r1, r2, msg) {
  if (goodDate(df, field, msg)) {
    var d=_stringIt(df, field.value);

    var r1x="", r2x="";
    if (r1.search(/^\d+$/)!=-1) {
      r1x=_getOffset(r1-0);
    }
    else {
      r1x=_stringIt(df, r1);
    }
    if (r2.search(/^\d+$/)!=-1) {
      r2x=_getOffset(r2-0);
    }
    else {
      r2x=_stringIt(df, r2);
    }

    if (d<r1x || d>r2x) {
      alert(msg);

      field.select();
      field.focus();
    }
    else {
      return true;
    }
  }

  return false;
}

function goodDateRange(df, field1, field2, msg) {
  if (goodDate(df, field1, msg) && goodDate(df, field2, msg)) {
    if (_stringIt(df, field1.value)>_stringIt(df, field2.value)) {
      alert(msg);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return false;
}

function goodDateRange2(df, field1, field2, msg) {
  if (goodDate(df, field1, msg) && goodDate(df, field2, msg)) {
    if (_stringIt(df, field1.value)>=_stringIt(df, field2.value)) {
      alert(msg);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return false;
}

// Funktionen f&uuml;r den TauwebPro. Support Solutions GmbH 15.04.2004


function checkField16(form) {
  if (goodDate("dd.mm.yyyy", form.fdatDatum, "Bitte geben Sie im Feld Datum ein gültiges Datum im Format 01.01.2000 ein. Das Datum darf auch nicht in der Zukunft liegen."))
    alert("Passed");
}
function checkField5(form) {
  if (goodIntLen(5, form.fnumKundenNr, "Bitte geben Sie im Feld KundenNr eine Zahl ein, die maximal 5 Zeichen lang ist."))
    alert("Passed");
}
function checkField5(form) {
  if (goodIntLen(8, form.fnumLieferschein, "Bitte geben Sie im Feld Lieferschein eine Zahl ein, die maximal 8 Zeichen lang ist."))
    alert("Passed");
}
function checkField2(form) {
  if (goodChar(form.fnumTauschgutcode, "Bitte geben Sie im Feld Tauschgutcode einen Text ein, der maximal 5 Zeichen lang ist."))
    alert("Passed");
}
function checkField4(form) {
  if (goodInt(form.fnumAusgang, "Bitte geben Sie im Feld Ausgang eine Zahl ein."))
    alert("Passed");
}
function checkField4(form) {
  if (goodInt(form.fnumEingang, "Bitte geben Sie im Feld Eingang eine Zahl ein."))
    alert("Passed");
}