<!-- Headshop Versand -->
var isValidationLoaded = false;

function showMessage(message) {
  alert(message);
  gField.focus();
  gField.select();
  return false;
}

// general purpose function to see if an input value has been
// entered at all
//
function isEmpty(inputVal) {
  inputStr = inputVal.toString()
  if ((inputStr == null) || (inputStr == "") || (inputStr.length == 0)) {
    return false
  }
  return true
}

// general purpose function to see if a suspected numeric input
// is a positive integer
//
function isPosInteger(inputVal) {
  inputStr = inputVal.toString()
  for (var i = 0; i < inputStr.length; i++) {
    var oneChar = inputStr.charAt(i)
    if (oneChar < "0" || oneChar > "9") {
      return false
    }
  }
  return true
}

// general purpose function to see if a suspected numeric input
// is a positive or negative integer
//
function isInteger(inputVal) {
  inputStr = inputVal.toString()
  for (var i = 0; i < inputStr.length; i++) {
    var oneChar = inputStr.charAt(i)
    if (i == 0 && oneChar == "-") {
      continue
    }
    if (oneChar < "0" || oneChar > "9") {
      return false
    }
  }
  return true
}

// general purpose function to see if a suspected numeric input
// is a positive or negative number
//
function isNumber(inputVal) {
  oneDecimal = false
  inputStr = inputVal.toString()
  for (var i = 0; i < inputStr.length; i++) {
    var oneChar = inputStr.charAt(i)
    if (i == 0 && oneChar == "-") {
      continue
    }
    if (oneChar == "." && !oneDecimal) {
      oneDecimal = true
      continue
    }
    if (oneChar < "0" || oneChar > "9") {
      return false
    }
  }
  return true
}

//
// isNotEmpty
//
function isNotEmpty() {
  var inputStr = gField.value.toString();
  if (inputStr != "" && inputStr.length > 0) return true;
  return showMessage("Das Feld '" + gFieldName + "' muß ausgefüllt werden!");
}

//
// E-Mail validation
//
function isValidEmail() {
  var email = gField.value;
  if (email == null || email == "") return true;
  var atPos = email.indexOf('@');
  if (atPos < 0) return showMessage("E-Mail-Adresse ist notwendig! \n Sie müssen eine Email Adresse UND bei NN auch ihre Telefonnummer angeben. \n Bei Zahlungsart Überweisung genügt die Email Adresse ( Tel. ist dann nicht notwendig ).\n Sie bekommen per email die Kontoverbindung übermittelt \n Datenschutz ist garantiert!  Gaia Trading gibt keinerlei Daten weiter, \n wir melden uns bei Problemen am Telefon immer nur privat, und sprechen NUR mit ihnen pers. über Details !");
  var username = email.substring(0,atPos).toLowerCase();
  var hostname = email.substring(atPos+1,email.length).toLowerCase();
  if (!validMailString(username)) return showMessage("E-Mail-Adresse ist notwendig! \n Sie müssen eine Email Adresse UND bei NN auch ihre Telefonnummer angeben. \n Bei Zahlungsart Überweisung genügt die Email Adresse ( Tel. ist dann nicht notwendig ).\n Sie bekommen per email die Kontoverbindung übermittelt \n Datenschutz ist garantiert !  Gaia Trading gibt keinerlei Daten weiter, \n wir melden uns bei Problemen am Telefon immer nur privat, und sprechen NUR mit ihnen pers. über Details !");
  if (!validMailString(hostname)) return showMessage("E-Mail-Adresse ist notwendig! \n Sie müssen eine Email Adresse UND bei NN auch ihre Telefonnummer angeben. \n Bei Zahlungsart Überweisung genügt die Email Adresse ( Tel. ist dann nicht notwendig ).\n Sie bekommen per email die Kontoverbindung übermittelt \n Datenschutz ist garantiert !  Gaia Trading gibt keinerlei Daten weiter, \n wir melden uns bei Problemen am Telefon immer nur privat, und sprechen NUR mit ihnen pers. über Details !");
  if (hostname.indexOf('.') < 0) return showMessage("E-Mail-Adresse ist notwendig! \n Sie müssen eine Email Adresse UND bei NN auch ihre Telefonnummer angeben. \n Bei Zahlungsart Überweisung genügt die Email Adresse ( Tel. ist dann nicht notwendig ).\n Sie bekommen per email die Kontoverbindung übermittelt \n Datenschutz ist garantiert !  Gaia Trading gibt keinerlei Daten weiter, \n wir melden uns bei Problemen am Telefon immer nur privat, und sprechen NUR mit ihnen pers. über Details !");
  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;
}

//
// credit card validation
//
function isValidCC() {
  var ccnum = returnOnlyNumbers(gForm.ccnr.value);
  if (ccnum.length < 13) return showMessage("Dieses Feld bitte korrekt ausfüllen!");
  var cc = gForm.cc.options[gForm.cc.selectedIndex].value.toUpperCase();
  if (ccnum.length!=16 && cc=="DISCOVER") return showMessage("DISCOVER-Kreditkartennummern müssen 16stellig sein!");
  if (ccnum.length!=16 && cc=="EUROCARD") return showMessage("EUROCARD-Kreditkartennummern müssen 16stellig sein!");
  if (ccnum.length!=16 && cc=="MASTERCARD") return showMessage("MASTERCARD-Kreditkartennummern müssen 16stellig sein!");
  if (ccnum.length!=15 && cc=="AMERICAN EXPRESS") return showMessage("AMERICAN EXPRESS-Kreditkartennummern müssen 15stellig sein!");
  if (ccnum.length!=13 && ccnum.length!=16 && cc=="VISA")  return showMessage("VISA-Kreditkartennummern müssen 13- oder 16stellig sein!");
  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("Die eingegebene Kreditkartennummer ist nicht korrekt!\n\nBitte überprüfen Sie Ihre Eingabe!");
  }
}

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("Dieses Feld bitte korrekt ausfüllen!");
        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;
}

//
// blz validation
//
function isValidBLZ() {
  var inputStr = gField.value
  if (isPosInteger(inputStr)) {
    if (inputStr.length == 8) return true;
  }
  return showMessage("Bitte 8 Ziffern eingeben!");
}

//
// date field validation
//
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
}


//
// Begin validation dispatching mechanism
//

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(frame, form, field, method, fielddesc) {
  gFrame = frame;
  gForm = form;
  gField = eval("window." + frame.name + ".document." + form.name + "." + field.name);
  gFieldName = fielddesc;
  var args = validate.arguments;
//  for (i = 3; i < args.length; i++) {
    if (!dispatchLookup[args[3]].doValidate()) {
      return false;
    }
//  }
  return true;
}

// *****************************************************
// the following codeline must be the last one !!!
// *****************************************************
isValidationLoaded = true;