/*
-------------------------------------------------------
formcheck.js

created by r. eberle
modified by Xenia Diaz Orejarena

DO NOT CHANGE THIS FILE - CONFIG IN formcheck_config.js
-------------------------------------------------------
*/


var felem = new Array();
var inc = 1;
var thisErr = "";

/*
stripWhitespace(str)
--------------------
entfernt whitespace aus der uebergebenen zeichenkette und gibt eine neue
zeichenkette zurueck, oder dieselbe falls kein whitespace gefunden
*/
function stripWhitespace(str) {
  var strippedStr = "";
  var i = 0;
  var len = str.length;
  while (i < len) {
    var c = str.charAt(i);
    if (!charIsWhitespace(c)) strippedStr += c;
    i++;
  } 
  return strippedStr;
}
  
/*
charIsWhitespace(c)
-------------------
gibt TRUE zurueck falls das uebergebene zeichen ein whitespace ist, sonst FALSE
*/
function charIsWhitespace(c) {
  //rom: momentan nur space als whitespace definiert:
  if (c == " ") return true; 
  return false;
}

/*
-----------------------------------------------------------------------
   BEGIN formcheck
-----------------------------------------------------------------------
*/
function fc_felem_make(c1, c2) {
  tmp_name = farr[c1]
  c1++;
  felem = new Array();
  while (farr[c1] != "END") {
    felem[c2] = new fc_elem();
    felem[c2].form = tmp_name;
    felem[c2].name = farr[c1];
    c1++;
    felem[c2].type = farr[c1];
    c1++;
    felem[c2].visname = farr[c1];
    c1++;
    c2++;
  }
  if (farr[c1 + 1]) fc_felem_make(farr[c1 + 1], c2);
  else {
    return;
  }
} // function fc_felem_make

var thisErrstr = new Array();
function buildArray( err ) {
  //var newElem = new Array();
  //newElem = thisErrstr.push(err);
  thisErrstr[ thisErrstr.length ] = err;
  newElem = thisErrstr.length;
  thisErr = thisErrstr.join("");
  return (thisErr == "");
}
function formcheck() {
  thisErrstr = new Array();

  // vb: 040820: if !fc_config tut auch sagen: fc_config is not defined:
  //if (!fc_config) { alert("missing config!"); return false; }
  if (typeof( fc_config ) == "undefined") {
    if (document.location.href.indexOf( "databox" ) != -1 ) {
      alert( 'Programmierfehler!!! fc_config vergessen?' );
    }
    return true;
  }

  //var thisErrstr = new Array();
  //fc_init();
  fc_felem_make(0, 0);
  var errstr = "";
  var match = false; 
  for (j = 0; felem[j]; j++) {

    //alert("checking: " + felem[j].name + " -- type: " + felem[j].type + " --- formname: " + felem[j].form );
    if (document.forms[felem[j].form]) {
      var thisForm = document.forms[felem[j].form];
      k = 0;
      //ATTENTION: radios are just numbered elements in form.elements, so we cannot use element["..."]
      while (thisForm.elements[k]) {
        if (thisForm.elements[k].name == felem[j].name) {
          f = document.getElementById( felem[j].name ); 
          f_formfields = document.forms[ felem[j].form ].elements[ felem[j].name ];
          if (f == null) {
            if (document.location.href.indexOf( "databox" ) != -1 ) {
              alert( 'Programmierfehler!!! <span id="' + felem[j].name + '"> vergessen?' );
            }
            /* vb: 040505: charity for missing span: proceed & trust the php-check: */
            k++;
            break;
          }
          errstr = fc_elem_check(felem[j], k);
          errormsg = felem[j].visname;
          // vb: 040720: gefaellt mir gar nicht, sollte aber tun:
          //if (errstr == f.id) {
          if ((errstr != '') && (errstr == f.id || errstr == f.name)) {
            match=true;
            //alert( "ich mach jetzt " + f.name + " rot!" );
            f.style.color =  "#CC0000"
            f.style.fontWeight = "bold";
            //alert( "ich mach jetzt " + f_formfields.name + " rot!" );
            if (f_formfields.style) f_formfields.style.backgroundColor =  "#FFDAD9";
            if (div('errormessage')) {
              // vb: 040310: nachdem ich der erste bin, ders braucht, isses schon rot & ich displays halt:
              //document.getElementById('errormessage').style.color =  "#CC0000";
              if (errormsg =='')errormsg='Bitte &uuml;berpr&uuml;fen Sie Ihre Angaben.';
              divWrite( "errormessage", errormsg + "<br />&nbsp;<br />" );
              divDisplay( "errormessage" );
              window.scrollTo( 0, 0 );
            //} else {
              //f_formfields.style.backgroundColor =  "#ffffff";
            }
          } else {
            f.style.color =  "#000";
            f.style.fontWeight = "normal";
            if (f_formfields.style) f_formfields.style.background =  "#FFFFFF";
            if (div('errormessage') && match != true ) {
              divWrite( "errormessage", "" );
              divDisplayHide( "errormessage" );
            }
          }
          err = new Array(errstr);
          buildArray( err );
        }
        k += inc; /* we might need to skip something (radio) ... */
        inc = 1;  /* but then restore default increase-value.    */
      }  // while
    }  // if
  }  // for
  
  /* the good news: nothing found */
  if (buildArray()) return true;

  /* the bad news: something found */
  return false;
}



/*
--------------------
checking dispatchers
--------------------
*/

function fc_elem_check(elem, os) {
  var ok = false;
  if (elem.type == "STD") {
    ok = fc_elem_check_std(elem, os);
  }
  if (elem.type == "MAIL") ok = fc_elem_check_mail(elem, os);
  if (elem.type == "PWD") ok = fc_elem_check_pwd(elem, os);
  if (!ok) return elem.name;
  else return "";
  }

function fc_elem_check_std(elem, os) {
  var ok = false;
  str = "srctype = document." + elem.form + "." + elem.name + ".type";
  eval(str);
  /* checking for different types ... */
  if (srctype == "hidden" || srctype == "text" || srctype == "textarea") ok = fc_check_text(elem);
  else if (srctype == "select-one" || srctype == "select-multiple") ok = fc_check_select(elem);

  /* hmm, radio doesn't seem to have a type ... */
  else if (!srctype) ok = fc_check_radio(elem, os); 
    
  /* xul: necessity to check checkboxes too*/
  else if (srctype == "checkbox") ok = fc_check_checkbox(elem, os); 
  return ok;
  }
  
function fc_elem_check_mail(elem, os) {
  str = "srctype = document." + elem.form + "." + elem.name + ".type";
  eval(str);
  str = "srcelem = document." + elem.form + "." + elem.name;
  eval(str);
  /* if not a typical type just say ok, skip it */
  if (!(srctype == "hidden" || srctype == "text" || srctype == "textarea" || srctype =="checkbox" )) return true;
  /* do basic-checking */
  var ok = fc_check_text(elem);
  /* if basic-checking ok dig deeper ... */
  if (ok) {
    /* @ should be in there */
    if (srcelem.value.indexOf("@") == -1) ok = false;
    else {
      str = srcelem.value.split("@");
      /* only one @ allowed: */
      if (str.length > 2) ok = false;
      /* before @ there should be at least on char */
      if (str[0].length < 1) ok = false;
      /* after @ a dot should be found */
      if (str[1].indexOf(".") == -1) ok = false;
      }
    }
  return ok;
  }

/*
----------------
checking modules
----------------
*/

function fc_check_select(elem) {
  //alert("fc_check_select()");
  var ok = false;
  str = "srcelem = document." + elem.form + "." + elem.name;
  eval(str);
  /* needs a 'var' to make it local! */
  var i = 0;
  while (srcelem.options[i]) {
    if (srcelem.options[i].selected == true && srcelem.options[i].value != "") ok = true;
    i++;
    }
  return ok;
  }

/* x.d.o.: necessity to check checkboxes too */
function fc_check_checkbox(elem) {
  var ok = false;
  str = "srcelem = document." + elem.form + "." + elem.name;
  eval(str);
  if (srcelem.checked != true ) return false;
    else return true;
  }  
  
function fc_check_text(elem) {
  //alert("fc_check_text()");
  str = "srcelem = document." + elem.form + "." + elem.name;
  eval(str);
  //rom: neu - stripWhitespace() aus "string.js"
  if (srcelem.value == "" || stripWhitespace(srcelem.value) == "") return false;
  else return true; 
}

function fc_check_radio(elem, os) {
  //alert("fc_check_radio - os: " + os);
  var ok = false;
  inc = 0;
  str = "srcform = document." + elem.form;
  eval(str);
  while (srcform.elements[os] && (srcform.elements[os].name == elem.name)) {
    if (srcform.elements[os].checked) ok = true;
    os++;
    inc++;
  }
  return ok;
}

/*
-------
objects
-------
*/

function fc_elem(a, b, c) {
  this.form = a;
  this.name = b;
  this.type = c;
  return this;
}

function fc_elem_check_pwd(elem, os) {
  var ok = false;
  str = "srctype = document." + elem.form + "." + elem.name + ".type";
  eval(str);
  strv = "srcelem = document." + elem.form + "." + elem.name;
  eval(strv);
  if (srctype == "password")
  if (srcelem.value!="") ok = true;
  return ok;
}
