function dispatcher(validationFunc) {

  this.doValidate = validationFunc;

}

var dispatchLookup = new Array()

dispatchLookup["isNotEmpty"] = new dispatcher(isNotEmpty);

dispatchLookup["isValidEmail"] = new dispatcher(isValidEmail);

dispatchLookup["isValidCC"] = new dispatcher(isValidCC);

dispatchLookup["isValidCCExpDate"] = new dispatcher(isValidCCExpDate);

dispatchLookup["isValidBLZ"] = new dispatcher(isValidBLZ);

dispatchLookup["isDateFormat"] = new dispatcher(isDateFormat);



// main validation function called by form event handlers

function validate(window, form, field, method, fielddesc) {

  gForm = form;

  gField = eval("window.document." + form.name + "." + field.name);

  gFieldName = fielddesc;

  var args = validate.arguments;

    if (!dispatchLookup[args[3]].doValidate(fielddesc)) {

      return false;

    }

  return true;

}

function isNotEmpty() {

  var inputStr = gField.value.toString();

  if (inputStr != "" && inputStr.length > 0) return true;

  return showMessage("Das Feld '" + gFieldName + "' muß ausgefüllt werden!");

}

//

// blz validation

//

function isValidBLZ() {

  if (gField.value.length==8) return true;

  return showMessage("Das Feld " + gFieldName + " muß 8-stellig sein!");

}

function isValidEmail() {

  var email = gField.value;

  if (email == null || email == "") return showMessage("Ungültige E-Mail-Adresse! ");

  var atPos = email.indexOf('@');

  if (atPos < 0) return showMessage("Ungültige E-Mail-Adresse!");

  var username = email.substring(0,atPos).toLowerCase();

  var hostname = email.substring(atPos+1,email.length).toLowerCase();

  if (hostname.indexOf('.') < 0) return showMessage("Ungültige E-Mail-Adresse!");

  return true; 

}



function validMailString(inputStr) {

  for (var i = 0; i < inputStr.length; i++) {

    var oneChar = inputStr.charAt(i);

    if (oneChar < "a" || oneChar > "z") {

      if (oneChar < "0" || oneChar > "9") {

        if (oneChar != ".") {

          if (oneChar != "_") {

            if (oneChar != "-") {

              return false;

            }

          }

        }

      }        

    }

  }

  return true;

}



function isValidCC(Karte) {

  var ccnum = returnOnlyNumbers(gForm.ccnr.value);

  var cc = Karte;

  if (ccnum.length < 13) return showMessage("Kartennummer bitte korrekt ausfüllen!");

  var ccnumArray = new Array;

	for (var i=0; i<ccnum.length; i++) {

    ccnumArray[i]=ccnum.charAt(i);

  }

  ccnumArray.reverse();

  for(i=1; i<ccnumArray.length; i+=2) {

      var digitTimesTwo = ccnumArray[i] * 2;

      if (digitTimesTwo > 9) {

        ccnumArray[i] = digitTimesTwo - 9;

      } else {

        ccnumArray[i] = digitTimesTwo;

      }

  }

  var validationNr = 0;

  //for (var i=0; i<ccnumArray.length; i++) {

  //  validationNr += parseInt(ccnumArray[i],10);

  //}

  //validationNr = validationNr % 10;

  if (validationNr == 0) {

    return true;

  } else {

    return showMessage("Kartennummer bitte korrekt ausfüllen!");

  }    

}



function returnOnlyNumbers(inputVal) {

  var inputStr = inputVal.toString();

  var outputStr = '';

  for (var i = 0; i < inputStr.length; i++) {

    var oneChar = inputStr.charAt(i);

    if (oneChar >= "0" && oneChar <= "9") {

      outputStr += oneChar;

    }

  }

  return outputStr;

}



function isValidCCExpDate() {

  var ccexp = '' + returnOnlyNumbers(gField.value);

	var expmonth = 0;

	var expyear = 0;

	var realmonth = 0;

	var realyear = 0;

	if (ccexp.length<3 || ccexp.length>6) return showMessage("Gültigkeitsdatum bitte korrekt eingeben!");

	if (ccexp.length==3) {

    expmonth=ccexp.substring(0,1);

    expyear=ccexp.substring(1,3);

	}

	if (ccexp.length==4) {

    if (ccexp.substring(0,1)=="0") {

			expmonth=ccexp.substring(1,2);

			expyear=ccexp.substring(2,4);

		} else {

			expmonth=ccexp.substring(0,2);

			expyear=ccexp.substring(2,4);

		}

  }

	if (ccexp.length==5) {

		expmonth=ccexp.substring(0,1);

		expyear=ccexp.substring(1,5);

	}

	if (ccexp.length==6) {

		expmonth=ccexp.substring(0,2);

		expyear=ccexp.substring(2,6);

	}

	// make sure month is a valid value

	if (expmonth<1 || expmonth>12) return showMessage("Ungültige Monatsangabe!");

    expmonth++; expmonth--;

    expyear++; expyear--;

  // convert years to a standard 4 digit format

	if (ccexp.length==3 || ccexp.length==4) {

    if (expyear > 90) {

      expyear=expyear+1900;

    } else {

      expyear=expyear+2000;

    }

  }    

	// check the date

	timeisit=new Date();

	realmonth=timeisit.getMonth();

	realmonth++;

	realyear=timeisit.getYear();

	if (realyear<2000) realyear=realyear+1900;

  // compare expiration values with current ones

  if (expyear==realyear) {

		if (expmonth<realmonth) return showMessage("Ihre Kreditkarte ist abgelaufen!");

	}

  if (expyear<realyear) return showMessage("Ihre Kreditkarte ist abgelaufen!");

  // make expmonth and expyear strings again so we can make a string

  //      to pass to a cgi to process authorization

  expmonth+=""; expyear+="";

  if (expmonth.length==1) expmonth="0"+expmonth;

  ccexp=expmonth.substring(0,expmonth.length);

  ccexp+=expyear.substring(0,4);

  gField.value = ccexp;

	return true;

}



function showMessage(message) {

  alert(message);

  // gField.focus();

  // gField.select();

  return false;

}

function isEmpty(inputVal) {

  inputStr = inputVal.toString()

  if ((inputStr == null) || (inputStr == "") || (inputStr.length == 0)) {

    return false

  }

  return true

}

function isDateFormat() {

  var inputStr = gField.value

  var delim1 = inputStr.indexOf(".")

  var delim2 = inputStr.lastIndexOf(".")

  if (delim1 != -1 && delim1 == delim2) {

    // there is only one delimiter in the string

    alert("Ihre Eingabe entspricht nicht dem angegebenen Format.\n\nBitte geben Sie Datumsangaben im folgenden Format ein: TT.MM.JJJJ")

    gField.focus()

    gField.select()

    return false

  }

  if (delim1 != -1) {

    // there are delimiters; extract component values

    var dd = parseInt(inputStr.substring(0,delim1),10)

    var mm = parseInt(inputStr.substring(delim1 + 1,delim2),10)

    var yyyy = parseInt(inputStr.substring(delim2 + 1,inputStr.length),10)

  } else {

    // there are no delimiters; extract component values

    var dd = parseInt(inputStr.substring(0,2),10)

    var mm = parseInt(inputStr.substring(2,4),10)

    var yyyy = parseInt(inputStr.substring(4,inputStr.length),10)

  }

  if (isNaN(mm) || isNaN(dd) || isNaN(yyyy)) {

    // there is a non-numeric character in one of the component values

    alert("Ihre Eingabe entspricht nicht dem angegebenen Format.\n\nBitte geben Sie Datumsangaben im folgenden Format ein: TT.MM.JJJJ")

    gField.focus()

    gField.select()

    return false

  }

  if (mm < 1 || mm > 12) {

    // month value is not 1 thru 12

    alert("Ungültige Monatsangabe!\n\nBitte geben Sie einen Wert zwischen 01 (Januar) und 12 (Dezember) ein.")

    gField.focus()

    gField.select()

    return false

  }

  if (dd < 1 || dd > 31) {

    // date value is not 1 thru 31

    alert("Ungültige Tagesangabe!\n\nBitte geben Sie einen Wert zwischen 01 und maximal 31 ein.")

    gField.focus()

    gField.select()

    return false

  }

  // validate year, allowing for checks between year ranges

  // passed as parameters from other validation functions

  if (yyyy < 100) {

    // entered value is two digits, which we allow for 1930-2029

    if (yyyy >= 30) {

      yyyy += 1900

    } else {

      yyyy += 2000

    }

  } else {

    var today = new Date()

    // default year range (now set to (this year - 100) and (this year + 25))

    var thisYear = today.getYear()

    if (thisYear < 100) {

      thisYear += 1900

    }

    var minYear = thisYear - 100

    var maxYear = thisYear + 25

    if (yyyy < minYear || yyyy > maxYear) {

      alert("Ungültige Jahresangabe!\n\nBitte geben Sie einen Wert zwischen " + minYear + " und " + maxYear + " ein.")

      gField.focus()

      gField.select()

      return false

    }

  }

  if (!checkMonthLength(mm,dd)) {

    gField.focus()

    gField.select()

    return false

  }

  if (mm == 2) {

    if (!checkLeapMonth(mm,dd,yyyy)) {

      gField.focus()

      gField.select()

      return false

    }

  }

  gField.value = monthDayFormat(dd) + "." + monthDayFormat(mm) + "." + yyyy

  return true

}



function monthDayFormat(number) {

  var str = ""

  if (number < 10) {

    str = "0" + number.toString()

  } else {

    str = number.toString()

  }

  return str  

}



// check the entered month for too high a value

function checkMonthLength(mm,dd) {

  var months = new Array("","Januar","Februar","März","April","Mai","Juni",

                         "Juli","August","September","Oktober","November","Dezember")

  if ((mm == 4 || mm == 6 || mm == 9 || mm == 11) && dd > 30) {

    alert(months[mm] + " hat nur 30 Tage.")

    return false

  } else if (dd > 31) {

    alert(months[mm] + " hat nur 31 Tage.")

    return false

  }

  return true

}



// check the entered February date for too high a value

function checkLeapMonth(mm,dd,yyyy) {

  if (yyyy % 4 > 0 && dd > 28) {

    alert("Februar " + yyyy + " hat nur 28 Tage.")

    return false

  } else if (dd > 29) {

    alert("Februar " + yyyy + " hat nur 29 Tage.")

    return false

  }

  return true

}







