//---------------------------------------------------
//
//  MidiShop
//
//  Überprüfungen
//
//---------------------------------------------------



//---------------------------------------------------
//
//  Allgemein
//
//---------------------------------------------------

var isValidationLoaded = false;

//---- Nachricht (AlertBox) ----
function showMessage(message) {
  alert(message);
  gField.focus();
  gField.select();
  return false;
}

//---- Eingabe ist nicht leer? ----
function isEmpty(inputVal) {
  inputStr = inputVal.toString()
  if ((inputStr == null) || (inputStr == "") || (inputStr.length == 0)) {
    return false
  }
  return true
}

//---- Numerische Eingabe ist positiv 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
}

//---- Numerische Eingabe ist positiv oder negativ 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
}

//---- Numerische Eingabe ist positv oder negativ Zahl? ----
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
}



//---------------------------------------------------
//
//  Überprüfungen
//
//---------------------------------------------------

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

//---- Überprüfung: E-Mail ----
function isValidEmail() {
  var email = gField.value;
  if (email == null || email == "") return showMessage("Das Feld E-Mail muß ausgefüllt werden!")
  else {
    var atPos = email.indexOf('@');
    if (atPos < 0) return showMessage("Ungültige E-Mail Adresse!");
    else {
      var username = email.substring(0,atPos).toLowerCase();
      var hostname = email.substring(atPos+1,email.length).toLowerCase();
      if (!validMailString(username) || !validMailString(hostname)) return showMessage("Ungültige E-Mail Adresse!")
      else {
        if (hostname.indexOf('.') < 0) return showMessage("Ungültige E-Mail Adresse!");
        else 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;
}

//---- Überprüfung: Kreditkarte ----
function isValidCC() {
  var ccnum = returnOnlyNumbers(gForm.ccnr.value);
  if (ccnum.length < 13) return showMessage("Bitte überprüfen Sie Ihre Kreditkartennummer!");
  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;
}

//---- Überprüfung: Gültigkeit Kreditkarte ----
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("Bitte geben Sie das Ablaufdatum Ihrer Kreditkarte im Format mmyyyy ein!");
  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);
  }
  // Gültige Monatseingabe
  if (expmonth<1 || expmonth>12) return showMessage("Ungültige Monatsangabe!");
    expmonth++; expmonth--;
    expyear++; expyear--;
  // Konvertiere Jahr in 4-Zahlen-Format
  if (ccexp.length==3 || ccexp.length==4) {
    if (expyear > 90) {
      expyear=expyear+1900;
    } else {
      expyear=expyear+2000;
    }
  }
  // Hole aktuelles Datum
  timeisit=new Date();
  realmonth=timeisit.getMonth();
  realmonth++;
  realyear=timeisit.getYear();
  if (realyear<2000) realyear=realyear+1900;
  // Vergleiche Gültigkeitsdaum mit aktuellem
  if (expyear==realyear) {
    if (expmonth<realmonth) return showMessage("Ihre Kreditkarte ist abgelaufen!");
  }
  if (expyear<realyear) return showMessage("Ihre Kreditkarte ist abgelaufen!");
  // Konvertierung in Strings
  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;
}

//---- Überprüfung Bankleitzahl ----
function isValidBLZ() {
  var inputStr = gField.value
  if (isPosInteger(inputStr)) {
    if (inputStr.length == 5) return true;
  }
  return showMessage("Bitte 5 Ziffern eingeben!");
}
function isValidKTO() {
  var inputStr = gField.value
  if (isPosInteger(inputStr)) {
    if (inputStr.length == 13) return true;
  }
  return showMessage("Bitte 13 Ziffern eingeben!");
}

//---- Überprüfung Datum ----
function isDateFormat() {
  var inputStr = gField.value
  var delim1 = inputStr.indexOf(".")
  var delim2 = inputStr.lastIndexOf(".")
  if (delim1 != -1 && delim1 == delim2) {
    // Nur 1 Delimiter in 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) {
    // Es gibt Delimiter, extrahiere Komponentenwerte
    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 {
    // Es gibt keine Delimiter, extrahiere Komponentenwerte
    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)) {
    // Es gibt ein nicht-numerisches Zeichen in einer der Komponentenwerte
    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) {
    // Monatswert ist nicht zwischen 1 und 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) {
    // Tageswert ist nicht zwischen 1 und 31
    alert("Ungültige Tagesangabe!\n\nBitte geben Sie einen Wert zwischen 01 und maximal 31 ein.")
    gField.focus()
    gField.select()
    return false
  }
  // Überprüfung Jahr
  if (yyyy < 100) {
    // Eingabewert ist mit 2 Zahlen, zulässig für 1930-2029
    if (yyyy >= 30) {
      yyyy += 1900
    } else {
      yyyy += 2000
    }
  } else {
    var today = new Date()
    // Standard-Jahr (nun gesetzt auf (aktuelles Jahr - 100) und (akt. Jahr + 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
}

//---- Überprüfung Monatslänge ----
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
}
//---- Überprüfung Monatslänge für Feber ----
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
}



//---------------------------------------------------
//
//  Dispatch Mechanismus
//
//---------------------------------------------------

// Dispatcher
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["isValidKTO"] = new dispatcher(isValidKTO);
dispatchLookup["isDateFormat"] = new dispatcher(isDateFormat);

// Hauptübperüfung (Funktion wird von FormularEventHandlers gerufen)
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;
}



//---------------------------------------------------
//
//  Abschluss
//
//---------------------------------------------------
isValidationLoaded = true;

