/* Allgemeine Funktionen:

check_date (field-object,end (true|false)); returns date obj. oder null
check_email(field-object); returns true wenn gut
check_form (form) rware Formular auf Plausibilität prüfen
date2str (date); returns dd.mm.yyyy
date2usstr (date); returns mm/dd/yyyy
handle_selected (form,cqnumdocs) Print-selected Dialog anzeigen
home() wie name sagt... - auf http://www.swissdox.ch
init_form(form,cqquery) Formular initialisieren (spez be cqquery=='FIRST')
popup (url,name,w,h); returns window obj.
popupt (url,name,w,h); returns window obj.
rename_but (form,text) alle Knöpfe auf form in Text umbenennen
reset_period (form); reset der beiden Datumseingabefelder form.ps und form.pe
reset_ss (form); reset der searchstyle Parameter
scroll_to_doc(form,cqdn) auf Dokument cqdn scrollen
sortieren(form) Beste 100 Dokumente sortieren
str2date (string); returns date obj.
suchen(form) Suchen
switch_template_param(f,templ) 
switch_template_save(f,templ) 
update_sel_checkboxes (form) Checkboxes nachführen in echten rware variablen
usstr2date (string); returns date obj.
wordlist(form) Wortlisten anzeigen

*/

//---------------------------------------------------------------------------
function home(){
  // auf homepage
//---------------------------------------------------------------------------
  var x;
  if (null!=self.opener) {
    // aufrufendes Fenster ist noch da
    if (null!=self.opener.top) {
      // scheint noch geframt zu sein
      self.opener.top.location.replace('/');
      self.opener.top.focus();
      self.close();
    }
    else {
      self.opener.location.replace('/');
      self.opener.focus();
      self.close();
    }
  }
  else {
    // kein noch vorhandenes opener window: sich selbst nehmen
    self.location.replace('/');
  }
}

//---------------------------------------------------------------------------
function init_form(f,cqquery){
  // rware-Datumsfeld Formate umsetzen und smd-format-Felder einsetzen
  // pe und ps setzen; wenn vorhanden: dadd setzen
  // cqquery: Wenn FIRST: Erstaufruf; default Periode einstellen
  // Wenn searchstyle dropdown vorhanden (ssdd) entsprechende cq-vars setzen
//---------------------------------------------------------------------------

  var rw,pe,ps,heute,d,cy,cm,cd,i,x;

  // QUERY_TYPE ab parameter restore
  if (null!=f['CQ_PARAM[QP_QUERY_TYPE]']){
    if (f['CQ_PARAM[QP_QUERY_TYPE]'].value >= 1 && f['CQ_PARAM[QP_QUERY_TYPE]'].value <= 3){
      f.CQ_QUERY_TYPE.value=f['CQ_PARAM[QP_QUERY_TYPE]'].value;
    }
  }

  // Datumsteil:
  ps=null; pe=null;
  heute=new Date(); 
  // current Jahr Monat Tag für weitere new Date() herstellen
  cy=heute.getFullYear(); cm=heute.getMonth(); cd=heute.getDate();
  heute=new Date(cy,cm,cd);

  // zunächst ps und pe als Date-objects setzen
  if ('FIRST'==cqquery) {
    // Erst-Aufruf: Default Periode 1 Jahr
    pe=new Date(cy,cm,cd);
    ps=new Date(cy,cm,cd);
    ps.setDate(cd-365);
  }
  else {
    // CQ_QUERY_STRING.DA_DATE untersuchen
    if (f['CQ_QUERY_STRING.DA_DATE'].value.match(/[^ ]/)){
      // rware Datumsfeld gesetzt; blanks enfernen
      f['CQ_QUERY_STRING.DA_DATE'].value=f['CQ_QUERY_STRING.DA_DATE'].value.replace(/ */g,'');
      // splitten in von, bis
      rw=f['CQ_QUERY_STRING.DA_DATE'].value.split('-');
      if (rw.length>=1){
        // dd.mm.yyyy
        ps=usstr2date(rw[0]);
      }
      if (rw.length>=2){
        // m,d,y
        pe=usstr2date(rw[1]);
      }
    }
  }
  // pe und ps sollten datums-objekte sein

  // Formular nachtragen
  // Datumseingabefelder:
  if (null!=ps){f.ps.value=date2str(ps)}
  if (null!=pe){f.pe.value=date2str(pe)}
  // dropdown dadd einstellen:
  // letzte beiden options: unbeschränkt oder options
  if (null!=f.dadd) {
    // wenn beide Datümer gesetzt: Könnte Eintrag in dadd (defper) sein
    if (pe==null && ps==null){
      // Keine Einschränkung
      f.dadd.selectedIndex=f.dadd.length-2;
    }
    else {
      // prophylaktisch auf options setzen
      f.dadd.selectedIndex=f.dadd.length-1;
      // vielleicht entsprechen Datümer einer Voreinstellung
      if (pe!=null && ps!=null){
        if (pe.valueOf()==heute.valueOf()) {
          // dann könnte Anfangsdatum eines der Voreinstellungen sein
          for (x=0; x<defper.length; x++) {
            d=new Date(cy,cm,cd);
            d.setDate(cd-defper[x]);
            if (d.valueOf()==ps.valueOf()) {
              f.dadd.selectedIndex=x;
              break;
            }
          }  
        }
      }
    }
  }
  // Einstellung searchstyle dropdown:
  if (null!=f.ssdd){
    // ssdd existiert:
    if (cqquery=='FIRST') {
      // defaulteinstellung normal
      i=1;
      f.CQ_MAX_DOCS.value=md[1];
      f.CQ_EXPANSION_LEVEL.value=el[1];
      f.CQ_MAX_WILDCARD.value=mw[1];
      f.CQ_MAX_FUZZY_SPELLING.value=mf[1];
    }
    else {
      // feststellen, ob Einzelparameter zufälligerweise Kombination in ssdd entsprechen
      for (i=0;i<3;i++) {
        if (f.CQ_MAX_DOCS.value==md[i]) {
          if (f.CQ_EXPANSION_LEVEL.value==el[i]) {
            if (f.CQ_MAX_WILDCARD.value==mw[i]) {
              if (f.CQ_MAX_FUZZY_SPELLING.value==mf[i]) {break}
            }
          }
        }
      }
    }
    f.ssdd.selectedIndex=i;
  }
}

//---------------------------------------------------------------------------
function check_form(f) {
  // Plaustests; rware variable ergänzen
  // ps und pe: Periode in yyyy-mm-dd
  // dadd: dropdown mit werten defper und als letzte 'options'
  // ssdd: searchstyle dropdown mit wertekombinationen
  // return true, wenn alles i.O.
//---------------------------------------------------------------------------
  var ps,pe,psy,pey,sl,l,a,x;

  // CQ_QUERY_STRING.DA_DATE / ps / pe / dadd / CQ_CUR_LIBRARY
  ps=null; pe=null;
  // wenn dropdown dadd vorhanden: Prüfen, ob eingestellt
  if (null!=f.dadd) {
    // defper=[7,31,365,1460,-1,-2]; // default-Einstellungen für Perioden-Dropdown
    // -1: Keine Einschränkung; -2: options (in ps bzw. pe eingestellte Werte nehmen)
    // dadd vorhanden; letzte beiden Elemente spezial
    if (f.dadd.selectedIndex==f.dadd.length-2){
      // Keine Einschränkung
    }
    else if (f.dadd.selectedIndex==f.dadd.length-1){
      // Periodenangaben aus smd-Datumsfeldern nehmen
      if (f.ps.value.match(/[^ ]/)){
        ps=check_date(f.ps,false);
        if (null==ps){return false;}
      }
      if (f.pe.value.match(/[^ ]/)){
        pe=check_date(f.pe,true);
        if (null==pe){return false;}
      }
    }
    else {
      // dadd ist auf echten Wert eingestellt
      pe=new Date;
      pe=new Date(pe.getFullYear(),pe.getMonth(),pe.getDate());
      ps=new Date(pe.getFullYear(),pe.getMonth(),pe.getDate());
      ps.setDate(pe.getDate()-defper[f.dadd.selectedIndex]);
    }
  }     	
  else {
    // dadd nicht vorhanden
    // Periodenangaben aus smd-Datumsfeldern nehmen
    if (f.ps.value.match(/[^ ]/)){
      ps=check_date(f.ps,false);
      if (null==ps){return false;}
    }
    if (f.pe.value.match(/[^ ]/)){
      pe=check_date(f.pe,true);
      if (null==pe){return false;}
    }
  }

  // negative Periode?
  if (null!=ps && null != pe) {if (ps>pe) {alert('End-Datum liegt vor Start-Datum');return false;}}

  // Einbauen in rware CQ_QUERY_STRING.DA_DATE
  if (null!=ps){psy=ps.getFullYear()}
  if (null!=pe){pey=pe.getFullYear()}
  if (pe!=null && ps!=null){f['CQ_QUERY_STRING.DA_DATE'].value=date2usstr(ps)+'-'+date2usstr(pe);}
  else if (pe!=null){f['CQ_QUERY_STRING.DA_DATE'].value=date2usstr(pe);psy=pey;}
  else if (ps!=null){f['CQ_QUERY_STRING.DA_DATE'].value=date2usstr(ps);pey=psy;}
  else {f['CQ_QUERY_STRING.DA_DATE'].value='';}

  // Formular Datümer nachtragen
  f.ps.value=date2str(ps);
  f.pe.value=date2str(pe);
  

  // CQ_CUR_LIBRARY
  sl='';
  if (pe==null && ps==null) {
    // Keine Einschränkung; alle libs, mit namen smd_yyyy_yyyy...
    for (l in libraries) {
      a=/^smd_([0-9]{4})_([0-9]{4})$/.exec(libraries[l]);
      if (a!=null) {
        if (''==sl) {sl=libraries[l]}
        else {sl=sl+" "+libraries[l]}
      }
    }
  }
  else {
    // Nur zuständige Libraries nehmen
    // Beide Daten müssen definiert sein:
    if (pe==null){pe=ps}
    if (ps==null){ps=pe}
    for (l in libraries) {
      a=/^smd_([0-9]{4})_([0-9]{4})$/.exec(libraries[l]);
      if (a!=null) {
        if (a[1]>=psy&&a[1]<=pey||a[2]>=psy&&a[2]<=pey||a[1]<psy&&a[2]>pey){
          if (''==sl) {sl=libraries[l]}
          else {sl=sl+" "+libraries[l]}
        }
      }
    }
  }
  f.CQ_CUR_LIBRARY.value=sl;
  
  // Sort-parameters abhängig vom Suchtyp
  // 8-ung: type des formelements text oder select-one
  if (f.CQ_QUERY_TYPE.type!='select-one') {x=f.CQ_QUERY_TYPE.value==1;}
  else {x=f.CQ_QUERY_TYPE.options[f.CQ_QUERY_TYPE.selectedIndex].value==1;}
  if(x){
    // boolean search; nach datum/quelle sortieren
    set_sort_parms(f,'field');
  }
  else {
    // nach relevance sortieren
    set_sort_parms(f,'relevanz');
  }

  // Suchstil dropdown ssdd:
  if (null!=f.ssdd) {
    // ssdd existiert
    // globale var: md (maxdocs), el (exp level), mw (max wildcards), mf (max fuzzy)
    // Wenn dropdown nicht auf options steht: entsprechend setzen
    if (f.ssdd.selectedIndex<3) {
      f.CQ_MAX_DOCS.value=md[f.ssdd.selectedIndex];
      f.CQ_EXPANSION_LEVEL.value=el[f.ssdd.selectedIndex];
      f.CQ_MAX_WILDCARD.value=mw[f.ssdd.selectedIndex];
      f.CQ_MAX_FUZZY_SPELLING.value=mf[f.ssdd.selectedIndex];
    }
  }
  
  return true;
}


//---------------------------------------------------------------------------
function rename_but (f,text) {
  // Alle Buttons im Formular f in text umanschreiben
  // globale variable ontheway setzen
//---------------------------------------------------------------------------
  var i;
  for (i=0;i<f.elements.length;i++) {
    if ('button'==f.elements[i].type) {
      f.elements[i].value=text;
    }
  }
  ontheway=true;
}

//---------------------------------------------------------------------------
function switch_template_save(f,templ) {
  // templ: current search-template, f: Formular
//---------------------------------------------------------------------------
  // print selected nachführen:
  update_sel_checkboxes(f);
  // Scrolling Mechanismus; ganzes Formular abschicken
  if (ontheway) {
    alert ('Ihre letzte Anforderung ist noch in Bearbeitung; bitte warten.');
  }
  else {
    if (check_form(f)){
      if (templ=='full') {templ='short';}
      else {templ='full';}
      rename_but(f,'Geduld');
      f.target='_self';
      f.CQACTION.value='&CQQUERY=SWITCH&CQ_SAVE[TEMPL]='+templ+'&CQXX='+(new Date).getTime();
      // Einbau für Opera, der onsubmit auch bei form.submit aufruft...
      f.onsubmit=function() {return true;};
      f.submit();
    }
  }
}

//---------------------------------------------------------------------------
function switch_template_param(f,templ) {
  // templ: current search-template, f: Formular
//---------------------------------------------------------------------------
  // print selected nachführen:
  update_sel_checkboxes(f);
  // Scrolling Mechanismus; ganzes Formular abschicken
  if (ontheway) {
    alert ('Ihre letzte Anforderung ist noch in Bearbeitung; bitte warten.');
  }
  else {
    if (check_form(f)){
      if (templ=='full') {templ='short';}
      else {templ='full';}
      rename_but(f,'Geduld');
      f.target='_self';
      // store_params auf yes setzen
      f['CQ_STORE_PARAMS'].value='YES';
      f.CQACTION.value='&CQQUERY=SWITCH&CQ_PARAM[TEMPL]='+templ+'&CQXX='+(new Date).getTime();
      // Einbau für Opera, der onsubmit auch bei form.submit aufruft...
      f.onsubmit=function() {return true;};
      f.submit();
    }
  }
}

//---------------------------------------------------------------------------
function scroll_to_doc(f,cqdn) {
  // cqdn: Docnumber, f: Formular
//---------------------------------------------------------------------------
  // print selected nachführen:
  update_sel_checkboxes(f);
  // Scrolling Mechanismus; ganzes Formular abschicken
  if (ontheway) {
    alert ('Ihre letzte Anforderung ist noch in Bearbeitung; bitte warten.');
  }
  else {
    if (check_form(f)){
      rename_but(f,'Geduld');
      f.target='_self';
      f.CQCDOCNO.value=cqdn;
      f.CQACTION.value='&CQQUERY=SCROLL&CQXX='+(new Date).getTime();
      // Einbau für Opera, der onsubmit auch bei form.submit aufruft...
      f.onsubmit=function() {return true;};
      f.submit();
    }
  }
}

//---------------------------------------------------------------------------
function update_sel_checkboxes (f) {
// f: formular mit checkbox-feldern
//---------------------------------------------------------------------------
  // hidden CQ_CHECK[xxx] gemäss checkbox xxx nachführen
  var i;
  for (i=0;i<f.elements.length;i++) {
    if (f.elements[i].type=='checkbox') {
      // feststellen, ob entsprechendes hidden field überhaupt existiert:
      if (null!=f['CQ_CHECK['+f.elements[i].name+']']) {
        f['CQ_CHECK['+f.elements[i].name+']'].value=f.elements[i].checked;
      }
    }
  }
}

//---------------------------------------------------------------------------
function suchen(f){
  // f: Formular
//---------------------------------------------------------------------------
  if (ontheway) {
    alert ('Ihre letzte Anforderung ist noch in Bearbeitung; bitte warten.');
  }
  else {
    // Anbau: setzen von hidden Suchmodus
    if (f.CQ_QUERY_TYPE.type!='select-one' && null!=f.CQ_QUERY_STRING) {
      if (0<=f.CQ_QUERY_STRING.value.search(/\w/)){f.CQ_QUERY_TYPE.value=2;}
      else {f.CQ_QUERY_TYPE.value=1;}
    }
    if (check_form(f)){
      rename_but(f,'Geduld');
      if (null!=f.CQ_EXPERT_MODE){f.CQ_EXPERT_MODE.value="1";}
      f.CQCDOCNO.value='1';
      f.CQACTION.value='&CQQUERY=SEARCH&CQ_ACTIVATE_RECURRENT_DOC_SET=NO&CQ_DELETE_RECURRENT_DOC_SET=YES&CQ_DO_QUERY=YES&CQ_CLEAR_CHECKS=YES';
      f.target='_self';
      // Einbau für Opera, der onsubmit auch bei form.submit aufruft...
      f.onsubmit=function() {return true;};
      f.submit();
    }
  }
}

//---------------------------------------------------------------------------
function wordlist(f){
  // Wortlisten anzeigen
  // f: Objekt Suchformular
//---------------------------------------------------------------------------
  var x;
  
  // Wenn CQ_SEARCH_TYPE boolean: nix machen
  // 8-ung CQ_QUERY_TYPE ist text oder select-one
  if (f.CQ_QUERY_TYPE.type!='select-one') {x=f.CQ_QUERY_TYPE.value==1}
  else {x=f.CQ_QUERY_TYPE.options[f.CQ_QUERY_TYPE.selectedIndex].value==1;}
  if(x){
    alert('Für Wortlisten wählen Sie "konzept" oder "pattern"');
  }
  else {     
    // zuerst Eingaben prüfen/ergänzen
    if (check_form(f)){
      // options-Fenser aufmachen
      var w=popup('','options',0.6,0.8);
      f.CQ_EXPERT_MODE.value="2";
      f.CQACTION.value='&CQEXPERT=YES&CQ_ACTIVATE_RECURRENT_DOC_SET=NO&CQ_DO_QUERY=YES';
      f.target='options';
      // Formular abschicken     
      f.submit();
    }
  }
}   

//---------------------------------------------------------------------------
function sortieren(f){
  // beste 100 Dokumente nach Datum/quelle sortieren
  // f: Suchformular
//---------------------------------------------------------------------------
  if (ontheway) {
    alert ('Ihre letzte Anforderung ist noch in Bearbeitung; bitte warten.');
  }
  else {
    if (check_form(f)){
      rename_but(f,'Geduld');
      set_sort_parms(f,'field');
      f.CQ_EXPERT_MODE.value="1";
      f.CQCDOCNO.value="1";
      f.CQACTION.value='&CQ_DO_QUERY=YES&CQQUERY=SEARCH&CQ_ACTIVATE_RECURRENT_DOC_SET=YES&CQ_CLEAR_CHECKS=YES';
      f.target='_self';
      // Einbau für Opera, der onsubmit auch bei form.submit aufruft...
      f.onsubmit=function() {return true;};
      f.submit();
    }
  }
}

//---------------------------------------------------------------------------
function handle_selected(f,cqnumdocs){
  // handle selected
  // f: Objekt Suchformular
  // cqnumdocs: CQ_NUM_DOCUMENTS; brauchts für CQMAX_LOOPS
//---------------------------------------------------------------------------
  // checkboxes in rware-variable nachführen
  update_sel_checkboxes(f);
  // options-Fenser aufmachen
  var w=popup('','document',0.6,0.75);
  f.target='document';
  f.CQACTION.value='&CQMAX_LOOPS='+(cqnumdocs+1)+'&CQSELECTED=YES';
  // Formular abschicken     
  f.submit();
}   

//---------------------------------------------------------------------------
function reset_ss (f) {
  // Searchstyle-Felder gemäss dropdown setzen
//---------------------------------------------------------------------------
  if (null!=f.ssdd) {
    // ssdd existiert
    // globale var: md (maxdocs), el (exp level), mw (max wildcards), mf (max fuzzy)
    // Wenn dropdown nicht auf options steht: entsprechend setzen
    if (f.ssdd.selectedIndex<3) {
      f.CQ_MAX_DOCS.value=md[f.ssdd.selectedIndex];
      f.CQ_EXPANSION_LEVEL.value=el[f.ssdd.selectedIndex];
      f.CQ_MAX_WILDCARD.value=mw[f.ssdd.selectedIndex];
      f.CQ_MAX_FUZZY_SPELLING.value=mf[f.ssdd.selectedIndex];
    }
  }
}

//---------------------------------------------------------------------------
function reset_period (f) {
  // falls f.pe und f.ps existieren: auf neuen Wert des dropdowns setzen
//---------------------------------------------------------------------------
  var ps,pe;
  if (null!=f.dadd && null!= f.ps && null!= f.pe) {
    // defper=[7,31,365,1460,-1,-2]; // default-Einstellungen für Perioden-Dropdown
    // -1: Keine Einschränkung; -2: options (in ps bzw. pe eingestellte Werte nehmen)
    // dadd vorhanden; letzte beiden Elemente spezial
    if (f.dadd.selectedIndex==f.dadd.length-2){
      // Keine Einschränkung
      f.ps.value='';
      f.pe.value='';
    }
    else if (f.dadd.selectedIndex==f.dadd.length-1){
      // Periodenangaben aus smd-Datumsfeldern nehmen; d.h. nichts machen
    }
    else {
      // dadd ist auf echten Wert eingestellt
      pe=new Date;
      pe=new Date(pe.getFullYear(),pe.getMonth(),pe.getDate());
      ps=new Date(pe.getFullYear(),pe.getMonth(),pe.getDate());
      ps.setDate(pe.getDate()-defper[f.dadd.selectedIndex]);
      f.ps.value=date2str(ps);
      f.pe.value=date2str(pe);
    }
  }     	
}

//---------------------------------------------------------------------------
function str2date (str) {
  // str dd.mm.yyyy in date obj konvertieren
//---------------------------------------------------------------------------
  var d;
  d=str.split('.');
  d=new Date(d[2],d[1]-1,d[0]);
  return d;
}

//---------------------------------------------------------------------------
function usstr2date (str) {
  // str mm/dd/yyyy in date obj konvertieren
//---------------------------------------------------------------------------
  var d;
  d=str.split('/');
  d=new Date(d[2],d[0]-1,d[1]);
  return d;
}

function check_date (fld,end) {
  /* prüft fld.value auf Datum; gibt Date-Object zurück oder null
     macht alert wenn Fehler
     unterstützte Formate:
     v1: yyyy.mm.dd;
     v2: d.m.y;
     v3: d.mon.y
     v4: yy
     v5: yyyy
     end: true, wenn bei v5 31.12  anstatt 1.1 ergänzt werden soll
  */
//---------------------------------------------------------------------------
  var d;
  var d_txt=fld.value.replace(/^[ \n\r\t]+/,"");
  d_txt=d_txt.replace(/[ \n\r\t]+$/,"");
  /* v1: yyyy.mm.dd */
  var x=d_txt.match(/^([12][0-9]{3})[^0-9]?([0-9]{2})[^0-9]?([0-9]{2})$/i);
  if (null!=x) {
    return(new Date (x[1],x[2]-1,x[3]));
  }  
  /* v2: d.m.y */
  x=d_txt.match(/^0*([1-9]|[123][0-9])[^0-9]+0*([1-9]|1[0-9])[^0-9]+([0-9]{1,4})$/i);
  if (null!=x) {
    x[3]=parseInt(x[3]);
    x[3]=x[3]<30?2000+x[3]:x[3];
    return (new Date (x[3],x[2]-1,x[1]));
  }
  /* v3: d.mon.y */
  x=d_txt.match(/^([1-9]|[123][0-9])[^0-9]*(jan|feb|fév|fev|mar|mär|apr|mai|may|jun|jui|jul|aug|sep|okt|oct|nov|dez|dec|déc)[^0-9]*([0-9]{1,4})$/i);
  if (null!=x) {
    x[3]=parseInt(x[3]);
    x[3]=x[3]<30?2000+x[3]:x[3];
    var mon={'jan':0,'feb':1,'fév':1,'fev':1,'mar':2,'mär':2,'apr':3,'mai':4,'may':4,'jun':5,'jui':5,'jul':6,'aug':7,'sep':8,'okt':9,'oct':9,'nov':10,'dez':11,'dec':11,'déc':11};
    return (new Date(x[3],mon[x[2].toLowerCase()],x[1]));
  }
  /* v4 oder v5: yy oder yyyy */
  x=d_txt.match(/^0*([1-9][0-9]{0,3})$/i);
  if (null!=x) {
    x[1]=parseInt(x[1]);
    if (x[1]>=0 && x[1]<=99 || x[1]>=1901 && x[1]<=2050){
      x[1]=x[1]<20?2000+x[1]:x[1];
      if (end) {return (new Date(x[1],11,31))}
      else {return (new Date(x[1],0,1))}
    }
  }
  
  alert ("Ungültige Angabe in einem Datum.\n\nKorrekte Angaben sind z.B.:\n15.1.99\n1. Januar 2000\n1fév00\n2000-05-01\n1998\n01");
  return (null);
}

//---------------------------------------------------------------------------
function date2str (d) {
  // d (Datum) in string dd.mm.yyyy konvertieren
//---------------------------------------------------------------------------
  if (null==d){return null;}
  else{
    var s=(d.getFullYear()*10000+(1+d.getMonth())*100+d.getDate()).toString();
    return (s.substr(6,2)+"."+s.substr(4,2)+"."+s.substr(0,4));
  }
}


//---------------------------------------------------------------------------
function date2usstr (d){
  // gibt string mm/dd/yyyy für Datum d zurück
//---------------------------------------------------------------------------
  if (null==d){return null;}
  else{
    var s=(d.getFullYear()*10000+(1+d.getMonth())*100+d.getDate()).toString();
    return (s.substr(4,2)+"/"+s.substr(6,2)+"/"+s.substr(0,4));
  }
}

//---------------------------------------------------------------------------
function check_email(email) {
  // prüft Syntax des Feldes email, return true, wenn gut
//---------------------------------------------------------------------------
  if (/^[^\s,]+@[^\s,]+\.[^\s,]+$/.test (email.value)) {
    return true;
  }
  else {
    alert ('E-Mail-Adresse ungültig');
    return false;
  }
}

//---------------------------------------------------------------------------
function popupt (url,name,w,h,links,oben) {
  // macht neues Fenster unter name name mit url url, breite w höhe h (%) auf
  // geht von max nutzbarer Breite 800 aus, damit Window nicht zu gross
  // bei Grossbildschirmen
  // mit toolbar
  // returns window object
//---------------------------------------------------------------------------
  // Bei grossen Bildschirmen nicht so breites Fenster machen...
  var breite=Math.floor(w*Math.min(800,self.screen.width));
  var hoehe=Math.floor(h*Math.min(600,self.screen.height));
  if (null==links || null==oben){
    if (h>0.75) {oben=5;}
    else {oben=Math.floor((self.screen.height-hoehe)/2);}
    var links=Math.floor((self.screen.width-breite)/2);
  }
  var parms='status=yes,toolbar=yes,directories=no,location=no,resizable=yes,scrollbars=yes,width='+breite+',height='+hoehe+',left='+links+',top='+oben;
  var w=self.open(url,name,parms);
  return w;
}

//---------------------------------------------------------------------------
function popup (url,name,w,h,links,oben) {
  // macht neues Fenster unter name name mit url url, breite w höhe h (%) auf
  // geht von max nutzbarer Breite 800 aus, damit Window nicht zu gross
  // bei Grossbildschirmen
  // ohne alle features
  // returns window object
//---------------------------------------------------------------------------
  // Bei grossen Bildschirmen nicht so breites Fenster machen...
  var breite=Math.floor(w*Math.min(800,self.screen.width));
  var hoehe=Math.floor(h*Math.min(600,self.screen.height));
  if (null==links || null==oben){
    if (h>0.75) {oben=5;}
    else {oben=Math.floor((self.screen.height-hoehe)/2);}
    var links=Math.floor((self.screen.width-breite)/2);
  }
  var parms='resizable=yes,scrollbars=yes,width='+breite+',height='+hoehe+',left='+links+',top='+oben;
  var w=self.open(url,name,parms);
  return w;
}

