/**
 * $Id: common.js,v 1.1.2.3 2008/09/23 11:00:10 caltamura Exp $
 *
 * Copyright © 2000-2007 picturesafe GmbH, Alle Rechte vorbehalten.
 * Copyright © 2000-2007 picturesafe GmbH. All rights reserved.
 *
 * Diese JavaScript-Datei stellt Standardfunktionen ALLER Systeme zur Verfuegung.
 *
 * @author Jakob Schwendner
 * @author Eike Hirsch
 * @author Marco Jacob
 * @author Christian Kroeger
 * @author Gerd Aschbrenner
 */
var lastWindow = null;
var tmyWindow = null;
var keyMap = new Array();
var skipNext = false;
var refresh = false;

function getRefresh(){return refresh;}

/* author: ckroeger
 * Leerfunction (wird ggf. in der Seite überladen)
 */
function userDefined(){}

/* author: ckroeger
 * Leerfunction
 * Muss vorhanden sein, da diese funktion immer im onLoad des body's aufgerufen wird.
 * Sie wird aber nur überschrieben, wenn in der Seite ein onEnter genutzt wird.
 * Sie muss dort dann überschrieben werden, damit sie trotz des Shadow-Mechanismus funktionieren kann.
 */
function disableOnEnterForAnchor(){return;}

function closeMe(str){
    setTimeout("closeLastWindow()",15000);
}

/* author: ckroeger */
function closeLastWindow(){
    if(lastWindow!=null)lastWindow.close();
}
/* BrowserCheck
 * Mit dieser Funktion wird getestet welcher Browser verwendet wird.
 * Das ist unbedingt notwendig um X-Brower kompatible Scripte zu verfassen!
 * Einfach eine Variable (z.B. is) global anlegen und dann diese Funktion
 * aufrufen. Danach kann die Variable einfach abgefragt werden:
 *  - if(is.nc4) ...
 * Weitere Möglichkeiten: nc, nc4, nc4, ie, ie4, ie5, min
 *
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function BrowserCheck(){
    var browser = navigator.appName;
    this.brow = navigator.appName;
    if (browser=="Netscape") this.browser = "nc";
    else if(browser=="Microsoft Internet Explorer") this.browser = "ie";
    else this.browser = browser;
    this.v = parseInt(navigator.appVersion);
    this.nc = (this.browser=="nc" && this.v>=4);
    this.nc4 = (this.browser=="nc" && this.v==4);
    this.nc5 = (this.browser=="nc" && this.v==5);
    this.ie = (this.browser=="ie" && this.v>=4);
    this.ie4 = (navigator.userAgent.indexOf('MSIE 4')>0);
    this.ie5 = (navigator.userAgent.indexOf('MSIE 5')>0);
    this.safari = navigator.appVersion.toString().toLowerCase().indexOf('safari')!=-1;
    if (this.ie5) this.v = 5;
    this.min = (this.nc||this.ie);
}
var is = new BrowserCheck();    // automatically create the "is" object

/**
* setzt die Action in der WebForm dieser Seite
* ueberprueft die felder und submittet diese.
*
* @param action die Id des abschickenden Kommandos
* @param target der Zielframe oder das Zielfenster des Submit
* @param source der Frame auf dem ein submit gemacht werden soll oder null
* @param checked boolean ob die webform überprüft werden soll
* @param changeCheckText Dieser Wert entspricht dem Wert &lt;checkChanges&gt; eines cmds. Hier drin
*                        steht der Text, der im Falle von Änderungen abgefragt werden soll
* @param close Wird von der cmd.xsl angestossen wenn constraint=closeafteraction ->nach submit wird fenster geschlossen
*/
function submitForm(action, target, source, checked, changeCheckText, close) {
    //dispArgs("submitForm",submitForm.arguments);
    if(skipNext){skipNext=false;return}
    if ( null == source ) source = self.name;
    var page   = (source == null || self.name == source ) ? self : findFrame( getFrameName( source), top );
    var doc    = page.document;
    if ( null == target ) {
        target = self.name;
    } else {
        target = ( target == self.name ) ? target : getFrameName( target );
    }

    //alert( "action: " + action + "\nsource: " + source + "\ntarget: " + target );

    if(changeCheckText && page.modified) {
        if(!confirm(changeCheckText))
            return;
    }

    if( checked ) {
        if( !checkForm(doc.WebForm, doc)) {
            return;
        }
        // alle floate in englische Schreibweise umwandeln.
        changeAllFloatsToEN( doc.WebForm );
    }

    if( doc.jumpPoint ) {
        if( -1 == action.indexOf("?") ) {
            action += "?";
        } else {
            action += "&";
        }
        action += ("page=" + doc.jumpPoint);
    }


    doc.WebForm.action = action;
    doc.WebForm.target = target;
    //alert("page.name:"+page.name + "\naction: " + action + "\ntarget: " + target +"\nDoing a Submit");
    doc.WebForm.submit();

    if(close && opener!=null){
        //alert("Closing Site.");
        setTimeout("self.close();", 1500);
    }
}

function postToPopup(cmdaction, name, props){
    var params = postToPopup.arguments;
    //dispArgs("postToPopup",params);//debug
    var myWindow = eval("top."+getFrameName(name));
    var source = null;
    if ( null == source ) source = self.name;
    var page   = (source == null || self.name == source ) ? self : findFrame( getFrameName( source), top );
    var doc    = page.document;
    if(params.length<3 || params.length>5) {alert("Error: postToPopup called with wrong number of arguments.");return null;}

    // target, name, props
    var target=params[0];
    name= getFrameName( params[1] );
    props=params[2];
    //alert(props);
    var checked=params[3]; // feldüberprüfung j/n??
    var form=self.document.WebForm;

    if(params.length==5 && params[4].name=="WebForm") form=params[4];
    /*
    if(checked!=null){
        if(!top.checkForm(params[3].WebForm, params[3])) return;
    }
    */

    if( checked ) {
        if( !checkForm(doc.WebForm, doc)) {
            return;
        }
    }

    props = parseAndModfiyProps(props); // for e.g. position=NE etc.

    //alert(props);
    if(!myWindow){
        myWindow=window.open("../site/blank.jsp",name,props);
        //myWindow=window.open("",name,props);
        //submitForm(cmdaction, name, this.frame, false, null);

        if(!checkPopupBlocker(myWindow)){
            form.action = cmdaction;
            form.target = getFrameName(name);
            form.submit();
            myWindow.focus();
        }
    }
    else{
        if(!myWindow.closed) myWindow.focus();
        else {
            myWindow=window.open("",name,props);
            if(!checkPopupBlocker(myWindow)) submitForm(cmdaction, name, this.frame, false, null);
        }
    }
}

function cmdCall(){
    var args=cmdCall.arguments;
    if(args.length<2)return 0;
    //dispArgs("cmdCall called with: ",args);
    var fn = getFrameName(args[1]); //framename
    var doc= findFrame( fn, top ).document;
    var cN =  args[0]; //command-name
    var str = doc.cmdArr[cN];
    var func= "load";
    //alert("String("+cN+") ->"+str);
    var callArr = getCallStr(str,fn);
    //alert("getCallStr = "+callArr);
    if(callArr[0]=="f")func="submitForm";
    str="";
    for(i=1;i<callArr.length;i++){
        if(i==1 && args.length>2){
            var pos=callArr[i].lastIndexOf("'");
            str+=callArr[i].substring(0, pos);
            str+=args[2];   // Der dritte Parameter enthält den Query-Anteil der URL (?id=1234&name=Test&...)
            str+="'";
        }
        else str+=callArr[i]
        if(i<callArr.length-1)str+=",";
    }
    //alert(func+"("+str+");")
    eval(func+"("+str+");");
}

function getCallStr(str,fn){
    //dispArgs("getCallStr:",getCallStr.arguments);
    var pos1=0, pos2=-1;
    var ret= new Array();
    var count=0;
    var stop=false;
    while(!stop){
        pos1 = str.indexOf("[-]",pos1);
        if(pos1!=-1){
            pos2=str.indexOf("[-]",pos1+3);
            if(pos2==-1) pos2=str.length;
            var extract=str.substring(pos1+3,pos2);
            //alert("->"+extract);
            if(extract=="self.name")extract="'"+fn+"'";
            ret[count++]=extract;
            pos1=pos2;
        }
        else stop=true;
    }
    return ret;
}

/**
 * Läd einen Frame.
 *
 * action, framename, width, height
 */
function load() {
    if(skipNext){skipNext=false;return}
    var frames = load.arguments;
    /* //DEBUG
    stx="";
    for(i=0;i<load.arguments.length;i++)stx+="arg["+i+"]="+load.arguments[i]+"\n ";
    alert(stx);
    */

    //if(frames.length<3) {alert("Error: load has to few arguments.");return null;}
    //if(frames.length>4) {alert("Error: load has to many arguments.");return null;}

    //alert(is.nc4);
    //var action    = is.nc4?(self.location.toString().substring(0,self.location.toString().lastIndexOf('/'))+"/"+frames[0]):frames[0];
    var action = frames[0];
    //alert("action = "+action);
    if(frames.length==1){
        // Für externe Links...
        myWindow=window.open(action,"_blank");
        checkPopupBlocker(myWindow);
        return;
    }
    var framename = getFrameName(frames[1]);
    //alert("framename = "+framename );
    var page = findFrame( framename, top );

    //alert("framename = "+framename+"\npage = "+(page==null?"null":page.name)+"\n frames.length = "+frames.length);       //debug

    var widthOrProps = frames[2];
    var height = frames[3];

    if ( null != page ){
        page.location.href = action;
    } else {
        if(frames.length<3){        //nur 2 Parameter angegeben   --> default-Popup
            //alert("Mac ? "+navigator.platform.toLowerCase().indexOf("mac"));
            /** Muss weg !!
            if(navigator.platform.toLowerCase().indexOf("mac")==0){
                var loc = self.location.href.substring(0,self.location.href.lastIndexOf("/")+1);
                //alert("loc = "+loc);
                self.location.href=loc+"frameset.jsp";
            }
            else checkAndOpenWindow( action, framename, '400', '300');
            */
            checkAndOpenWindow( action, framename, '400', '300');
        }
        else{
            if(frames.length<4){   // --> falscher Parameter height oder nur 3 Parameter angegeben --> Popup
                checkAndOpenWindow( action, framename, widthOrProps);
            }
            else{   // --> mindestens 4 Parameter --> breite und höhe angegeben.
                checkAndOpenWindow( action, framename, widthOrProps, height );
            }
        }
    }
}


/**
 * Erzeugt einen Framenamen im aktuellen 'BrowserContext' mit &uuml;bergebenen
 * Framebasisnamen.
 */
function getFrameName( name ) {
    var winNameX;
    // wenn wir nicht top dieser Anwendung sind und einen Opener haben:

    //default framenames
    if( 0 == name.indexOf("_") ) {
        return name;
    }

    // der ie macht komische sachen dann und wann:
    if( top.name=="_unspecifiedFrame" ) {
        if( 0 == self.name.indexOf("adamWindow" )) {
            winNameX = self.name.substring( 0, self.name.indexOf("_")+1 );
            //alert( "self.name: " + self.name + "\nwinNameX: " + winNameX );
        } else {
            return name;
            //alert( "HILFE!!!\nname: " + name + "\ntop.name: " + top.name + "\nself.name: " + self.name );
            //if( top.opener )
                //alert( top.opener.name );
        }
    } else if( !(top.opener == null || top.opener.closed ) &&
        !( top.name.indexOf("_") == top.name.length-1) ) {
        winNameX=top.opener.name.substring(0,top.opener.name.indexOf("_")+1);
        //winNameX=top.opener.top.name;
    } else {
        winNameX=top.name.substring(0,top.name.indexOf("_")+1);
        //alert( "WinNameX: "+winNameX);
    }


    //alert("winNameX = "+winNameX+"\nname = "+name+"\ndiff = "+(winNameX.length-name.length)+"\ntrue? ="+(winNameX.lastIndexOf(name)==(winNameX.length-name.length))+"\nlastIndexOf() = "+winNameX.lastIndexOf(name));
    if(  0 == winNameX.indexOf("adamWindow") &&
         -1 == name.indexOf("adamWindow") ) {
        if(winNameX.lastIndexOf(name)!=-1 &&
                (winNameX.lastIndexOf(name) == (winNameX.length-name.length))) return winNameX;
        else return winNameX + name;
    }
    return name;
}



/**
 * setzt ein Formular zur&uuml;ck.
 */
function resetForm( name ) {
    doc = findFrame( name, top ).document;
    doc.WebForm.reset();
}

function findFrame( name, win, exists ) {
    var winName="";

    if( name.indexOf("adamWindow") !=0 && ( !win.top.opener || win.top.opener.closed )) {
        winName = win.top.name;
    }

    //alert("findFrame called: win.name="+win.name+"\nseaching for:"+name);

    // get only the last part of the chain
    if( -1 < name.lastIndexOf(".")) {
        name = name.substring(name.lastIndexOf(".")+1);
    }
    //alert( "win.name="+win.name+"\nname="+name+"\nwin="+win+"\nexists="+exists );

    if ( ( winName + name ) == win.name ) {
        return win;
    }
    else if( 0 == name.indexOf('_',0) ) {
        // standard Fensternahme abfangen
        return eval(name.substring( 1 ));
    }


    if( win.frames ) {
        for( var i = 0; i < win.frames.length; i++ ) {
            //alert(win.frames[i].name+"\n"+name);
            var frm = null;
            if( ( frm = findFrame( name, win.frames[i] ) ) != null ) {
                //alert("return mit "+frm.name);
                return frm;
            }
        }
    }

    // find a frame in an opening window
    // only if we are not at the top of our application.
    if( !( win.name.indexOf("_") == win.name.length-1 || win.name=="_unspecifiedFrame") ) {
        if(win.opener && !win.opener.closed){
            var str="win.opener";
            var add=".opener";
            var stop = false;
            var lastValidWindow=str;
            while(!stop){
                lastValidWindow=str;
                str+=add;
                /*
                var x = eval(str);
                var t="";
                alert(""+str);
                if(x!=null){
                    for(i=0;i<x.frames.length;i++) t+="\nFrame = "+x.frames[i].name;
                    alert("Bearbeite Frame : "+t);
                }
                */
                eval("stop = ("+str+"==null);");
            }
            return findFrame(name, eval(lastValidWindow));
        }
    }

    //if we do not have a window yet we will retry three times
    // BugZilla #814
/*
    retry = (4 == findFrame.arguments.length ? findFrame.arguments[3] : 0);
    if( 3 > retry ) {
         setTimeout( "findFrame( name, top, exist, findFrame.arguments[3]+1 )",
               100 );
    }
*/


    // return a link to open window.
    if( exists ) {
        return open('',name);
    }

    return null;
}





/**
 * Setzt den PageIndex der Seite die angesprungen werden soll, wenn ein Formular
 * über die DropDownBox der Paginierung abgeschickt wurde.
 */
function setJumpPoint( pageIndex, win ) {
    var page = findFrame( win, top );
    page.document.jumpPoint = pageIndex;
}


/**
 * Ueberprueft ob sich diese Seite nicht(!) innerhalb eines Framesets befindet.
 * Und sorgt notfalls für ein neuladen im parentframe.
 */
function ensureTop() {
    if ( top != self )
        top.location.href = self.location.href;
}

/**
* setzt den Cursor beim aufbau der Seite auf das erste Feld
* ckroeger
**/
function setCursor(){
    if(self.location.toString().indexOf('#')!=-1)return;
    var docWeb=null;
    if( setCursor.arguments.length == 1 ) docWeb = setCursor.arguments[0];
    else docWeb=self.document.WebForm;
    var setFirst=true;
    if(docWeb==null) return;

    var element = null;
    if( docWeb.elements && (element=docWeb).elements.length>0){
        for (var i=0; i<element.elements.length; i++){
            if(forceFocus(element.elements[i].name)) {
                element.elements[i].focus();
                setFirst=false;
                break;
            }
        }
        if (setFirst){
          for (var i=0; i<element.elements.length; i++){
            if (element.elements[i].type!="hidden" && element.elements[i].disabled!=true && element.elements[i].options==null){
                    element.elements[i].focus();
                    break;
                }
            }
        }
    }
}

/* focus gesetzt j/n    CK   */
function forceFocus(toBeExtracted){
    //alert(toBeExtracted);
    var re = new RegExp('\\$f=true');
    return re.exec( toBeExtracted );
}



    /**
    * hier fängt wohl das form checking an
    */
    // Variablen fuer isDate( ... )
    var base_year_past = 1900;
    var base_year_act  = 2000;


    function checkLength( ){
        var txt="";
        var a = checkLength.arguments;
        var element = a[0];
        var len     = a[1];
        if(a.length==3) txt = a[2];
        if(element.value.length>len){
            //alert ("element.value = "+element.value+"\nlen = "+len+"\ntxt = "+txt);
            if (txt) {element.value = element.value.substr(0,len);alert(txt);}
            else element.value = element.value.substr(0,len);
        }
    }


    function checkForm(field, doc ){
        //alert("checkForm(field)");
        for ( i=0; i<field.elements.length; i++ ) {
                //alert("checkForm(field) schleife :"+i);
            if (field.elements[i].type!="radio"){
                // kleiner umbau hier, statt des feldnamens wird jetzt hier nur noch die
                // id des feldes gebraucht :)
                // diese wird per regex aus dem namen des feldes ausgelesen
                //var regresult = new RegExp("(\\w+)[_]@").exec(field.elements[i].name);
                var regresult = new RegExp("([a-zA-Z0-9]+)").exec(field.elements[i].name);
                var fieldid = "";

                if( regresult ) {
                    fieldid = regresult[1];
                    //alert("regresult = "+regresult+"\nname="+field.elements[i].name);
                }

                if(!checkDispatcher(field.elements[i], fieldid, field, doc )) return false;
            }
        }
        return true;
    }


    function getFieldByName(searchName, fieldToExamine){
        var value="";
        for ( var x=0; x<fieldToExamine.elements.length; x++ ) {
            if (fieldToExamine.elements[x].type!="radio") {
                value = fieldToExamine.elements[x].name;
                if((pos=value.indexOf(searchName))!=-1) {
                    //alert("Achtung: FELD "+fieldToExamine.elements[i].name+" hat < "+searchName+" > im namen. (pos="+pos+") \nvalue = "+value+"\nchar="+value.charAt(pos+searchName.length));
                    if(value.charAt(pos+searchName.length)=='$') {
                        //alert("Value des referenzierten Feldes ist = "+fieldToExamine.elements[x].value);
                        return fieldToExamine.elements[x];
                    }
                }
            }
        }
    }


    function checkDispatcher(element, id, field, doc){
        var cardinal  = returnCardinal(element.name);
        var type      =    returnType(element.name);
        var refName   = "";
        var ausg      = "";
        var message   = "";
        if(doc.errorText!=null)message = doc.errorText["error_"+id];

        //alert("feld="+element.name+" | type="+type);

        // falls jemand vergessen hat einen errortxt zu schreiben
        //if(!message || message=="") message="Error: Please check input fields.";  [alte Technik] ckroeger
        if(!message || message=="") message = (doc.stdError!=null) ? doc.stdError : "Error: Please check input fields.";

        // fehlermeldung korregieren
        if(((pos=message.indexOf("@@"))!=-1)){
            // name des referenzierenden feldes extrahieren
            refName = message.substr(0,pos);
            //eval(message+"=eval(message).substr(pos+2,eval(message).length);");
            ausg = message.substr(pos+2,message.length);
        } else {
            ausg = message;
        }

        //alert("refName="+refName+"\nelement.name="+element.name+"\n"+eval(message));
        //alert("cardinal ="+cardinal+" type = "+type+"\nname = "+element.name);

        // fuer Mussfeld
        if(cardinal=="required") {
            if (element.type=="select-one" && element.value=="-1") {
                return badEntry( element, ausg );
            }
            else if( element.type=="select-multiple" ){
                if( element.length == 0 | (element.length == 1 && element[0].value=="-1")){
                    return badEntry( element, ausg );
                }
            }
            else if(!checkNull(element.value)){
                return badEntry( element, ausg );
            }
        }
        else {
                if(refName!="") {
                    // den Feldinhalt des referenzierten Feld suchen
                    var desField = getFieldByName(refName, field);
                    var toCompare = desField.value;
                    //alert(toCompare+"="+element.value);
                    if(toCompare!=element.value){
                        return badEntry( element, ausg );
                    }
                }

            // wenn nicht required und feld leer dann feld ok
            if (!checkNull(element.value)) return true;
        }

        // fuer natuerliche Zahlen
        if(type=="int"){
            if(!isNumber(element.value)){
                return badEntry( element, ausg );
            }
        }

        /* natuerliche Zahl mit range
         * Benutzung:  <type>int|500|1000</type>
         * -> alle natuerlichen Zahlen zwischen
         *     500 - 1000 sind zulaessig         */
        if(type.indexOf("int|")!=-1){
            if(isNumber(element.value)){
                var lower = parseInt(getLower(type));
                var upper = parseInt(getUpper(type));
                //alert("Upper = "+upper+"   Lower ="../../../../../../public_html/+lower);
                if (!numberInRange(element.value, lower, upper)){
                    return badEntry( element, ausg );
                }
            }
            else {
                return badEntry( element, ausg );
            }
        }

        /* Komma-Zahl mit range
         * Benutzung:  <type>float|-5.0|100.0</type>
         *             <type>float</type>
         *             <type>float|,</type>
         *             <type>float|-5.0|100.0|,</type>
         * -> alle Komma-Zahlen zwischen
         *     -5.0 - 100.0 sind zulaessig
         * ckroeger
         * eike
         */
        if(type.indexOf("float")!=-1) {
            //alert("isFloat(element.value) = "+isFloat(element.value));
            var decimalSeperator = getDecimalSeperator( type );
            if( !isFloat(element.value, decimalSeperator )) {
                return badEntry( element, ausg );
            }
            var value = toTargetFloat( element.value, decimalSeperator );
            // check a range?
            if( 1 < countCharacter( type, '|' )) {
                var lower = parseFloat( getLower( type ));
                var upper = parseFloat( getUpper( type ));
                //alert("lower = "+lower+"\nupper = "+upper+"\nvalue = "+value+"\n");
                if(isNaN(lower) || isNaN(upper) || value<lower || value>upper){
                    return badEntry( element, ausg );
                }
            }
        }

        // Ueberpruefung ob gueltige email-adresse
        if(type=="mail"){
            if (!checkMailAddress(element.value)){
                return badEntry( element, ausg );
            }
        }

        // gueltige Postleitzahl
        if(type=="plz"){
            if (!checkPLZ(element.value)){
                return badEntry( element, ausg );
            }
        }

        // gueltiges Datum
        if(type.indexOf("date|")!=-1){
            var pos = type.indexOf("date|")+4;

            //alert("calling checkTime(\""+element.value+"\", \""+type.substr(pos+1)+")\"");

            var arr = checkTime(element.value, type.substr(pos+1));

            //alert("arr.length = "+arr.length+"\n arr[0]"+arr[0]+"\n arr[1]"+arr[1]+"\n arr[2]"+arr[2]);

            /* ALT
            var date_format = "";
            date_format = type.substr(pos+1, type.length-pos);
            el_value = element.value;
            */


            //alert("el_value = "+el_value+" date_format = "+date_format);
            //alert("date_format = "+date_format+"\n value = "+element.value);

            //if (!isDate(el_value, date_format)){  ALT

            //          value , format
            if (!isDate(arr[1], arr[2])){
                return badEntry( element, ausg );
            }
        }

        // gueltige Uhrzeit
        if(type.indexOf("time|")!=-1){
            var pos = type.indexOf("time|")+4;
            var time_format = type.substr(pos+1);
            var el_value = element.value;

            if (!isTime(el_value, time_format)){
                return badEntry( element, ausg );
            }
        }

        // gueltig mit regulärer Ausdruck?!
        if(type.indexOf("regExp|")!=-1){
            var pos = type.indexOf("regExp|")+"regExp|".length;
            //alert("The Type: " + type )
            var regStr = type.substr(pos, type.length-pos)
            //alert("The String: " + regStr );
            if (!regExpr(regStr, element.value)){
                return badEntry( element, ausg );
            }
        }

        // maxlength fuer textarea
        if((pos=type.indexOf("maxlength|"))!=-1){
          len = parseInt(type.substr(pos+10, type.length-pos));
          //alert("textarea  zahl="+len+" value.length ="+element.value.length);
          if (len<element.value.length){
            return badEntry( element, ausg );
          }
        }

        /* immer return true, wenn bisher keine Ueberpruefung
         * fehl schlug                                                                                */

        return true;
    }


// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++   Helfermethoden zum Formchecking   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


        function badEntry( element, ausg ) {
            alert(ausg);
            if(element.type!="hidden")element.focus();
            return false;
        }


        // fuer regulaere-Ausdruecke
        function regExpr(regStr,str){
          reg = new RegExp(regStr);
          res = reg.exec(str);
          len = 0;
          if (res)  len = res.length;
          else return false;
          if(len>0){
            if(res[0]==str) return true;
          }
          return false;
        }


        /* routine zu fixen von feldnamen mit slashes */
        function replaceChar(val, replace, by){
            //alert("val="+val);
            var pos=val.indexOf(replace);
            if(pos!=-1){
                 if (pos==0) {
                    val =  by+val.substr(1,val.length-1);
                 }
                 else val = val.substr(0,pos) +  by + val.substr(pos+1,val.length-pos+1);
                 val = replaceChar(val, replace, by);
            }
            return val;
        }

        /* Kardinalitaet als String zurueck geben */
        function returnCardinal(toBeExtracted){
            var re = new RegExp('\\$c=(\\w+)');
            var ret = re.exec( toBeExtracted );

            if( ret ) {
                return ret[1];
            }
            return '';
        }

        /* Type als String zurueck geben */
        /* regulaeren-Ausdruck gefixt CK */
        function returnType(toBeExtracted){
            var re = new RegExp('\\$t=([\\S\\|\\.-]+)');
            var ret = re.exec( toBeExtracted );

            if( ret ) {
                return ret[1];
            }
            return '';
        }

        /**
         * Ermittelt das Dezimaltrennzeichen, das fuer dieses float-Feld benutzt werden soll.
         * Type kann folgende Formen annehmen:
         * 1. float
         * 2. float|-5.0|100.0
         * 3. float|,
         * 4. float|-5.0|100.0|.
         * daraus resultiert:
         * 1. & 2. defaultSeperator (',')
         * 3. ','
         * 4. '.'
         * eike
         */
        function getDecimalSeperator( type ) {
            var defaultSeperator = ',';
            var count = countCharacter( type, '|' );

            if( 1 == count || 3 == count ) {
                return type.substr( type.lastIndexOf('|')+1, 1);
            }
            return defaultSeperator;
        }


        function getGroupingSeperator( decimalSeperator ) {
            var comma = ',';
            var dot = '.';

            if( comma == decimalSeperator ) return dot;
            else if( dot  == decimalSeperator ) return comma;
        }

        /* Gibt untere Grenze wieder */
        function getLower(str){
            pos1 = str.indexOf("|")+1;
            pos2 = str.indexOf("|",pos1);
            //alert("str = "+str+"  pos1 = "+pos1+"  pos2 = "+pos2);
            //alert("lower = "+str.substr(pos1, pos2-pos1));
            return str.substr(pos1, pos2-pos1);
        }

        /* Gibt obere Grenze wieder */
        function getUpper(str){
            pos1 = str.indexOf("|")+1;
            pos2 = str.indexOf("|",pos1)+1;
            //alert("str = "+str+"  pos1 = "+pos1+"  pos2 = "+pos2);
            //alert("upper = "+str.substr(pos2, str.length-pos2));
            return str.substr(pos2, str.length-pos2);
        }

        /* Testen ob gueltige Mail-adresse */
        function checkMailAddress(address){
            var emailPat=/^(.+)@(.+)$/;
            var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
            var validChars="\[^\\s" + specialChars + "\]";
            var quotedUser="(\"[^\"]*\")";
            var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
            var atom=validChars + '+';
            var word="(" + atom + "|" + quotedUser + ")";
            var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
            var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
            var matchArray=address.match(emailPat);
            if (matchArray==null) {
                //alert("Adresse falsch! Bitte ueberpruefen Sie alle @ und Punkte");
                return false;
            }
            var user=matchArray[1];
            var domain=matchArray[2];

            if (user.match(userPat)==null) {
            //alert("Username sieht falsch aus!")
            return false;
            }

            var IPArray=domain.match(ipDomainPat);
            if (IPArray!=null) {
            // es ist eine IP
              for (var i=1;i<=4;i++) {
                if (IPArray[i]>255) {
                    //alert("Ziel IP schein falsch zu sein!");
                        return false;
                }
            }
            return true;
            }

            var domainArray=domain.match(domainPat);
            if (domainArray==null) {
                //alert("Der Domainname sieht falsch aus.")
                 return false;
            }

            var atomPat=new RegExp(atom,"g");
            var domArr=domain.match(atomPat);
            var len=domArr.length;

            if (domArr[domArr.length-1].length<2){
               // || domArr[domArr.length-1].length>3) {
               // domain name muss min. 3 Zeichen im Domainnamen enthalten
               //alert("Die Adresse muss mit mindestens drei Buchstaben in der Domain haben oder eine Laenderkennung mit zwei Buchstaben.")
               return false;
            }

            // wenn bisher nix geknallt hat dann ist die adresse okay
            return len >= 2;

        }

        /* Testen ob String eine Zahl ist */
        function isNumber(str) {
            if(str==null || str.length==0 || ( str.indexOf('-')==0 && str.length==1 )) return false;
            if(str.indexOf('-')==0) str=str.substr(1);
            for ( var i=0; i<str.length; i++ ) {
                var actChar = str.charAt(i);
                if ( actChar < "0" || actChar > "9" ) {
                    return false;
                }
            }
            return true;
        }

        /**
         * Testen ob String ein float ist
         * ckroeger, eike
         */
        function isFloat(str, decimalSeperator ) {
            // haben wir was zum pruefen
            if( str == null || str.length == 0 ) {
                return false;
            }
            // ist das was wir haben eine Zahl
            if( isNaN( parseFloat( str ))) {
                return false;
            }
            // Es darf nicht mehr als ein Trennzeichen geben!
            if( 1 < countCharacter(str, decimalSeperator ) ) {
                return false;
            }
            // wenn es ein Tausendertrennzeichen gibt muessen auch genau drei stellen folgen.
            return checkGroupingSeperators( str, decimalSeperator );
        }

        /**
         * wenn es ein Tausendertrennzeichen gibt muessen auch genau drei stellen folgen.
         */
        function checkGroupingSeperators( floatToTest, decimalSeperator ) {
            var groupingSeperator = getGroupingSeperator( decimalSeperator );
            var groupIndex;
            if( -1 < ( groupIndex = floatToTest.indexOf( groupingSeperator ))) {
                var testRest = floatToTest.substring( groupIndex+1 );
                //alert( "input: " + floatToTest + "restToTest: " +testRest );
                // letzter token? wir brauchen noch 3 stellen.
                if(  3 > testRest.length ) return false;
                // an vierter Stelle muss ein Zeichen kommen.
                // alert( "char at 4: " + testRest.charAt( 3 ));
                if( groupingSeperator != testRest.charAt( 3 ) && decimalSeperator != testRest.charAt( 3 ) ) return false;
                // gibt's noch mehr zu tun?
                if( -1 < testRest.indexOf( groupingSeperator )) return checkGroupingSeperators( testRest, decimalSeperator );
            }
            return true;
        }




        /**
         *  Wandelt eine Zahl in eine gültige Float um.
         *  decimalSeperator wird durch '.' ersetzt sollte dann kein '.'
         *  im String enthalten sein wir einer angehängt.
         *  eike
         */
        function toTargetFloat( floatString, decimalSeperator ) {
            var tmpSeperator = '$';
            var targetSeperator = '.';
            // save the real seperator.
            floatString = replaceChar( floatString, decimalSeperator, tmpSeperator);
            // remove posible other seperators
            floatString = replaceChar( floatString, ',', '' );
            floatString = replaceChar( floatString, '.', '' );
            // restore the real one.
            floatString = replaceChar( floatString, tmpSeperator, targetSeperator);
            if( -1 == floatString.indexOf( targetSeperator )) {
                floatString += targetSeperator;
            }
            return floatString;
        }


        /**
         * Alle Felder durchlaufen und float-Felder auf englisch setzen.
         */
        function changeAllFloatsToEN( formular ) {
            for ( var i=0; i<formular.elements.length; i++ ) {
                var current = formular.elements[i];
                var type    = returnType( current.name );
                var decimalSeperator = getDecimalSeperator( type );

                if( checkNull( current.value ) ) {
                    if( type.indexOf("float" ) != -1 ) {
                        current.value = toTargetFloat( current.value, decimalSeperator );
                    }
                }
            }
        }


        /**
         * Zaehlt das Vorkommen von 'character in str.
         * eike
         */
        function countCharacter(str, character ) {
            if( -1 == str.indexOf( character ) ) {
                return 0;
            }
            var i = 0, j = 0;
            while( i < str.length ) {
                i = str.indexOf( character, i );
                if( -1 == i )
                    break;
                j++;
                i++;
            }
            return j;
        }

        /* Testen ob lower <= str <= upper */
        function numberInRange(str, lower, upper) {
            var number = parseInt(str, 10); /* so Problem mit fuehrender Null umgehen! */
            return ((number >= lower) && (number <= upper));
        }

        /* Testen ob String eine PLZ ist (keine Gewaehr CK) */
        function checkPLZ(str) {
            return isNumber(str) && (str.length == 5) && numberInRange(str, 1000, 99999);
        }

        /* from outer space (space test)*/
        function spaceOnly(inp) {
            for ( var i=0; i<inp.length; i++ ) {
            if ( inp.charAt(i) != " " ) {
                return true;
                }
            }
            return false;
        }

        /* Testen ob feld leer ist oder mit spaces
         * gefuellt                                 */
        function checkNull(inp) {
            if ( null == inp || 0 == inp.length ) {
              return false;
            }
            else {
              return spaceOnly(inp);
            }
        }

/* ------------------------------------------------------------------
 * isDate ( date_string, format_string )
 *
 * Gibt true zurück wenn das format des datestrings mit dem
 * formatstring uebereinstimmen und es ein gueltiges Datumsformat
 * ist (false sonst).
 *
 * Wichtig ist, dass man alle whitespaces um das value entfernt
 * bevor man diese Funktion aufruft.
 * Whitespaces werden NICHT ignoriert!
 *
 * @param date_string   Zu parsendes Datum aus entspr. Feld
 * @param format_string Format in dem das Datum vorliegen soll
 *
 * @return Wenn angegebenes Datum dem Format des format-strings entspricht
 *         wird true zurueck geliefiert
 *
 * Es gibt (bis jetzt) folgende Formatzeichen
 *
 * Field        | Full Form          | Short Form
 * -------------+--------------------+-----------------------
 * Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
 * Month        | wenn ich zeit habe | MM (2 digits), M (1 or 2 digits)
 * Day of Month | dd (2 digits)      | d (1 or 2 digits)
 *
 * Beipiel:
 * dd.MM.yyyy   um  03.08.2001  zu testen
 * will man tolerant sein so macht man so was:
 * d.M.y  das format akzeptiert jetzt 3.8.01 oder 3.08.2001
 * es muessen nicht zwingend punkte als trenner verwendet werden
 * MM-dd-yy fuer Angloformate 08-03-01
 *
 * ------------------------------------------------------------------ */
function isDate(val,format) {
    var date = getDateFromFormat(val,format);
    return date != 0;

}


function getDateFromFormat(val,format) {
    //damit kein boeses undefiend kommt
    val = val+"";
    format = format+"";
    // zaehler
    var i_val = 0;
    var i_format = 0;
    var c = "";
    var token = "";
    var x,y;
    var now   = new Date();
    var year  = now.getYear();
    var month = now.getMonth()+1;
    var date  = now.getDate();
    var hh    = now.getHours();
    var mm    = now.getMinutes();
    var ss    = now.getSeconds();
    var ampm  = "";

    while (i_format < format.length) {
        // hole naechsten token von format string
        c = format.charAt(i_format);
        token = "";
        while ((format.charAt(i_format) == c) && (i_format < format.length)) {
            token += format.charAt(i_format);
            i_format++;
            }
        // extrahiere den inhalt abhängig vom token

        // debug
        //alert("Token = "+token)

        // Tag
        if (token=="dd" || token=="d") {
            // d -> einstellig oder zweistellig
            x=token.length; y=2;
            date = getInt(val,i_val,x,y);
            if (date == null) { return 0; }
            if ((date < 1) || (date>31)) { return 0; }
            i_val += date.length;
        }
        // Monat
        else if (token=="MM" || token=="M") {
            // M -> einstellig oder zweistellig
            x=token.length; y=2;
            month = getInt(val,i_val,x,y);
            if (month == null) { return 0; }
            if ((month < 1) || (month > 12)) { return 0; }
            i_val += month.length;
        }
        else if (token=="yyyy" || token=="yy" || token=="y") {
            if (token=="yyyy") { x=4;y=4; }// 4 -vier stelliges Jahr
            if (token=="yy")   { x=2;y=2; }// 2 -zwei stelliges Jahr
            if (token=="y")    { x=2;y=4; }// 2- oder -4 -> zwei oder vierstelliges Jahr
            year = getInt(val,i_val,x,y);
            if (year == null) { return 0; }
            i_val += year.length;
            /* massnahme gegen angabe zweistelliger jahreszahlen
             * bsp. base_year_past = 1900
             *      base_year_act  = 2000
             * wenn jetzt das jahr als 71 angegeben wird so
             * wird das jahr als 1971 interpretiert
             * alle jahres angaben bis einschl. 70 werden als 2000 + jahreszahl
             * interpretiert.
             */
            if (year.length == 2) {
                if (year > 70) {
                    year = base_year_past+year;
                    }
                else {
                    year = base_year_act+year;
                    }
                }
            }
        // fuellzeichen z.B. [.|/|-] etc.
        else {
            // debug
            //alert("i_val = "+i_val+" | token.length = "+token.length+" | i_val+token.length = "+(i_val+token.length)+"\n token = "+token );
            if (val.substring(i_val,i_val+token.length) != token) {
                return 0;
                }
            else {
                i_val += token.length;
                }
            }
        }
    // sollten da noch zeichen sein -> keine uebereinstimmung
    if (i_val != val.length) {
        return 0;
    }
    // gueltiger Monat
    if (month == 2) {
        // pruefung auf schaltjahr
        if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) { // schaltjahr
            // mehr als 29 tage ? -> dann falsch
            if (date > 29){ return false; }
        }
        else {
            // wenn kein schaltjahr dan februar max 28 tg
            if (date > 28) { return false; }
        }
    }
    // fingerknochen abzaehlen geht hier nicht ;-)
    if ((month==4)||(month==6)||(month==9)||(month==11)) {
        if (date > 30) { return false; }
    }

    var newdate = new Date(year,month-1,date,hh,mm,ss);
    return newdate.getTime();
    }


/*
 * Diese Methode testet ob eine Zeitüberprüfung stattfinden muss
 * wenn dies der Fall ist wird die Zeitüberprüfung angestossen
 *
 * @param String üblicher weise der Feldinhalt ( 12.12.2002[ 12:59:30] )
 * @param String Feldformat              (  date|d.M.y|hh:mm:ss        )
 *
 * @returns Array Ein Array mit folgendem Inhalt:
 *                                                 [0] = [true|false]
 *                                                       false => ungültiges Zeitformat
 *                                                       true => entweder keine Zeitüberprüfung nötig
 *                                                               oder Zeitüberprüfung geglückt.
 *                                                 [1] = wenn die Zeitprüfung geklappt hat steht hier
 *                                                       der Feldwert für die Datumsprüfung (z.B. 12.12.2002)
 *                                                 [2] = wenn die Zeitprüfung geklappt hat steht hier
 *                                                       der Formatstring für die Datumsprüfung (z.B. d.M.y)
 *
 */
function checkTime(val, str){
    //alert("incoming str = "+str);
    var pos = str.indexOf('|');
    var arr = new Array(3);
    if(pos<0) {
        // no time-check needed
        arr[0]=true;
        arr[1]=val;
        arr[2]=str;
        return arr;
    }
    var timeStr = str.substr(pos+1);
    var timeOpt = false; //ist uhrzeit optional
    //alert("checkTime: timeStr = "+timeStr);
    if(timeStr.indexOf('[')==0 && timeStr.charAt(timeStr.length-1)==']'){
        //alert("checkTime: cutting timeStr = "+timeStr);
        timeStr = timeStr.substring(1, timeStr.length-1);
        timeOpt = true;
        //alert("checkTime: [cutted] timeStr = "+timeStr);
    }
    var sVal="";
    //alert("val = "+val+"\nrimeStr = "+timeStr);
    //alert("val.length = "+val.length+"\nrimeStr.length = "+timeStr.length);
    var cutPos=val.lastIndexOf(' ')+1;
    //alert("cutPos = "+cutPos);
    if(cutPos>0)
        sVal = val.substr(cutPos); // shorten timeString

    //alert("calling isTime(\""+sVal+"\", \""+timeStr+")\"");
    if(!isTime(sVal,timeStr)) {
        // non matching format
        arr[0]=timeOpt;
        if(timeOpt){
            arr[1]=val;
            arr[2]=str.substr(0,(str.length-timeStr.length)-(timeOpt?3:1));
        }
        return arr;
    }
    else {
        // time-check succeeded
        arr[0]=true;
        arr[1]=val.substr(0,val.indexOf(' ')<0?"":val.indexOf(' '));
        arr[2]=str.substr(0,(str.length-timeStr.length)-(timeOpt?3:1));
        //alert("returning: "+arr[0]+" ; "+arr[1]+" ; "+arr[2]);
        return arr;
    }
}

/*
 * Diese Methode testet ob eine Zeitüberprüfung stattfinden muss
 * wenn dies der Fall ist wird die Zeitüberprüfung angestossen
 *
 * @param String üblicher weise der Feldinhalt ( 12.12.2002[ 12:59:30] )
 * @param String Feldformat              (  date|d.M.y|hh:mm:ss        )
 *
 * @returns boolean true => ok
 *
 */
function isTime(val, format){
    if(val.length!=format.length) return false;
    //damit kein boeses undefiend kommt
    val = val+"";
    format = format+"";
    // zaehler
    var i_val = 0;
    var i_format = 0;
    var c = "";
    var token = "";
    var x,y;
    while (i_format < format.length) {
        // hole naechsten token von format string
        c = format.charAt(i_format);
        token = "";
        while ((format.charAt(i_format) == c) && (i_format < format.length)) {
            token += format.charAt(i_format);
            i_format++;
        }
        // extrahiere den inhalt abhängig vom token
        // debug
        //alert("isTime: Token = "+token)
        // Hour
        if (token=="hh") {
            x=token.length; y=2;
            //alert("val = "+val+"\ni_val = "+i_val+"\nx = "+x+"\ny = "+y);
            hour = getInt(val,i_val,x,y);
            //alert("Hour = "+hour);
            if (hour == null) { return false; }
            if ((hour < 0) || (hour>23)) { return false; }
            i_val += hour.length;
        }
        // Minutes
        else if (token=="mm") {
            x=token.length; y=2;
            //alert("val = "+val+"\ni_val = "+i_val+"\nx = "+x+"\ny = "+y);
            minu = getInt(val,i_val,x,y);
            //alert("Minute = "+minu);
            if (minu == null) { return false; }
            if ((minu < 0) || (minu > 59)) { return false; }
            i_val += minu.length;
        }
        // Seconds
        else if (token=="ss") {
            x=token.length; y=2;
            //alert("val = "+val+"\ni_val = "+i_val+"\nx = "+x+"\ny = "+y);
            sec = getInt(val,i_val,x,y);
            //alert("Second= "+sec);
            if (sec == null) { return false; }
            if ((sec < 0) || (sec > 59)) { return false; }
            i_val += sec.length;
        }
        // fuellzeichen z.B. [.|/|-] etc.
        else {
            // debug
            //alert("i_val = "+i_val+" | token.length = "+token.length+" | i_val+token.length = "+(i_val+token.length)+"\n token = "+token );
            if (val.substring(i_val,i_val+token.length) != token) {
                //alert("val.substring(i_val,i_val+token.length) = "+val.substring(i_val,i_val+token.length)+"\ntoken="+token);
                return false;
            }
            else {
                i_val += token.length;
                //alert("add i_val = "+i_val);
            }
        }
      }
    return true;
}

/* ------------------------------------------------------------------
 * Utility-function für das parsen von Datumswerten
 * ------------------------------------------------------------------ */
function getInt(str,i,minlength,maxlength) {
    for (x=maxlength; x>=minlength; x--) {
        var token = str.substring(i,i+x);
        //alert("getInt: token = "+token);
        if (token.length < minlength) {
            return null;
        }
        if (isNumber(token)) {
            return token;
        }
    }
    return null;
}
// ------------------------------------------------------------------
// END Utility-function
// ------------------------------------------------------------------


/**
 * Die Macromedia Dreamweaver standardfunktionen für rollover, groups usw...
 */
function MM_findObj(n, d) { //v3.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}

function MM_nbGroup(event, grpName) { //v3.0
  var i,img,nbArr,args=MM_nbGroup.arguments;
  if (event == "init" && args.length > 2) {
    if ((img = MM_findObj(args[2])) != null && !img.MM_init) {
      img.MM_init = true; img.MM_up = args[3]; img.MM_dn = img.src;
      if ((nbArr = document[grpName]) == null) nbArr = document[grpName] = new Array();
      nbArr[nbArr.length] = img;
      for (i=4; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
        if (!img.MM_up) img.MM_up = img.src;
        img.src = img.MM_dn = args[i+1];
        nbArr[nbArr.length] = img;
    } }
  } else if (event == "over") {
    document.MM_nbOver = nbArr = new Array();
    for (i=1; i < args.length-1; i+=3) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = (img.MM_dn && args[i+2]) ? args[i+2] : args[i+1];
      nbArr[nbArr.length] = img;
    }
  } else if (event == "out" ) {
    for (i=0; i < document.MM_nbOver.length; i++) {
      img = document.MM_nbOver[i]; img.src = (img.MM_dn) ? img.MM_dn : img.MM_up; }
  } else if (event == "down") {
    if ((nbArr = document[grpName]) != null)
      for (i=0; i < nbArr.length; i++) { img=nbArr[i]; img.src = img.MM_up; img.MM_dn = 0; }
    document[grpName] = nbArr = new Array();
    for (i=2; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = img.MM_dn = args[i+1];
      nbArr[nbArr.length] = img;
  } }
}

function MM_swapImgRestore() { //v3.0
    var i,x,a=document.MM_sr;
    for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
    var d=document;
    if(d.images){
        if(!d.MM_p) d.MM_p=new Array();
        var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
        for(i=0; i<a.length; i++)
            if (a[i].indexOf("#")!=0){
                d.MM_p[j]=new Image;
                d.MM_p[j++].src=a[i];
            }
    }
}

function MM_swapImage() { //v3.0
    var i,j=0,x,a=MM_swapImage.arguments;
    document.MM_sr=new Array;
    for(i=0;i<(a.length-2);i+=3)
        if ((x=MM_findObj(a[i]))!=null){
            document.MM_sr[j++]=x;
            if(!x.oSrc) x.oSrc=x.src;
            x.src=a[i+2];
        }
}

function checkPopupBlocker(wind){
    if(wind==null){
        alert("Bitte deaktivieren Sie den Popupblocker!\nPlease deaktivate popup-blocker !");
        return true;
    }
    return false;
}

/**
 * Mit diesem Script kann man ein Popup-Fenster öffnen. Falls schon ein
 * Fenster mit diesem Namen existiert wird jenes verwendet, anderenfalls
 * ein neues geöffnet.
 *
 * Es gibt 2 Möglichkeiten diese Funkrion aufzurufen (überladen!).
 * 1. Möglichkeit:  (Das Fenster hat Standardeigenschaften.)
 * @param target Die URL der Seite die in das Fenster geladen werden soll.
 * @param name   Der Name des Fensters (Objektes). Über diesen kann das
 *               Fenster referenziert werden.
 * @param width  Die Breite des Popup-Fensters.
 * @param height Die Höhe des Popup-Fensters.
 *
 * 2. Möglichkeit:   (Die Eigenschaften des Fensters müssen gesetzt werden.)
 * @param target Die URL der Seite die in das Fenster geladen werden soll.
 * @param name   Der Name des Fensters (Objektes). Über diesen kann das
 *               Fenster referenziert werden.
 * @param props  Die Eigenschaften (Properties) des Fensters. Die Fenster-
 *               Attribute werden im String Komma-separiert. Mögliche Attribute:
 *                 dependent= yes|no
 *                 height= [Pixel]
 *                 hotkeys= yes|no
 *                 innerHeight= [Pixel]
 *                 innerWidth= [Pixel]
 *                 left= [Pixel]
 *                 location= yes|no
 *                 menubar= yes|no
 *                 resizable= yes|no
 *                 screenX= [Pixel]
 *                 screenY= [Pixel]
 *                 scrollbars= yes|no
 *                 status= yes|no
 *                 toolbar= yes|no
 *                 top= [Pixel]
 *                 width= [Pixel]
 *  Bsp.: 'innerWidth=20,innerHeight=30,width=20,height=30,resizable=yes,scrollbars=yes'
 *
 * In der JSP:
 *   <cmditem>
 *     <adam:cmd type="popup" name="account_form" location="customer/businessobject/account_form" target="anmeldung_window" action="view">
 *       <xsl-param>'left=0,top=0,innerWidth=510,innerHeight=690,width=510,height=690,resizable=yes,status=no'</xsl-param>
 *     </adam:cmd>
 *     <image id="img/logo" name="customer/img/de/fr1_anmeldung" type="gif"/>
 *   </cmditem>
 *
 */
function checkAndOpenWindow(){
    var params = checkAndOpenWindow.arguments;
    //dispArgs("checkAndOpenWindow",params);
    //alert( "das ist jetzt neu");
    if(params.length<3) {alert("Error: popupSelector to few arguments.");return null;}
    if(params.length>4) {alert("Error: popupSelector to many arguments.");return null;}
    var target=params[0];
    var name=params[1];
    var myWindow = findFrame( name, top );
    if(params.length==3){
        // target, name, props
        var props=params[2];
        props = parseAndModfiyProps(props); // for e.g. position=NE etc.

        if(!myWindow){
            myWindow=window.open(target,name,props);
            if(!checkPopupBlocker(myWindow)) myWindow.focus();
        }
        else{
            if(!myWindow.closed){ myWindow.focus(); }
            else {
                myWindow=window.open(target,name,props);
                checkPopupBlocker(myWindow);
            }
        }
    }
    else if(params.length==4){
        // target, name, width, height
        var width=params[2];
        var height=params[3];
        if(!myWindow){
            myWindow=window.open(target,name,'innerWidth='+width+',innerHeight='+height+',width='+width+',height='+height+',resizable=yes,scrollbars=yes');
            tmyWindow=myWindow;
            if(!checkPopupBlocker(myWindow))setTimeout("tmyWindow.focus()", 500 );
        }
        else{
            if(!myWindow.closed) {
                myWindow.resizeTo( width, height );
                myWindow.focus();
            }
            else {
                myWindow=window.open(target,name,'innerWidth='+width+',innerHeight='+height+',width='+width+',height='+height+',resizable=yes,scrollbars=yes');
                checkPopupBlocker(myWindow);
            }
        }
    }
    lastWindow = myWindow;
}

/**
 * Modifiziert den Propsstring entsprechend der optionalen Attribute.
 */
function parseAndModfiyProps(props){
    var modifiedStr="";
    //alert(props);
    var erg     = props.match(/(\w+)=(\w+)/gi);
    var leftSub = 10;
    if(navigator.platform.toLowerCase().indexOf("mac")!=-1) leftSub=20;
    if(erg!=null){
        for(i=erg.length-1;i>-1;i--){
            var pos=erg[i].toLowerCase().indexOf("position=");
            if (pos==0){
                var posStr=erg[i].substr(9).toUpperCase();
                //alert("Detected value="+posStr);
                props=props.replace(/position=(\w+)/,"") ;                // eat up position attribute
                var left=0, top=0;
                var height_erg = props.match(/height=([0-9]+)/);
                var width_erg = props.match(/width=([0-9]+)/);
                //alert("height_erg="+height_erg+"\nwidth_erg="+width_erg);
                //alert(props);
                if(!width_erg) return props; // if no width defined return old str
                if(posStr=="NE"){ /* North-East (rechte obere Ecke)*/
                    left=screen.width-parseInt(width_erg[0].substr(6))-leftSub;
                    if(props.indexOf('top=')<0) props="top=0,"+props;
                    else props=props.replace(/top=([0-9]+)/,"top=0") ;         // y-pos = 0
                    if(props.indexOf('left=')<0) props="left="+left+","+props;
                    else props=props.replace(/left=([0-9]+)/,"left="+left) ;    // x-pos = calculated position
                    //alert(props);
                }
                else if(posStr=="SE"){ /* South-East (rechte untere Ecke)*/
                    //alert(height_erg);
                    if(!height_erg) return props; // if no height defined return old str
                    left=screen.width-parseInt(width_erg[0].substr(6))-leftSub;
                    top =screen.height-parseInt(height_erg[0].substr(7))-50;
                    if(props.indexOf('top=')<0) props="top="+top+","+props;
                    else props=props.replace(/top=([0-9]+)/,"top="+top) ;     // y-pos = 0
                    if(props.indexOf('left=')<0) props="left="+left+","+props;
                    else props=props.replace(/left=([0-9]+)/,"left="+left) ;    // x-pos = calculated position
                    //alert(props);
                }
                else if(posStr=="CENTER"){ /* Center (Mitte des Bildschirms)*/
                    //alert(height_erg);
                    if(!height_erg) return props; // if no height defined return old str
                    left=(screen.width-parseInt(width_erg[0].substr(6)))/2;
                    top =(screen.height-parseInt(height_erg[0].substr(7)))/2;
                    if(props.indexOf('top=')<0) props="top="+top+","+props;
                    else props=props.replace(/top=([0-9]+)/,"top="+top) ;     // y-pos = center-x
                    if(props.indexOf('left=')<0) props="left="+left+","+props;
                    else props=props.replace(/left=([0-9]+)/,"left="+left) ;    // x-pos = center-y
                    //alert(props);
                }
                else if(posStr=="NW"){ /* Center (Mitte des Bildschirms)*/
                    //alert(height_erg);
                    if(!height_erg) return props; // if no height defined return old str
                    left=0;top=0;
                    if(props.indexOf('top=')<0) props="top="+top+","+props;
                    else props=props.replace(/top=([0-9]+)/,"top="+top) ;     // y-pos = center-x
                    if(props.indexOf('left=')<0) props="left="+left+","+props;
                    else props=props.replace(/left=([0-9]+)/,"left="+left) ;    // x-pos = center-y
                    //alert(props);
                }
                else {
                    alert("position="+posStr+" is not implemented yet.");
                }
            }
        }
    }
    return props;
}

/**
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function openHelpWindow(target){
    var myWindow=window.open(target,'contexthelp','screenX=50,left=50,screenY=50,top=50,scrollbars=1,resizable=yes,toolbar=0,location=0,directories=0,status=0,fullscreen=0,width=620,height=400,innerHeight=400,innerWidth=620');
    checkPopupBlocker(myWindow);
}

/**
 * W&auuml;hlt alle checkboxen einer Seite aus.
 */
function checkAll( name ) {
    var el = findFrame( getFrameName(name), top ).document.WebForm.elements;
    for (var i=el.length; --i>=0; ) {
        if (el[i].type.toLowerCase()=='checkbox') {
            el[i].checked=true;
        }
    }
}


/**
 * W&auuml;hlt alle checkboxen einer Seite ab.
 */
function uncheckAll( name ) {
    var el = findFrame( getFrameName(name), top ).document.WebForm.elements;
    for (var i=el.length; --i>=0; ) {
        if (el[i].type.toLowerCase()=='checkbox') {
            el[i].checked=false;
        }
    }
}

/**
 * Diese Funktion soll ein PopUpFenster öffnen in dem eine JSP geladen wird
 *
 * @param target Die URL des zu öffnenden Fensters.
 * @param name Der Name des Fensters. Über diesen ist es später auch referenzierbar.
 * @param field-id Dies ist der Name des zu modifizierenden Feldes.
 * @param centered true|false gibt an ob Fenster in Bildschirmmitte zentriert wird.
 * Später vielleicht:
 *    @param props Dieser Parmeter ist optional, hier werden Fensterattribute als String
 *                 übergeben. z.B. width=800,height=600,left=200,top=200
 *
 * Die Fenster-Attribute werden im String Komma-separiert. Mögliche Attribute:
 *
 * dependent= yes|no
 * height= [Pixel]
 * hotkeys= yes|no
 * innerHeight= [Pixel]
 * innerWidth= [Pixel]
 * left= [Pixel]
 * location= yes|no
 * menubar= yes|no
 * resizable= yes|no
 * screenX= [Pixel]
 * screenY= [Pixel]
 * scrollbars= yes|no
 * status= yes|no
 * toolbar= yes|no
 * top= [Pixel]
 * width= [Pixel]
 *
 * TODO: Eventuell weitere Parameter zulassen (Breite, Höhe, ...)
 *
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function popupSelector(){
    var param = popupSelector.arguments;

    if(param.length<4) {alert("Error: popupSelector to few arguments.");return null;}
    if(param.length>5) {alert("Error: popupSelector to many arguments.");return null;}

    var url_str = param[0];
    var target_str = getFrameName(param[1]);
    var field_id = param[2];
    var centered = param[3]; //muss Parameter
    var props = param[4];

    /*
    info_str = "";
    for(i=0;i<param.length;i++)
        info_str+=param[i]+"\n";
    alert(info_str);
    */

    var height=250; // muss noch extrahiert werden
    var width=500;

    // BEISPIEL PROPS
    /* <props>left=%xpos%,top=%ypos%,innerWidth=500,innerHeight=500,width=500,height=500,resizable=yes,status=no</props> */
    var xpos=0;
    var ypos=0;
    if(props){
        /*
        var Aussage = "Wir wollen weisse Waesche waschen";
        var Ergebnis = Aussage.search(/weiss.+/);
        if(Ergebnis != -1)
              alert("gefunden");
        */
        var erg = props.match(/width=([0-9]+),/);
        if(!erg){
            alert("Falsche Angabe: kein width definiert!");
            return;
        }
        if (erg.length==2){
            width = erg[1];
        }
        erg = props.match(/height=([0-9]+),/);
        if(!erg){
            alert("Falsche Angabe: kein height definiert!");
            return;
        }
        if (erg.length==2){
            height = erg[1];
        }

        if(props.match(/left=([0-9]+),/)==null){
            xpos=(screen.width-width)/2;  //Fenster zentrieren
            props = props.replace(/%xpos%/,xpos);
        }
        if(props.match(/top=([0-9]+),/)==null){
            ypos=(screen.height-height)/2;
            props = props.replace(/%ypos%/,ypos);
        }
    }
    else {
        xpos=(screen.width-width)/2;  //Fenster zentrieren
        ypos=(screen.height-height)/2;
    }
    //props = parseAndModfiyProps(props); // for e.g. position=NE etc.

    //alert("width="+width+",height="+height+",left=220,top=220"+" Param.length = "+param.length);
    var myWindow = eval("top."+target_str);
    if(!myWindow) {
        if(props){
            myWindow=window.open(url_str+"?fieldid="+field_id,target_str,props);
        }
        else{
            if(centered) myWindow=window.open(url_str+"?fieldid="+field_id,target_str,'left='+xpos+',top='+ypos+', innerWidth='+width+',innerHeight='+height+',width='+width+',height='+height+',resizable=yes,status=no');
            else myWindow=window.open(url_str+"?fieldid="+field_id,target_str,'innerWidth='+width+',innerHeight='+height+',width='+width+',height='+height+',resizable=yes,status=no');
        }
        if(!checkPopupBlocker(myWindow))myWindow.focus();
    }
    else{
        if(!myWindow.closed) myWindow.focus();
        else {
            if(props){
                myWindow=window.open(url_str+"?fieldid="+field_id,target_str,props);
            }
            else {
                if(centered) myWindow=window.open(url_str+"?fieldid="+field_id,target_str,'left='+xpos+',top='+ypos+', innerWidth='+width+',innerHeight='+height+',width='+width+',height='+height+',resizable=yes,status=no');
                else myWindow=window.open(url_str+"?fieldid="+field_id,target_str,'innerWidth='+width+',innerHeight='+height+',width='+width+',height='+height+',resizable=yes,status=no');
            }
            checkPopupBlocker(myWindow);
        }
    }
}

/* cVFPTC() gehört zum popupSelector REALNAME = function copyValuesFromPopupToCaller
 *
 * Hier werden Feld-Werte aus einem Popup in Felder der Aufruferseite kopiert.
 *
 * @param [0]    Anzahl der Felder
 * @param [2n-1] Der Name des Feldes aus dem der Value herauskopiert wird
 * @param [2n]   Der Name des Feldes in dem der herauskopierte Value kopiert werden soll
 *
 */
function cVFPTC() {
    var param = cVFPTC.arguments;
    //dispArgs("cVFPTC",param);
//    var txt ="";
//    for(i=0;i<param.length;i++) {
//        txt += "["+param[i]+"]";
//    }
//    alert("Parameter: "+txt);
//    eval("var fields = window.opener."+param[1]);
//    txt ="";
//    for(i=0;i<fields.length;i++) {
//        txt += "["+fields[i]+"]";
//    }
//    alert("Target fields: "+txt);
    var tupelNum = 0;
    if(param.length<3){alert("function cVFPTC called with wrong number of arguments!");return;}
    tupelNum = parseInt(param[0]);

    //eval("var len ="+param[1].length);
    //alert("argArr.length = "+len);
    //eval("var x =window.opener."+param[1]);

    //alert("window.opener = "+window.opener.document);
    //dispArgs("argArr",window.opener.document.argArray);

    /* DEBUG
    msg="Ausgabe\n";
    for(pos=0;pos<param.length-2;pos++){
        eval("msg+= window.opener."+param[1]+"["+pos+"]"+'\n');
    }
    alert(msg);
    */

    for(pos=0;pos<param.length-2;pos++){
        //Parameter: 2n-1  =  source-field-name
        var obj1 = findField(param[pos+2]);
        if(obj1==null){alert("Field "+param[pos+2]+" not found");return;}
//        else alert("Found source Field="+obj1.name);
        //Parameter: 2n    =  destination-field-name (must be on opener)
        eval("var str = window.opener."+param[1]+"["+pos+"]");
        var obj2 = findFieldOnOpener(str);
        if(obj2==null){alert("Field "+str+" on opener not found");return;}
//        else alert("Found target Field="+obj2.name);
//        alert(window.opener.document.WebForm[obj2]);
        obj2.value=obj1.value;
    }
    self.close();
}

/* Gehört zum popupSelector.
 * Hier wird der Wert eines Feldes herausgesucht und mit anderen Werten zu
 * einer Komma-separierten Liste zusammengefasst. Jeder Wert kann dabei
 * mehrfach vorkommen! Diese Liste wird wieder in das Feld zurückgeschrieben.
 * Das Feld muß in dem Fenster sein das dieses Fenster geöffnet hat (opener)!
 *
 * @param [0] Die Komma-separierten Werte die hinzugefügt werden sollen.
 * @param [1] Der Name des Feldes, dessen Wert um die Werte aus param[0]
 *            erweitert werden soll.
 * @param [2] Der Name des Feldes, dessen Wert um die IDS aus param[0]
 *            erweitert werden soll.
 *
 * TODO: Eventuell erweitern, das jeder Wert nur einmal vorkommt.
 */
function setCaller() {
    //alert("setCaller() called");
    param = setCaller.arguments;
    //dispArgs("setCaller aufgerufen",param);
    var cresult, idresult;
    //sichern des alten wertes
    obj = findFieldOnOpener(param[1]);
    if (param.length==3) {
        obj2 = findFieldOnOpener(param[2]);
        param[2] = obj2.name;
    }
    if(obj==null) return;
    textf = obj.name;
    //alert("Feld_id = "+textf+"\nvalue = "+cresult);
    var ref = window.opener.keyMap[self.window.name];
    if(ref==null) ref=window.opener.document;
    else ref=findFrame(ref,self).document;
    cresult = ref.WebForm[textf].value;
    for ( var i=0; i<document.WebForm.elements.length; i++ ) {
        var citem = document.WebForm.elements[i];
        if (param.length>1 && param.length<4){    // => erlaubt 2 oder 3 Parameter
            //alert("0:"+param[0]+" | 1:"+textf+" | 2:"+param[2]+" ");
            pos = citem.name.indexOf(param[0]);
            if(pos!=-1){
                //alert("Itemname = "+citem.name+"\noptions.length = "+citem.options.length);
                for(var x=0;x<citem.options.length;x++){
                    if(citem.options[x].selected){
                        if (cresult && citem.multiple) cresult += ", ";
                        if (!citem.multiple) {cresult="";idresult="";}
                        if (param.length==3){
                            if (idresult && citem.multiple) idresult += ", ";
                            idresult+= citem.options[x].value;
                            cresult += citem.options[x].text;
                        }
                        else cresult += citem.options[x].value;
                    }
                }
            }
        }
    }
    //alert(cresult);
    //alert(idresult);
    ref.WebForm[textf].value = cresult;
    //alert("param.length="+param.length)
    if (param.length==3) {
        ref.WebForm[param[2]].value = idresult;
        //alert(param[1]+"_compare");
        var toDo = (param[1].indexOf('@')!=-1)?param[1].substring(param[1].indexOf('@')):param[1];
        //alert(toDo);
        hidden_comp = findFieldOnOpener(toDo+"_compare");
        // mjacob, 2003-02-07 12:01
        // verhindert einen Fehler, wenn es das Feld _compare nicht gibt
        if(hidden_comp) {
            //alert("found = "+hidden_comp)
            hidden_comp.value = cresult;
        }
    }
    self.close();
}

/**
 *  HOT-FIX für MAC
 *
 *  Bei double-click-event bitte diesen setCaller aufrufen!!!
 */
function setCaller2() {
    if(navigator.platform.toLowerCase().indexOf("mac")!=-1)return; //auf Mac funtioniert dieses feature nicht! Mac68k, MacPPC
    param = setCaller2.arguments;
    var callStr="";
    for(i=0;i<param.length;i++) callStr+="'"+param[i]+"',";
    callStr=callStr.substring(0,callStr.length-1);
    //alert("callStr="+callStr);
    eval("setCaller("+callStr+")");
}


/* Zum Einfügen als onKeyPress="if(checkEnter(event)) do..." in <input>
 * gedacht. Hierdurch reagiert das entsprechende <input> auf ein RETURN bzw.
 * ENTER.
 * Bsp.:
 <field type="text" name="react">
    <text>Hallo</text>
    <cmd type="script">
        <event>onKeyPress</event>
        <action>if(checkEnter(event)) alert('Hallo')</action>
    </cmd>
 </field>
 *
 * @param event Einfach nur an event "checkEnter(event)" reinschreiben!
 *
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function checkEnter(event){
    var code=0;
    if(is.nc4) code=event.which;
    else code=event.keyCode;
    return code == 13;
}

/**
 * Durchläuft alle Elemente der WebForm und vergleicht ob der Name des aktuellen
 * Elementes den übergebenen String enthält.
 *
 * @param fieldName Der Name der gesucht gesuchten Feldes
 * @returns field-object Erstes übereinstimmendes Feld
 *
 */
function findField(){
    var args = findField.arguments
    //dispArgs("findField aufgerufen",args); //debug
    var fieldName = args[0];
    var fields="";
    if(args.length>1 && args[1]!=null){
        if(args[1].name=="WebForm") fields=args[1].elements;
        else fields=args[1].WebForm.elements;
    }
    else {
        fields = self.document.WebForm.elements    ;
    }
        for(var i=0;i<fields.length;i++){
        var dpos = fields[i].name.indexOf('$');
        var fname = dpos!=-1?fields[i].name.substring(0,dpos):fields[i].name;//shortenup
        var index = fname.indexOf(fieldName) ;
        /* DEBUG
        if(index!=-1){
            alert("fields[i].name = "+fname+"  == fieldName ="+fieldName+" ?");
            alert("index = "+index+"   | fname.length ="+fname.length+" | fieldName.length = "+fieldName.length +" | fname.length-fieldName.length = "+(fname.length-fieldName.length));
        } */
        if(index!=-1 && fname.length-fieldName.length==index){
            return fields[i];
        }
    }
}
/**
 * Durchläuft alle Elemente der WebForm (vom Opener) und vergleicht ob der Name des aktuellen
 * Elementes den übergebenen String enthält.
 * (ACHTUNG: Funktion nur mit UNIQUE-Feldnamen verwenden)
 *
 * @param fieldName Der Name der gesucht gesuchten Feldes
 * @returns field-object Erstes übereinstimmendes Feld
 *
 */
function findFieldOnOpener(fieldName){
    var fields = "";
    //alert("self.window.name = "+self.window.name);//debug
    var refName = window.opener.keyMap[self.window.name];
    if(refName==null) {
        //alert("Opener name =  "+window.opener.name);//debug
        fields=window.opener.document.WebForm.elements;
    }
    else{
        //alert("found frame= "+findFrame(refName,self).name);//debug
        fields=findFrame(refName,self).document.WebForm.elements;
     }
    //var fields=window.opener.document.WebForm.elements; //alt
    for(var i=0;i<fields.length;i++){
        var pos =fields[i].name.indexOf(fieldName);
        if(pos!=-1){
            //alert("Name = "+fields[i].name+"\nName2 = "+fieldName+"\npos"+pos);
            var newPos = pos+fieldName.length;
            //alert("newPos="+newPos);
            //alert(fields[i].name.charAt(newPos));
            //alert("pos+fieldName.length = "+newPos+"\nfields[i].name.length = "+fields[i].name.length);
            if(newPos<fields[i].name.length){
                if(fields[i].name.charAt(newPos)=='$'){
                    //alert("1");
                    return fields[i];
                }
            }
            else {
                //alert("2");
                return fields[i];
            }
        }
        //alert(fields.length);
    }
}

/**
 * Sucht nach einem Feld aus der öffnenden Seite das den Substring 'fieldName' enthält und setzt dessen Wert auf den
 * mitgegebenen.
 * Nützlich für den popupSelector.
 * (Wegen der Feldnamenscodierung N61@group/field notwendig.)
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 *
 * DEPRECATED   Verschwindet bald, falls niemand meckert!
 *              LETZTE CHANCE ES WIEDERZUBELEBEN!
 */
function setValue(fieldName, fieldValue){
    var fields=opener.document.WebForm.elements;
    for(var i=0;i<fields.length;i++){
        if(fields[i].name.indexOf(fieldName)!=-1){
            fields[i].value=fieldValue;
            break;
        }
    }
    self.close();
}

/**
 * Diese function ermöglicht die Ausgabe von Umlauten in alert-boxen bzw. confirm ...
 * AUFRUF:
 *           z.B. confirm(translateText("ödelMödel ? äää ööö üüü ßßßß ÄÄÄÄ ÖÖÖ ÜÜÜ ... @")));
 *
 * @param TEXT Zeichenkette mit eventuellen Umlauten
 * @returns decodedString
 *
 */
function translateText(){
    //alert("translateText()");
    //alert("Browser = "+is.browser);
    args = translateText.arguments;
    if (args.length==0) return "function <translateText> called with no parameter";
    ret = args[0];
    if(ret.length<2) return ret;
    if(is.browser!="ie"){
        ret = ret.replace(/%C3%B6/gi,"ö");
        ret = ret.replace(/%C3%9F/gi,"ß");
        ret = ret.replace(/%C3%84/gi,"Ä");
        ret = ret.replace(/%C3%96/gi,"Ö");
        ret = ret.replace(/%C3%9C/gi,"Ü");
        ret = ret.replace(/%C3%A4/gi,"ä");
        ret = ret.replace(/%C3%BC/gi,"ü");
    }
    else {
        str="";
        for(i=0;i<ret.length;i++){
            //if(confirm("Zeichen:"+ret.charAt(i)+"Code: "+ret.charCodeAt(i))) break;
            if(ret.charCodeAt(i)==195) mode = true;
            else if(ret.charCodeAt(i)==182 && mode) {str+="ö";mode=false;}
            else if(ret.charCodeAt(i)==159 && mode) {str+="ß";mode=false;}
            else if(ret.charCodeAt(i)==132 && mode) {str+="Ä";mode=false;}
            else if(ret.charCodeAt(i)==150 && mode) {str+="Ö";mode=false;}
            else if(ret.charCodeAt(i)==156 && mode) {str+="Ü";mode=false;}
            else if(ret.charCodeAt(i)==164 && mode) {str+="ä";mode=false;}
            else if(ret.charCodeAt(i)==188 && mode) {str+="ü";mode=false;}
            else str+=ret.charAt(i);
        }
        return str;
    }

    return ret;
}

/**
 * Diese function ermöglicht die Ausgabe von Umlauten in alert-boxen bzw. confirm ...
 * diese Hilfsfunction wird aus der common.xsl (encode-cmd) aufgerufen
 *
 * @param TEXT Zeichenkette für confirm-text
 * @param JSFunction erzeugter submitcode
 *
 */
function confirmedSubmit(){
    //alert(confirmedSubmit.arguments[0]+"\n"+confirmedSubmit.arguments[1]);
    if(confirm(confirmedSubmit.arguments[0])){
        eval(unescape(confirmedSubmit.arguments[1]));
    }
}

/**
 * Diese function ermittelt den Framenamen aus dem top.window.name + 1.Argument
 * berücksichtigt auch ob ein popup verwendet wird.
 *
 * @param TEXT Zeichenkette für framename
 *
 */
function gT(){
    var ret="top.window.name";
    if(opener!=null && !opener.closed ) ret="opener."+ret;
    eval("ret="+ret+";");
    return ret==null?gT.arguments[0]:ret+gT.arguments[0];
}

/**
 * Diese Function loescht bei allen Feldern mit den uebergebenen
 * Namen den Inhaalt bzw. den 'value'.
 *
 * @param n Feldnamen, deren value zurueckzusetzen ist.
 */
function clearFields() {
      var params = clearFields.arguments;
      for( i = 0; i < params.length; i++ ) {
            //alert("Feldname = "+findField(params[i]).name, self.document);
            findField( params[i], self.document ).value = "";
        }
}

/**
 * Erleichtert die 'Location Bar' um die cmdid hinter dem 'cmd/'. Diese Methode
 * sollte natrürlich nur dann aufgerufen werden, wenn sicher ist, dass hierdurch
 * nicht die Anzeige zerstört wird.
 */
function clearCMDId() {
    if ( top == self ) {
        var url = top.location.href;
        if( (url.lastIndexOf("/")+1) != url.length ) {
            top.location.href = url.substring( 0, url.lastIndexOf("/")+1 );
        }
    }
}

/**
 * Diese function sorgt dafür, dass das nächste submit bzw. load nicht ausgeführt wird
 *
 */
function skipNextCMD(){skipNext=true;}

/**
 * Diese function Dumpt die Funktionsargument raus
 *
 * @param name Name der Funktion
 * @param args Array mit Argumenten
 *
 */
function dispArgs(name, args){
    if(args == null) {alert(name+" ist NULL !!!");return;}
    alert(name+" hat "+args.length+" Parameter.");
    msg="Folgende Parameter:";
    for(i=0;i<args.length;i++){
        if(args[i]!=null && args[i].toString() == '[object HTMLFormElement]') msg+="\narg_ "+i+" : "+args[i].name;
        else msg+="\narg "+i+" : "+args[i];
    }
    alert(msg);
}

/**
 * Diese function wird für die Paginierung gebraucht
 */
function gotoPage(){
    var args = gotoPage.arguments;
    number = args[0];wind = args[1];indexName = args[2];actualPage = args[3];lastPage = args[4];cmdid = args[5];
    var fieldname = args.length==7?args[6]:"dontuseit";
    var gotoPageNumber = 0;
    eval("gotoPageNumber=wind.document.WebForm.pagination_"+indexName+"_"+fieldname+".value;");
    if(!isNumber(gotoPageNumber)){
        eval("wind.document.WebForm.pagination_"+indexName+"_"+fieldname+".value="+actualPage+";");
        return;
    }
    if(number > 0) gotoPageNumber++;
    else if (number < 0) gotoPageNumber--;
    if(gotoPageNumber==actualPage){
        eval("wind.document.WebForm.pagination_"+indexName+"_"+fieldname+".value="+actualPage+";")
        return;
    }
    if(gotoPageNumber < 1) gotoPageNumber=1;
    if(gotoPageNumber > lastPage) gotoPageNumber=lastPage;
    eval("wind.document.WebForm.pagination_"+indexName+"_"+fieldname+".value=gotoPageNumber;");
    submitForm(cmdid+'?'+indexName+'='+gotoPageNumber,wind.name,wind.name,true,'');
}

/**
 * Diese Function wird für die Paginierung gebraucht.
 * Die Indize werden hier im DAU-Style von 1-n übergeben.
 *
 * @author <A href="mailto:gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function paginate(){
    var args = paginate.arguments;
    //dispArgs("Paginate: ", args);
    wind = args[0];       // Das FrameObject auf dem gearbeitet wird.
    cmdid = args[1];      // Die Aktion die Ausgelöst werden soll.
    indexName = args[2];  // Der Name des Feldes das den Wert übermitteln soll. Daraus ergibt sich auch
                          // 'dontuseit_xxx' in dem sich der Originalwert befindet.
    actualPage = args[3]; // Von hier aus soll geblättert werden.
    lastPage = args[4];   // So weit darf maximal geblättert werden.
    delta = args[5];      // So weit soll geblättert werden. (+/- n)
                          // Wenn dieser Wert == 0 ist, dann wird nach dem Feld 'dontuseit_{$indexName}' gesucht und
                          // dessen Wert verwendet.

    var gotoPageNumber = 0;

    if(delta==0 && args.length==7){   // Wenn DELTA==0 wird der Wert aus diesem Feld, aus arg[6], genommen.
        eval("gotoPageNumber=wind.document.WebForm."+args[6]+".value;");
        if(!isNumber(gotoPageNumber)){
            // Falls jemand Buchstaben etc. eingetragen haben sollte, dann wird der WWert zurückgesetzt.
            eval("wind.document.WebForm."+args[6]+".value="+actualPage+";");
            return;
        }
        else if(gotoPageNumber > lastPage || gotoPageNumber < 1){
            eval("wind.document.WebForm."+args[6]+".value="+actualPage+";");
            return;
        }

    }
    else gotoPageNumber=actualPage+delta;

    if(gotoPageNumber < 1) gotoPageNumber=1;
    else if(gotoPageNumber <= lastPage && gotoPageNumber != actualPage){
        eval("wind.document.WebForm."+indexName+".value="+gotoPageNumber+";");
        submitForm(cmdid,wind.name,wind.name,true,'');
    }
}

/**
 * Diese Function wird für die Paginierung gebraucht.
 * Die Werte der Felder sollen bei einer Änderung in das Originalfeld kopiert werden welches dann im Request auftaucht.
 *
 * @author <A href="mailto:gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function copyFieldValue(wind, obj, dest){
    // Um was für ein Feld handelt es sich? (Textfeld, Checkbox, Radio, SelectField)
    if(typeof(obj)=='string') obj=findField(obj, wind);
    var value=null;
    if(obj.options != null){
        // Dann ist es ein select-Field, also anderes Objekt für den Wert nehmen.
        value=obj.options[obj.selectedIndex].value;
        //alert("Kopiere SELECT-Wert: "+value);
    }
    else{
        value=obj.value;
        //alert("Kopiere STANDARD-Wert: "+value);
    }
    findField(dest, wind).value=value;
}

/**
 * Diese Function wird für die Paginierung und für die CheckBoxe's gebraucht.
 * Je nachdem ob die Checkbox selektiert ist oder nicht wird im 'dest'-Field einer der Werte gesetzt.
 *
 * @author <A href="mailto:gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function setCheckboxFieldValue(wind, obj, selectedValue, deselectedValue, dest){
    var value=null;
    if(obj == null) value=deselectedValue;
    else{
        if(obj.checked) value=selectedValue;
        else value=deselectedValue;
    }
    //alert("Setze CHECKBOX-Wert: "+value);
    findField(dest, wind).value=value;
}

function handledError() {
    var args = handledError.arguments;
    var errorMsg = args[0].toLowerCase();
    if(!(-1 != errorMsg.indexOf("focus") || -1 != errorMsg.indexOf("resizeto" ))) {
        if( errorMsg.indexOf("permission") == 0 ||
                errorMsg.indexOf("zugriff") == 0 ||
                errorMsg.indexOf("uncaught") == 0 ) {
            if(confirm("Seite ungueltig moechten Sie die Anwendung neu laden?\nInvalid status! Application restart?")){
                var jump =  self.location.href.substring(0,self.location.href.lastIndexOf('/')+1);
                //alert("jump ="+jump);
                win2=window.open(jump, 'Browserwindow');
                checkPopupBlocker(win2);
                self.window.close();
            }
            else self.window.close();
        }
    }
    return true;
}

function endsWith(toExam, ch){
    if(toExam==null ||  toExam=="") return false;
    return toExam.lastIndexOf(ch)==toExam.length-1;
}

/**
 * Entfernt Element aus einer Select-Box.
 *
 * @param selectElementName Name der gesuchter Select-Box
 *
 */
function removeObjectGroup(selectElementName) {
    var webForm = self.document.WebForm;
    var selectElement = findField(selectElementName, webForm);
    var selectedIndex = selectElement.selectedIndex;

    if(selectedIndex !=-1) {
        //Selektiertes Element merken
        var ogId = selectElement.options[selectedIndex].value;

        //Selektiertes Feld löschen
        for(i = 0; i < selectElement.length ; i++){
            if(i == selectedIndex) {
                selectElement.options[i]=null;
            }
        }
    }
}

