/**
 * Prüft, ob alle Pflichtfelder gefüllt worden sind
 *
 * @author sweber
 */
function doValidateForm(form_id) {

  var validate = document.getElementById('validate_'+form_id).value;
  validate     = validate.split(',');

  var count          = 0;
  var missing        = false;

  for (count; count < validate.length; count++) {

    var active    = (count % 2 == 0) ? '_active' : '';
    var field     = validate[count].split('|');
    var field_id  = field[0];
    var type      = field[1];
    var mandatory = field[2];

    var element      = document.getElementById(field_id);
    var info_element = getFormValidateOutputField(field_id);

    if(element.type == 'selectOne') {

      var value = element.options[element.options.selectedIndex].value;
    } else {

      var value = element.value;
    }

    /*
   * Prüfen, ob das Feld Mandatory ist
   */
    if(mandatory == 'true') {

      if(value != '') {

        if(checkValid(value, type)) {

          /*
           * Das Hinweisfeld mit einem Fehlertext versehen
           */
          missing = true;
          fillFormValidateOutputfield(info_element, false, getErrorMsgForType(type));
        } else {

         /*
          * Das Hinweisfeld positiv schalten
          */
          fillFormValidateOutputfield(info_element, true, '');
        }
      } else {

        missing = true;
        fillFormValidateOutputfield(info_element, false, getErrorMsgForType('mandatory'));
      }
    } else {

      /*
       * Das Hinweisfeld positiv schalten, wenn der Wert okay ist
       */
      if(value != '') {

        if(checkValid(value, type)) {

           missing = true;
          fillFormValidateOutputfield(info_element, false, getErrorMsgForType(type));
        } else {

          fillFormValidateOutputfield(info_element, true, '');
        }
      } else {

        fillFormValidateOutputfield(info_element, true, '');
      }
    }
  }

  /*
   * Hochscrollen
   */
  if(missing) {

    new Effect.ScrollTo($('main_error_holder'));
  }

  return missing;
}



/**
 * Pr�ft, ob der Inhalt eines Feldes plausibel ist
 *
 * @author sweber
 */
function checkValid(wert, type) {

  var error  = false;

  switch(type) {

    case 'radio':

      if(input.checked == 0) {

        error = true;
      }
      break;

    case 'text':

      if(wert.length == 0) {
        error = true;

      }

      break;

    case 'postleitzahl':
      // PLZ sind idR 5 Ziffern
      if(wert.length != 5) {
        error = true;

      }

      var Allowed = '0123456789';
      var Pos = 0;

      for (Pos; Pos < wert.length; Pos++) {
        if (Allowed.indexOf(wert.charAt(Pos)) == -1){

          error = true;

        }
      }

      break;

    case 'zahl':

      var Allowed = '0123456789';
      var Pos = 0;

      for (Pos; Pos < wert.length; Pos++) {
        if (Allowed.indexOf(wert.charAt(Pos)) == -1){

          error = true;

        }
      }

      break;

    case "url":

        var a = false;
        var res = false;
        // testen, ob regexp korrekt unterstuetzt werden
        if(typeof(RegExp) == 'function') {

          var b = new RegExp('abc');

          if(b.test('abc') == true){

            a = true;
          }
        }

        if(wert.length){

          if(a == true) {

            reg = new RegExp ("^(https?://)?(([\\w!~*'().&=+$%-]+: )?[\\w!~*'().&=+$%-]+@)?(([0-9]{1,3}\\.){3}[0-9]{1,3}|([\\w!~*'()-]+\\.)*([\\w^-][\\w-]{0,61})?[\\w]\\.[a-z]{2,6})(:[0-9]{1,4})?((/*)|(/+[\\w!~*'().;?:@&=+$,%#-]+)+/*)$");

            res = (reg.test(wert));

           }
           error = !res;
        }


      break;

    case 'email':

      var a = false;
      var res = false;
      // testen, ob regexp korrekt unterstützt werden
      if(typeof(RegExp) == 'function') {
        var b = new RegExp('abc');
        if(b.test('abc') == true){
          a = true;

        }
      }

      if(wert.length){
        if(a == true) {
          reg = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)'+
                           '(\\@)([a-zA-Z0-9\\-\\.]+)'+
                           '(\\.)([a-zA-Z]{2,4})$');
          res = (reg.test(wert));

        } else {
          res = (wert.search('@') >= 1 &&
                 wert.lastIndexOf('.') > wert.search('@') &&
                 wert.lastIndexOf('.') >= wert.length-5);

         }
         error = !res;
       }

       break;

    case 'telefon':

      // Es dürfen nur die folgenden Zeichen verwendet werden
      var Allowed = '0123456789 /-+()';
      var Pos = 0;

      for (Pos; Pos < wert.length; Pos++) {
        if (Allowed.indexOf(wert.charAt(Pos)) == -1){

          error = true;

        }
      }
      break;

    case 'uhrzeit':

      // Wir erwarten HH:MM
      var Allowed = '0123456789';

      if(Allowed.indexOf(wert.charAt(0)) == -1) { error = true; }
      if(Allowed.indexOf(wert.charAt(1)) == -1) { error = true; }
      if(wert.charAt(2) != ':')                 { error = true; }
      if(Allowed.indexOf(wert.charAt(3)) == -1) { error = true; }
      if(Allowed.indexOf(wert.charAt(4)) == -1) { error = true; }
      break;

    case 'ganzzahl':

      if (parseInt(wert) != wert || wert == ''){

        error = true;
      }
      break;

    case 'kommazahl':

      if(wert == '') {

        error = true;
      } else {

        if(wert.indexOf('.') != -1 || wert.indexOf(',') != -1) {
          if(wert.indexOf('.') != -1) {

            if (parseFloat(wert) != wert){

              error = true;
            }
          }

          if(wert.indexOf(',') != -1) {

            wert = wert.replace(/,/g, '.');

            if (parseFloat(wert) != wert){

              error = true;
            }
          }
        } else {

          if(parseInt(wert) != wert) {

            error = true;
          }
        }
      }

      break;

    case 'date':

      var monat = wert.split(".")[1];
      var tag   = wert.split(".")[0];
      var jahr  = wert.split(".")[2];

      var datum = new Date(jahr, monat-1, tag);

      if ( (datum.getMonth() + 1 != monat) ||
            (datum.getDate() != tag) ||
            (datum.getFullYear() != jahr)) {

        error = true;
      }

      break;

    case 'textarea':

      if(wert.length == 0) {
        error = true;

      }

      break;


  }

  return error;
}


/**
 * Gibt eine Fehlermeldung zu einem Typen zurück
 *
 * @author sweber
 */
function getErrorMsgForType(type) {

  return_val = '';

  switch(type) {

    case 'ganzzahl':

       return_val = 'Bitte geben Sie eine Zahl ein!';
    break;

    case 'zahl':

      return_val = 'Bitte geben Sie eine Zahl ein!';
    break;

    case 'kommazahl':

       return_val = 'Bitte geben Sie eine Kommazahl ein!';
    break;

    case 'uhrzeit':

       return_val = 'Uhrzeit im Format HH:MM erwartet!';
    break;

    case 'postleitzahl':

      return_val = 'Bitte geben Sie eine Postleitzahl ein!';
    break;

    case 'telefon':

      return_val = 'Bitte geben Sie eine Telefonnummer ein!';
    break;

    case 'url':
    case 'email':

      return_val = 'Bitte geben Sie eine gültige Adresse ein!';
    break;

    case 'mandatory':

       return_val = 'Sie müssen dieses Feld füllen!';
    break;

    case 'date':

       return_val = 'Datum im Format 02.12.2008 erwartet!';
    break;

    case 'captcha':

      return_val = 'Das Ergebnis Ihrer Berechnung ist leider falsch!';
    break;

    case 'email_exists':

      return_val = 'Es existiert bereits ein Benutzer mit dieser E-Mail Adresse!';
    break;

    case 'email_delete_select':

      return_val = 'Bitte wählen Sie mindestens eine Nachricht aus die Sie löschen möchten!';
    break;

    case 'emails_not_same':

      return_val = 'Die Bestätigungsemail-Adresse stimmt nicht mit der E-Mail-Adresse überein!';
    break;

    case 'passwords_not_same':

      return_val = 'Das Bestätigungspasswort stimmt nicht mit dem Passwort überein!';
    break;

    case 'password_too_short':

      return_val = 'Ihr Passwort muss mindestens 8 Zeichen lang sein!';
    break;

    case 'gender':

      return_val = 'Bitte wählen Sie eine Anrede!';
    break;

    case 'agb':

      return_val = 'Sie müssen unsere AGBs akzeptieren!';
    break;

    case 'inserententyp':

      return_val = 'Bitte wählen Sie einen Inserenten-Typ!';
    break;

    case 'stellenbeschreibung':

      return_val = 'Ihre Stellenbeschreibung ist zu kurz!';
    break;

    case 'personaldienstleister':

      return_val = 'Bitte wählen Sie einer der Dienstleisteroptionen: Headhunter/Direct Search, Vermittler, Zeitarbeit/Personalleasing';
    break;

    case 'contact':

      return_val = 'Bitte geben Sie eine Kontaktperson an';
    break;
    
    case 'min_100_chars':

      return_val = 'Bitte geben Sie mindestens 100 Zeichen ein';
    break;
  }

  return return_val;
}

/**
 * Bezieht das DOM-Objekt, in dem eine Formfeld Fehler / Erfolgsmeldung erscheinen soll
 *
 * @author sweber
 */
function getFormValidateOutputField(element_id) {

  var validation_element = $('validation_error');
  validation_error_holder = validation_element.getElementsByTagName('UL');

  /*
   * Ist eine UL vorhanden? Wir können aus XHTML-Gründen keine leeren ULs stehen haben.
   * Deswegen leeren wir immer das komplette Div und erstellen die ul mit ihren Inhalten im Zweifel neu
   */
  if(!validation_error_holder[0]) {

    var ul_error_holder = document.createElement('ul');
    ul_error_holder.id  = 'validation_error_ul';
    ul_error_holder.setAttribute('id', 'validation_error_ul');

    validation_element.appendChild(ul_error_holder);
  }

  var ul_element  = $('validation_error_ul');
  var ul_elements = ul_element.getElementsByTagName('LI');

  if(ul_elements.length) {

    for(var i = 0; i < ul_elements.length; i++) {

      if(ul_elements[i].id == 'error_'+element_id) {

        return ul_elements[i];
      }
    }

    /*
     * Kein passender Eintrag in der Liste, also einen neuen erstellen
     */
    var new_error_info_element = document.createElement('li');
    new_error_info_element.id  = 'error_'+element_id;
    new_error_info_element.setAttribute('id', 'error_'+element_id);

    ul_element.appendChild(new_error_info_element);

    return $('error_'+element_id);
  } else {

    /*
     * Kein Eintrag in der Liste, also einen neuen erstellen
     */
    var new_error_info_element = document.createElement('li');
    new_error_info_element.id  = 'error_'+element_id;
    new_error_info_element.setAttribute('id', 'error_'+element_id);

    ul_element.appendChild(new_error_info_element);

    return $('error_'+element_id);
  }

  return false;
}

/**
 * befüllt ein Form valiedierungsfeld mit einer entsprechenden Meldung und icon
 *
 * @author sweber
 */
function fillFormValidateOutputfield(field, valid, message) {

  if(!valid) {

    field.style.display = 'none';
    field.innerHTML     = getErrorFieldPrefix(field.id)+' '+message;
    field.className     = 'error';
    field.style.display = 'block';
  } else {

    $('validation_error_ul').removeChild(field);
  }
}

/**
 * Bezieht den Text des Labels zu einem Errorfeld
 *
 * @author sweber
 */
function getErrorFieldPrefix(error_field_id) {

  var label_id = error_field_id.replace(/error_/, "l");
  var label    = $(label_id);

  if(label) {

    var text = label.innerHTML;

    /*
     * Sterne rauswerfen
     */
    if(text.indexOf('*') > 0) {

      text = text.substring(0, text.indexOf('*'));
    }
    return text;
  }
  return '';
}

/**
 * Blendet die Fehlerhinweisbox ein oder aus
 *
 * @author sweber
 */
function openCloseErrorBox(new_state) {

  var main_error_holder = $('main_error_holder');

  if(new_state == 'open') {

    Effect.Appear('main_error_holder');
  } else {

    main_error_holder.style.display = 'none';
  }
}
