/**
 * $Id: common.js,v 1.57.2.2 2009/08/14 08:14:18 mmichelbrink Exp $
 *
 * Copyright © 2000-2006 picturesafe GmbH, Alle Rechte vorbehalten.
 * Copyright © 2000-2006 picturesafe GmbH. All rights reserved.
 * Copyright © 2000-2006 picturesafe GmbH, Tutti i diritti riservati.
 *
 * Diese JavaScript-Datei stellt Standardfunktionen ALLER Systeme zur
 * Verfuegung.
 *
 * @author Christian Kroeger
 */
var lastWindow = null;
var tmyWindow = null;
var keyMap = new Array();
var skipNext = false;
var refresh = false;
var frameless = false;
var debugInfo = false;
var requestMap = new Array();

// gibt an ob ein Frameset fertig geladen wurde.
var ready = false;

function getRefresh() {
    return refresh;
}

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

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
 *
 */
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.ie6 = (navigator.userAgent.indexOf('MSIE 6') > 0);
    this.mac = navigator.platform.toString().toLowerCase().indexOf('macppc') != -1;
    this.safari = navigator.appVersion.toString().toLowerCase().indexOf('safari') != -1;
    if (this.ie5) this.v = 5;
    this.min = (this.nc || this.ie);
}
is = new BrowserCheck();	// automatically create the "is" object


function getErrorTabIndex(source) {
    if (null == source) source = self.name;
    var page = (source == null || self.name == source ) ? self : findFrame(getFrameName(source), top);
    var doc = page.document;

    return doc.errorTabIndex;
}

function checkTabsBeforeSubmit(source, checked, currentTabIndex) {

    if (null == source) source = self.name;
    var page = (source == null || self.name == source ) ? self : findFrame(getFrameName(source), top);
    var doc = page.document;

    if (checked) {
        if (!checkTabFormBeforeSubmit(doc.WebForm, doc, currentTabIndex)) {
            return false;
        }
    }

    return true;
}

function checkTabChange(source, checked, currentTabIndex) {

    if (null == source) source = self.name;
    var page = (source == null || self.name == source ) ? self : findFrame(getFrameName(source), top);
    var doc = page.document;

    if (checked) {
        if (!checkFormWithTabs(doc.WebForm, doc, currentTabIndex)) {
            return false;
        }
    }

    return true;
}

/**
 * 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) {
    if (skipNext) {
        skipNext = false;
        return
    }
    //dispArgs("submitForm",submitForm.arguments);
    if (null == source) source = self.name;
    var page = (source == null || self.name == source ) ? self : findFrame(getFrameName(source), top);
    var doc = page.document;

    if (frameless == false) {
        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);
    }

    //alert("frameless = " + frameless + " | target = " + target + " | window.name = " + window.name);
    codeRunsInAPopup = window.name.toString().indexOf('popup_') == 0;
    targetIsAPopup = target.indexOf('popup_') == 0;
    if ((frameless == true && targetIsAPopup == false)) {
        if (codeRunsInAPopup) target = 'parent_' + target;
        //alert(close);
        if (debugInfo)alert("submitForm(): div-id='" + target + "' page='" + page.name + "' source='" + source + "'");
        loadAjax(action, target, 'post', close);
        close = false;
    }
    else {
        doc.WebForm.action = action;
        doc.WebForm.target = target;

        if (!(doc.isSingleForm && is.ie && doc.isEnterEvent )) {
            doc.WebForm.submit();
        }
    }
    doc.isEnterEvent = false;


    if (close == true && opener != null && (frameless && targetIsAPopup)) self.close();

    return;
}

function postToPopup(cmdaction, popupName, props) {
    if (skipNext) {
        skipNext = false;
        return
    }
    var params = postToPopup.arguments;
    //dispArgs("postToPopup",params);//debug
    // sanity
    if (params.length < 3 || params.length > 5) {
        alert("Error: postToPopup called with wrong number of arguments.");
        return null;
    }

    var doc = self.document;
    var form = doc.WebForm;
    popupName = getFrameName(popupName);
    //alert(props);

    if (4 < params.length) {
        var checked = params[4]; // feldüberprüfung j/n??
        if (checked) {
            if (!checkForm(doc.WebForm, doc)) {
                return;
            }
        }
    }

    if (5 == params.length && params[3].name == "WebForm") {
        form = params[3];
    }

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

    // try to get an existing Window.
    var myWindow = findFrame(popupName, top);
    //alert(props);
    if (!myWindow) {

        myWindow = window.open("../site/wait.jsp", popupName, props);

        if (!checkPopupBlocker(myWindow)) {
            form.action = cmdaction;
            form.target = popupName;
            form.submit();
            myWindow.focus();
        }
    }
    else {
        if (!myWindow.closed) myWindow.focus();
        else {
            myWindow = window.open("", popupName, props);
            if (!checkPopupBlocker(myWindow))submitForm(cmdaction, popupName, 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;
}

/* csspostloader by ckroeger */
function importCSS(url, media) {
    args = importCSS.arguments;
    if (args == null || args.length != 2) {
        alert('importCSS called with no args!');
        return;
    }
    links = document.getElementsByTagName("link");
    for (i = 0; i < links.length; i++) {
        if (links[i].href.match(url)) {
            return;
        }
    }
    var css = document.createElement('link');
    css.rel = 'stylesheet';
    css.href = url;
    css.type = 'text/css';
    css.media = media;
    document.getElementsByTagName('head')[0].appendChild(css);
}

function extractJS(html) {
    st = '[JS]';
    et = '[/JS]'
    var js = "";
    for (startpos = 0; startpos < html.length;) {
        posS = html.indexOf(st, startpos);
        if (posS == -1)break;
        posE = html.indexOf(et, posS);
        if (posE == -1) break;
        js += html.substring(posS + st.length, posE) + "\n";
        startpos = posE;
    }
    //alert("extractedJS = " + js);
    return js;
}

function modalDialog(layerName) {
    var overlay = 'modaloverlay';

    overlay = document.getElementById(overlay);
    modalLayer = document.getElementById(layerName);
    var modalDialog = 'modalLayer';
    insertLayer(modalDialog);
    modalDialog = document.getElementById(modalDialog);

    if (!modalLayer) {
        alert("Missing layer with name = " + layerName);
        return;
        s
    }

    width = modalLayer.style.width;
    height = modalLayer.style.height;

    if (width.indexOf('px') != -1) {
        width = parseInt(width.match(/([0-9]+)/));
        height = parseInt(height.match(/([0-9]+)/));
    }

    if (width > 0 || height > 0) {
        pos = getCenteredPos(width, height);
        if (width > 0) {
            modalDialog.style.width = width + "px";
            modalDialog.style.left = "0px";
        }
        if (height > 0) {
            modalDialog.style.height = height + "px";
            modalDialog.style.top = pos[0] + "px";
        }

    }
    else {
        modalDialog.style.top = "0px";
        modalDialog.style.left = "0px";
    }

    modalDialog.style.border = modalLayer.style.border;
    modalDialog.style.backgroundColor = modalLayer.style.backgroundColor;
    modalDialog.innerHTML = modalLayer.innerHTML;

    overlay.style.display = "block";
    modalDialog.style.display = "block";
}

function modalAjaxDialog(locUrl, width, height, formName) {
    var overlay = 'modaloverlay';
    var modalDialog = 'modalLayer';
    insertLayer(modalDialog);

    overlay = document.getElementById(overlay);
    modalDialog = document.getElementById(modalDialog);

    if (width && height) {
        pos = getCenteredPos(width, height);
        modalDialog.style.width = width + "px";
        modalDialog.style.height = height + "px";
        modalDialog.style.top = pos[0] + "px";
        modalDialog.style.left = pos[1] + "px";
    }
    else {
        modalDialog.style.top = "0px";
        modalDialog.style.left = "0px";
    }
    //    overlay.style.backgroundImage="../img/overlay_lines.gif";
    //    overlay.style.backgroundRepeat="repeat";

    overlay.style.display = "block";

    if (formName) {
        loadAjax(locUrl, modalDialog.id, 'post', false, formName);
    }
    else {
        loadAjax(locUrl, modalDialog.id);
    }
    modalDialog.style.display = "block";
}

function hideModalAjaxDialog() {
    var overlay = 'modaloverlay';
    var modalDialog = 'modalLayer';

    overlay = document.getElementById(overlay);
    modalDialog = document.getElementById(modalDialog);
    overlay.style.display = "none";
    modalDialog.style.display = "none";
}

function saveForm(formName) {
    var form = $(formName);
    if (form == null) {
        alert('http-form with name = ' + formName + ' not found.');
    }
    var locUrl = form.action;
    if (locUrl.indexOf('?') == -1) locUrl += "?action=save"
    else locUrl += "&action=save"
    var myAjax = new Ajax.Request(locUrl, {parameters : Form.serialize(formName)});
}

function getWindowBounds() {
    var windowWidth, windowHeight;
    if (self.innerHeight) {    // all except Explorer
        windowWidth = self.innerWidth;
        windowHeight = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    } else if (document.body) { // other Explorers
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }
    //alert("windowWidth = " + windowWidth + "\nwindowHeight = " + windowHeight);
    var ret = new Array(2);
    ret[0] = windowWidth;
    ret[1] = winHeight;
    return ret;
}
function insertLayer(layerName) {

    var objBody = document.getElementsByTagName("body").item(0);
    if (objBody == null)return;

    if (document.getElementById(layerName) == null) {



        // create overlay div
        var objOverlay = document.createElement("div");
        objOverlay.setAttribute('id', layerName);
        objOverlay.style.display = 'none';
        objOverlay.style.position = 'absolute';
        objOverlay.style.top = '0';
        objOverlay.style.left = '0';
        objOverlay.style.zIndex = '9000';
        objOverlay.style.width = '100%';
        objOverlay.style.height = '100%';
        objBody.insertBefore(objOverlay, objBody.firstChild);
    }
}

function loadAjax(locUrl, blockId, method, closeAfterCall, formName) {
    if (!formName) {
        formName = "WebForm";
    }
    if (!method) {
        //alert("missing request-method!");
        method = "get";
    }

    //    alert("URL: " + locUrl + " | blockId = " + blockId);

    if (blockId == null) blockId = "AnOnYmOuS";
    var parPos = blockId.indexOf('parent_');
    var submitToParent = parPos == 0;
    var parStr = "$('" + blockId + "')";
    if (submitToParent) {
        blockId = blockId.substring(7);
        parStr = "top.opener.document.getElementById('" + blockId + "')";
    }
    var ts = blockId == 'transfer' ? "true" : "false";
    if (blockId == 'help')ts = "true";
    //    else ts="false";
    var code = "var " + blockId + " = (\
        function(response){\
            if(blockId=='AnOnYmOuS')return;\
            if(requestMap['" + blockId + "']!=\"" + locUrl + "\")return;\
            var html = response.responseText.toString();\
            /* alert($('" + blockId + "').innerHTML);*/\
            if(html.indexOf('<html')!=-1) {\
                /*alert('timeout???');*/\
                /*var mW=window.open('','log_window','top=0,left=0,innerWidth=800,innerHeight=600,width=800,height=600,resizable=yes,scrollbars=yes');\
                mW.document.open();\
                mW.document.write('<html><body><textarea cols=120 rows=40>' + html  + '</textarea></body></html>');\
                mW.document.close(); */\
                var l=top.location.toString();\
                if(l.charAt(l.length-1)=='#')l=l.substring(0, l.length-1);\
                /* alert(l.charAt(l.length-1)+'\\n'+l + '\\n' + l.substring(0, l.length-1));*/\
                if(l.indexOf('?')==-1)top.location=l+'?ckr=timeout';\
                else if(l.indexOf('ckr=timeout')==-1)top.location=l+'&ckr=timeout';\
                return;\
            }\
            /*if(" + ts + ")alert('response = ' + html);*/\
            if('reloadall'=='" + blockId + "') self.location.reload();\
            else {\
                var jsCode = extractJS(html);\
                /*alert('extracted JS:' + jsCode);*/\
                var block=" + parStr + ";\
                if(block){\
                    /*alert('HTML of ' + block.id + '-' + html);*/\
                    /*alert('1=' + block.innerHTML);*/\
                    block.innerHTML = html;\
                    /*alert('2=' + block.innerHTML);*/\
                    if(jsCode)eval(jsCode);\
                }\
                else alert('Block with id = " + blockId + " not found!');\
                initLightbox();\
                if(closeAfterCall)self.close();\
            }\
        }\
    );";

    //if(submitToParent){
    //    alert(code);
    //}
    eval(code);
    requestMap[blockId] = locUrl;
    if (locUrl.toString().indexOf('?') == -1)locUrl += "?blockId=" + blockId;
    else locUrl += "&blockId=" + blockId;

    // cache kill releaser
    var d = new Date();
    if (locUrl.indexOf('?') > 0)locUrl += "&ckr=" + d.getTime();
    else locUrl += "?ckr=" + d.getTime();

    //alert("method = " + method + "\nblockId = " + blockId);

    if ("get" == method) eval("var myAjax = new Ajax.Request (locUrl,{method: '" + method + "',onSuccess:" + blockId + "});");
    else eval("var myAjax = new Ajax.Request (locUrl,{parameters : Form.serialize('" + formName + "'),onSuccess:" + blockId + "});");
}

/**
 * Läd einen Frame.
 *
 * action, framename, width, height
 */
function load() {
    if (skipNext) {
        skipNext = false;
        return
    }

    //dispArgs("load", load.arguments);
    /*
     dispArgs("load", load.arguments);
     a = confirm("show source?");
     if(a) {
     source = window.document.getElementsByTagName("html")[0].innerHTML.toString();
     html="<html><body><textarea wrap=\"physical\" cols=\"91\" rows=\"20\">"+source+"</textarea></body></html>";
     var mW=window.open("","error_window",'top=0,left=0,innerWidth=800,innerHeight=600,width=800,height=600,resizable=yes,scrollbars=yes');
     mW.document.open();
     mW.document.write(html);
     mW.document.close();
     mW.focus();
     return;
     //javascript:alert(window.document.getElementsByTagName("html")[0].innerHTML);
     }
     */

    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 + "\n" + window.location.href.toString());
    var cmdStr = "/cmd/"
    var portal = "/portal";
    var backoffice = "/backoffice";
    var loc = window.location.href.toString();
    if (loc.indexOf(cmdStr) < 0) {
        if (loc.indexOf(portal) > 0) {
            action = loc.substring(0, loc.indexOf(portal) + portal.length) + cmdStr + action;
        }
        else if (loc.indexOf(backoffice) > 0) {
            action = loc.substring(0, loc.indexOf(backoffice) + backoffice.length) + cmdStr + action;
        }
        else alert("unknown portal url in url = " + loc + "!");
        //alert("action = "+action + "\n" + window.location.href.toString());
    }

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

    //alert("id = " + frames[1] + "\nframeless = " + frameless + "  |  starts with '_' = " + (frames[1].indexOf('_')==0)  + "  |  starts with 'popup_' = " + (frames[1].indexOf('popup_')==0) );
    if (frameless && (frames[1].indexOf('_') != 0 && frames[1].indexOf('popup_') != 0)) {
        if (debugInfo)alert("load(): div-id='" + frames[1] + "'");
        loadAjax(action, frames[1]);
    }
    else {
        //if(page.location.href.toString().endWidth()
        //alert("action = "+action);
        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

        if (action != '') {
            // cache kill releaser
            var d = new Date();
            if (action.indexOf('?') > 0)action += "&ckr=" + d.getTime();
            else action += "?ckr=" + d.getTime();
        }

        if (null != page) {
            if (frames.length == 4) {
                if (page.screen && page.screen.height != height) {
                    page.resizeTo(widthOrProps, height);
                }
            }
            page.location.href = action;
            page.focus();
        } 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:
    // Wenn unsere HP von einem anderen Fenster geöffnet wird, dann sollte es 'Browserwindow' heiÃŸen. IE hat dann
    // Probleme das TOP danach umzubenennen. Deswegen holen wir uns den Prefix auch so...
    if (top.name == "_unspecifiedFrame" || top.name == "Browserwindow") {
        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();
    return;
}

function findFrame(name, win, exists) {

    if ("_blank" == name) {
        newWin = self.open("", "adamWindow", "width=100,height=100,resizable=yes,scrollbars=yes");
        checkPopupBlocker(newWin);
        newWin.opener = null;
        return newWin;
    }

    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 );

    // Damit auch die "alte" Version ohne winName davor noch funktioniert,
    // wird zumindest in Audi und Fotothek noch benötigt -- mjacob 2004-11-03
    if (name == win.name || ( winName + name ) == win.name) {
        return win;
    }
    else if (0 == name.indexOf('_', 0)) {
        // standard Fensternahme abfangen
        return eval(name.substring(1));
    }

    var frm = null;
    var i = 0;

    if (win.frames) {
        for (i = 0; i < win.frames.length; i++) {
            //alert(win.frames[i].name+"\n"+name);
            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) {
            str = "win.opener";
            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;
    return top != self;
}

/**
 * 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;
    setFirst = true;
    if (docWeb == null) return;

    if (docWeb.elements && (element = docWeb).elements.length > 0) {
        for (i = 0; i < element.elements.length; i++) {
            if (forceFocus(element.elements[i].name)) {
                element.elements[i].focus();
                setFirst = false;
                break;
            }
        }
        if (setFirst) {
            for (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');
    var ret = re.exec(toBeExtracted);
    if (ret) {
        return true;
    }
    return false;
}


/**
 * 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;
    element = a[0];
    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, false)) return false;
        }
    }
    return true;
}

function checkTabFormBeforeSubmit(field, doc, currentTabIndex) {
    //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);
            }

            // Falls Formular auf DHTML-Tabs sitzt
            var tabIndex = "";
            if (doc.tabIndex != null) {
                tabIndex = doc.tabIndex["tabindex_" + fieldid];
                doc.errorTabIndex = tabIndex;
            }

            if (!checkDispatcher(field.elements[i], fieldid, field, doc, true)) {
                //alert('Setting errorTabIndex to ' + tabIndex + '[' + fieldid + '] doc.errorTabIndex=' + doc.errorTabIndex);
                return false;
            }
        }
    }
    return true;
}

function checkFormWithTabs(field, doc, currentTabIndex) {
    //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);
            }
            var tabIndex = "";
            if (doc.tabIndex != null) {
                tabIndex = doc.tabIndex["tabindex_" + fieldid];
                if (tabIndex != null && currentTabIndex == tabIndex) {
                    if (!checkDispatcher(field.elements[i], fieldid, field, doc, false)) return false;
                }
            } else {
                if (!checkDispatcher(field.elements[i], fieldid, field, doc, false)) return false;
            }

        }
    }
    return true;
}

function getFieldByName(searchName, fieldToExamine) {
    var value = "";
    for (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, quietMode) {

    var cardinal = returnCardinal(element.name);
    var type = returnType(element.name);
    var refName = "";
    var ausg = "";
    var message = "";
    //        alert("doc.errorText = "+doc.errorText + " - searching for error_"+id);
    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.toLowerCase() == "checkbox") {
            if (element.checked != true) return badEntry(element, ausg, quietMode);
        }
        if (element.type == "select-one" && element.value == "-1") {
            return badEntry(element, ausg, quietMode);
        }
        else if (element.type == "select-multiple") {
            if (element.length == 0 | (element.length == 1 && element[0].value == "-1")) {
                return badEntry(element, ausg, quietMode);
            }
        }
        else if (!checkNull(element.value)) {
            return badEntry(element, ausg, quietMode);
        }
    }
    else {
        if (refName != "") {
            // den Feldinhalt des referenzierten Feld suchen
            desField = getFieldByName(refName, field);
            toCompare = desField.value;
            //alert(toCompare+"="+element.value);
            if (toCompare != element.value) {
                return badEntry(element, ausg, quietMode);
            }
        }

        // 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, quietMode);
        }
    }

    /* 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)) {
            //alert("type="+type+", lowerStr="+getLower(type)+" upperStr="+getUpper(type));
            var lower = parseInt(getLower(type));
            var upper = parseInt(getUpper(type));
            //alert( "Lower="+lower+", Upper="+upper );
            if (!numberInRange(element.value, lower, upper)) {
                return badEntry(element, ausg, quietMode);
            }
        }
        else {
            return badEntry(element, ausg, quietMode);
        }
    }

    /* 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, quietMode);
        }
        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, quietMode);
            }
        }
    }


    /*
     * Bit-Wert als normale Zahl kodiert. Felder vom Type 'bit'
     */
    if (type == "bit" && !isValidBit(element.value) && cardinal == "required") {
        return badEntry(element, ausg, quietMode);
    }

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

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

    // 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, quietMode);
        }
    }

    // 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, quietMode);
        }
    }

    if (type.indexOf("checkVTString") != -1) {
        strE = element.value;
        if (isValidVTString(strE) == false) {
            return badEntry(element, ausg, quietMode);
        }
    }

    // gueltig mit regulärer Ausdruck?!
    // regExp|<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, quietMode);
        }
    }


    // 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, quietMode);
        }
    }

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

    return true;
}

function countChar(str, c) {
    count = 0;
    for (i = 0; i < str.length; i++) {
        if (str.charAt(i) == c) count++;
    }
    return count;
}

function isValidVTString(str) {
    lenE = str.length;
    if (
            str.indexOf('*') == 0 || // beginnt mit *
            ( lenE - countChar(str, '*') ) < 3 // mindestens 3 signifikante Zeichen
            ) {
        return false;
    }
    return true;
}

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


function badEntry(element, ausg, quietMode) {
    if (quietMode == false) {
        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);
    return str.substring(pos1, pos2);
}

/* Gibt obere Grenze wieder */
function getUpper(str) {
    pos1 = str.indexOf("|") + 1;
    pos2 = str.indexOf("|", pos1) + 1;
    if (-1 == pos2)
        return str.substring(pos1);
    else
        return str.substring(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;
    }

    if (len < 2) {
        //alert("Hostname fehlt!");
        return false;
    }

    // wenn bisher nix geknallt hat dann ist die adresse okay
    return true;
}

/* Testen ob String eine Zahl ist */
function isNumber(str) {
    if (typeof str == 'undefined') return false;
    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++) {
        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;
    }

    var copy = str;
    if (copy.indexOf('-') == 0) copy = copy.substr(1);
    for (var i = 0; i < copy.length; i++) {
        actChar = copy.charAt(i);
        if (actChar < "0" || actChar > "9") {
            if (actChar == '.' || actChar == ',') continue;
            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);
}


/** Testet ob wir ein validen Bit-Wert haben. Alles groesser -1.
 *  true wenn der Wert eine Nummer ist und groesser -1 ist.
 */
function isValidBit(str) {
    return ( isNumber(str) && 0 != str.indexOf('-') );
}


/**
 * 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 (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) {
    if (isNumber(str) && (str.length == 5) && numberInRange(str, 1000, 99999)) {
        return true;
    }
    else return false;
}

/* from outer space (space test)
 * true  - wenn etwas ausser space in dem String steht.
 * false - wenn nur spaces in dem String steht.
 */
function spaceOnly(inp) {
    for (var i = 0; i < inp.length; i++) {
        if (inp.charAt(i) != " ") {
            return true;
        }
    }
    return false;
}

/* Testen ob feld leer 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);
    if (date == 0) {
        return false;
    }
    return true;
}


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 ? true : false;
        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;
}


// lokale Registrierung eines Preview-Popup-Windows
var previewPopupWindow = null;

/**
 * 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>
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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) {

            // vorhergehendes Preview-Popup schliessen, falls verfuegbar
            if (null != name && name == "popup_vorschau") {
                if (null != previewPopupWindow) {
                    previewPopupWindow.close();
                }
            }

            // Preview-Popup oeffnen
            myWindow = window.open(target, name, props);

            // Preview-Popup registrieren
            if (null != name && name == "popup_vorschau") {
                previewPopupWindow = myWindow;
            }

            if (!checkPopupBlocker(myWindow)) {
                // Focus setzen (unabhängig von Props)
                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.
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
function parseAndModfiyProps(props) {
    var modifiedStr = "";
    //	alert("props="+props);
    //	alert("Klasse="+ typeof props);
    if (typeof(props) != "string") {
        props = props.toString();
    }
    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) {
    myWindow = window.open(target, getFrameName('contexthelp'), 'screenX=50,left=50,screenY=50,top=50,scrollbars=1,resizable=yes,toolbar=0,location=0,directories=0,status=0,fullscreen=0,width=725,height=500,innerHeight=500,innerWidth=725');
    checkPopupBlocker(myWindow);
}

/**
 * W&auuml;hlt alle checkboxen einer Seite aus.
 */
function checkAll(name) {
    var el = findFrame(getFrameName(name), top).document.WebForm.elements;
    for (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 (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 ckroeger [AT) picturesafe. de >Christian Kröger<
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function popupSelector() {

    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;
    }

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

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

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

    // BEISPIEL PROPS
    /* <props>left=%xpos%,top=%ypos%,innerWidth=500,innerHeight=500,width=500,height=500,resizable=yes,status=no</props> */
    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 == true)
                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 == true)
                    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
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */

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.
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function setCaller() {
    //alert("setCaller() called");
    param = setCaller.arguments;
    //dispArgs("setCaller aufgerufen",param);
    var cresult, idresult = "";
    //sichern des alten wertes
    obj = findFieldOnOpener(param[1]);

    var multi = true;
    if (param.length == 3) {

        obj2 = findFieldOnOpener(param[2]);
        param[2] = obj2.name;
    }
    if (obj == null) return;
    textf = obj.name;
    //alert("Feld_id = "+textf);
    var ref = window.opener.keyMap[self.window.name];
    if (ref == null) ref = window.opener.document;
    else ref = findFrame(ref, self).document;

    if (ref.WebForm[textf].options) {
        //alert("Selectbox-Mode");
        // Wir befüllen also eine Selectbox...
        sourceField = findField(param[0], window.self); //ähnlichkeitssuche vorsicht!
        //alert("SourceField= = "+sourceField.name);
        //cal(xtime,'2x Suchen:');
        countSource = sourceField.options.length;
        //alert("Counts Source: "+countSource);

        arr = new Array();
        pos = 0;
        var arrToSet = "";

        /* kopieren der ausgew. Inhalte zum Ziel */
        //xtime = new Date();
        for (x = 0; x < countSource; x++) {
            //if((x % 100)==0) alert("Looping through source: "+x);
            if (sourceField.options[x].selected) {
                //alert("Adding selected: "+sourceField.options[x].text+" "+sourceField.options[x].value);
                arrToSet = arrToSet + "\\" + replaceChar(sourceField.options[x].text, "\\", "\\\\") + "\\" + replaceChar(sourceField.options[x].value, "\\", "\\\\");
            }
            else {
                arr[pos++] = new Option(sourceField.options[x].text, sourceField.options[x].value);
            }
        }

        //alert("Going to call setSelectboxOptions with: "+arrToSet);
        opener.setSelectboxOptions(textf, arrToSet);


        /* löschen der ausgew. Inhalte aus Quelle
         if(doIt){
         //alert("löschen ");
         //xtime = new Date();
         for(x=countSource;x>=0;x--){
         if(x<arr.length){
         eval("sourceField.options[x]=new Option(\""+arr[x].text+"\", \""+arr[x].value+"\")");
         }
         else {
         eval("sourceField.options[x]=null");
         }
         }
         //cal(xtime,'löschen der Inhalte:');
         }
         */
        /* Ãœberprüfen ob eine der beiden Boxen jetzt leer ist. Wenn ja einen leeren Eintrag einfügen*/
        if (sourceField.length == 0) {
            sourceField.options[0] = new Option('', -1);
        }
    }
    else {
        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 && multi) cresult += "\n";
                            if (!multi) {
                                cresult = "";
                                idresult = "";
                            }
                            if (param.length == 3) {
                                if (idresult && multi) 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();
    }
}

function setSelectboxOptions() {
    //alert("setSelectboxOptions() called");
    var param = setSelectboxOptions.arguments;
    //dispArgs("setSelectboxOptions(..) aufgerufen",param);
    if (self.window.document.WebForm[param[0]].options) {
        // Wir befüllen also eine Selectbox...
        targetField = self.window.document.WebForm[param[0]];
        countTarget = targetField.options.length;
        //alert("Counts Target: "+countTarget);
        /* Ãœberprüfen ob in der Ziel-Box nur ein leerer Eintrag ist. Wenn ja diesen entfernen */
        if (1 == countTarget && (-1 == targetField.options[0].value)) {
            targetField.options[0] = null;
            countTarget = 0;
        }
        var arrToSet = param[1];  //"|text|value|text|value"
        var pos = 1;  // Erstes Zeichen ignorieren, muss laut Definition ein Trennzeichen sein.
        var nextEnd = 1;
        do{
            nextEnd = getNextTokenEndPos(arrToSet, pos, "\\");
            if (nextEnd > pos) {
                var txt = replaceChar(arrToSet.substring(pos, nextEnd), "\\\\", "\\");
                var val;
                pos = nextEnd + 1;
                nextEnd = getNextTokenEndPos(arrToSet, pos, "\\");
                if (nextEnd == -1) val = arrToSet.substring(pos);
                else val = arrToSet.substring(pos, nextEnd);
                val = replaceChar(val, "\\\\", "\\");
                pos = nextEnd + 1;
                //alert("text: "+txt);
                //alert("value: "+val);
                eval("targetField.options[countTarget++]=new Option(\"" + txt + "\", \"" + val + "\")");
            }
        } while (nextEnd != -1);

        /* Ãœberprüfen ob eine der beiden Boxen jetzt leer ist. Wenn ja einen leeren Eintrag einfügen*/
        if (targetField.length == 0) {
            targetField.options[0] = new Option('', -1);
        }
    }
    else alert("Warning: setSelectboxOptions(..) called for a non selectbox field.");
}

/**
 * Liefert die Position des nächsten Zeichens 'cha' ab 'pos' des Strings 'str'.
 * Doppeltes auftreten von 'cha' wird ignoriert.
 * Liefert -1, wenn nichts gefunden wurde.
 */
function getNextTokenEndPos(str, pos, cha) {
    if (pos < str.length) {
        var p = pos;
        while (true) {
            p = str.indexOf(cha, p);
            if (p == -1) return -1;
            p2 = p + 1;
            if (p2 < str.length && str.charAt(p2) == cha) p = p2 + 1;
            else return p;
        }
    }
    else alert("[getNextToken()] pos out of range.");
}

function removeSelectEntry() {
    var sourceField = findField(removeSelectEntry.arguments[0]); //ähnlichkeitssuche vorsicht!
    //alert("SourceField= = "+sourceField.name);
    var countSource = sourceField.options.length;
    var arr = new Array();
    var pos = 0;
    for (x = 0; x < countSource; x++) {
        if (sourceField.options[x].selected) ;
        else arr[pos++] = new Option(sourceField.options[x].text, sourceField.options[x].value);
    }
    for (x = countSource; x >= 0; x--) {
        if (x < arr.length) eval("sourceField.options[x]=new Option(\"" + arr[x].text + "\", \"" + arr[x].value + "\")");
        else eval("sourceField.options[x]=null");
    }
    if (sourceField.length == 0) {
        sourceField.options[0] = new Option('', -1);
    }
}

/**
 *  HOT-FIX für MAC
 *
 *  Bei double-click-event bitte diesen setCaller aufrufen!!!
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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;
    if (code == 13) return true;
    else return false;
}

function getField(name) {
    fields = self.document.WebForm.elements;
    for (var i = 0; i < fields.length; i++) {
        var fname = fields[i].name;//shortenup
        if (fname == name)return fields[i];
    }

}
/**
 * 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
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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];
            break;
        }
    }
}
/**
 * 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
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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];
                    break;
                }
            }
            else {
                //alert("2");
                return fields[i];
                break;
            }
        }
        //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();
}

/**
 * Clonen von Objecten
 */
Object.prototype.clone =
function clone(deep) {
    var objectClone = new this.constructor();
    for (var property in this)
        if (!deep)
            objectClone[property] = this[property];
        else if (typeof this[property] == 'object')
            objectClone[property] = this[property].clone(deep);
        else
            objectClone[property] = this[property];
    return objectClone;
}

/**
 * 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
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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 == true) {
                str += "ö";
                mode = false;
            }
            else if (ret.charCodeAt(i) == 159 && mode == true) {
                str += "ß";
                mode = false;
            }
            else if (ret.charCodeAt(i) == 132 && mode == true) {
                str += "Ä";
                mode = false;
            }
            else if (ret.charCodeAt(i) == 150 && mode == true) {
                str += "Ö";
                mode = false;
            }
            else if (ret.charCodeAt(i) == 156 && mode == true) {
                str += "Ü";
                mode = false;
            }
            else if (ret.charCodeAt(i) == 164 && mode == true) {
                str += "ä";
                mode = false;
            }
            else if (ret.charCodeAt(i) == 188 && mode == true) {
                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
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
function confirmedSubmit() {
    //alert(confirmedSubmit.arguments[0]+"\n"+confirmedSubmit.arguments[1]);
    if (confirm(confirmedSubmit.arguments[0])) {
        eval(unescape(confirmedSubmit.arguments[1]));
    }
}

/**
 * Diese function ermöglicht die zeitversetzte ausfürung von commandos.
 *
 * @param JSFunction erzeugter submitcode
 *
 * @author <A href="mailto:ehirsch@picturesafe.de">Eike Hirsch</A>
 */
/*
 function wait(){
 alert(wait.arguments[0]);
 setTimeout("eval(wait.arguments[0])", wait.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
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
function skipNextCMD() {
    skipNext = true;
}

/**
 * Diese function Dumpt die Funktionsargument raus
 *
 * @param name Name der Funktion
 * @param args Array mit Argumenten
 *
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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.
    checked = true;       // soll das Formular gecheckt werden.

    var gotoPageNumber = 0;


    if (delta == 0 && args.length >= 7) {   // Wenn DELTA==0 wird der Wert aus diesem Feld, aus arg[6], genommen.
        field = getField(args[6]);
        if (field == null) {
            var count = 1;
            while (true) {
                afield = getField(args[6] + (count++));
                if (afield == null) break; //kein feld gefunden
                num = afield.value;
                if (!isNumber(num)) continue;
                if (num != actualPage) { //veraenderung gefunden
                    field = afield;
                    break;
                }
            }
        }
        if (field == null) return;
        gotoPageNumber = field.value;
        if (!isNumber(gotoPageNumber)) {
            // Falls jemand Buchstaben etc. eingetragen haben sollte, dann wird der Wert zurückgesetzt.
            field.value = actualPage;
            return;
        }
        else if (gotoPageNumber > lastPage || gotoPageNumber < 1) {
            field.value = actualPage;
            return;
        }

    }
    else gotoPageNumber = actualPage + delta;

    // checked kann an achter oder siebter Stelle stehen.
    if (0 == "false".indexOf(args[7]) || 0 == "false".indexOf(args[6])) {
        checked = false;
    }

    layerName = null;
    // layerName kann an achter oder neunter Stelle stehen.
    if (0 == "false".indexOf(args[7])) {
        layerName = args[8];  // Ajax-call in layer mit dem namen von args[8]
    }
    else {
        layerName = args[7];  // Ajax-call in layer mit dem namen von args[7]
    }

    if (gotoPageNumber < 1) gotoPageNumber = 1;
    else if (gotoPageNumber <= lastPage && gotoPageNumber != actualPage) {
        //alert("indexName = " + indexName);
        field = findField(indexName);
        //alert("field.name = " + field.name );
        field.value = gotoPageNumber;
        //alert('gotoPageNumber = '+gotoPageNumber);
        if (layerName) {
            //alert("displaying in layer = "+ layerName);
            if (!frameless) {
                frameless = true;
                submitForm(cmdid, layerName, wind.name, checked, '');
                frameless = false;
            }
            else {
                submitForm(cmdid, layerName, wind.name, checked, '');
            }
        }
        else if (frameless == true) submitForm(cmdid, 'content', wind.name, checked, '');
        else submitForm(cmdid, self.name, wind.name, checked, '');
    }
    //alert('gotoPageNumber = '+gotoPageNumber + "\n lastPage = " + lastPage + "\n actualPage= "+actualPage);
}

/**
 * Diese Function wird für die Paginierung gebraucht.
 * Die Werte der Felder sollen bei einer aenderung in das Originalfeld kopiert werden welches dann im Request auftaucht.
 *
 * @author <A href="mailto:gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 *
 * z.B. copyFieldValue(self.document, this, 'N100FD_@search/sort')
 */
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>
 * @author ckroeger [AT) picturesafe. de >Christian Kröger<
 */
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 dispHashMap(hm) {
    txt = "";
    i = 0;
    for (var key in hm) {
        if (key != "clone")txt += "pos " + (i++) + " key = " + key + " value = " + hm[key] + "\n";
    }
    if (txt != "")alert("ausgabe mit for-in:\n" + txt);
}

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

function onEnter() {
    self.document.isEnterEvent = true;
}

function initOnEnter() {
    /*alert('initOnEnter called');*/
    if (self.document.layers)
        document.captureEvents(Event.KEYDOWN);
    document.onkeydown = keyDown;
    noEnter = false;
}
function releaseOnEnter() {
    /*alert('releaseOnEnter called');*/
    noEnter = true;
}

function getNamedKey(k) {
    if (typeof KeyEvent == "undefined") {
        return '';
    } else {
        for (key in KeyEvent) {
            if (KeyEvent[key] == k)
                return key.substr("DOM_VK_".length)
        }
    }
}

var registeredKeyHandlers = new Array();

function registerKeyHandler(fName) {
    registeredKeyHandlers[fName] = null;
    if (registeredKeyHandlers.indexOf(fName) == -1) {
        registeredKeyHandlers.push(fName);
        //alert(fName+" added.");
    }
}

function decodeKey(evt) {
    var e = evt || window.event;
    var ch = '';
    var code;
    if (document.layers) {
        if (e.which > 0) {
            ch = String.fromCharCode(e.which);
            code = e.which;
        }
    } else if (document.all) {
        if (e.keyCode > 0) {
            ch = String.fromCharCode(e.keyCode);
            code = e.keyCode;
        }
    } else if (document.getElementById) {
        if (e.which > 0) {
            ch = String.fromCharCode(e.which);
            code = e.which;
        }
        if (e.keyCode > 0) {
            ch = getNamedKey(e.keyCode);
            code = e.keyCode;
        }
    }
    return [code, e, ch];
}

function keyDown(evt) {
    var keys = decodeKey(evt);
    if (keys[0] == 13) {
        if (noEnter == false) {
            if (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 4)onEnter();
            else {
                if (self.document.WebForm != null) {
                    onEnter(evt);
                }
            }
        }
    }
    if (is.safari && keys[1].altKey) {
        switch (keys[1].charCode) {
            case  161: ch = '1'; break;
            case 8220: ch = '2'; break;
            case  182: ch = '3'; break;
            case  162: ch = '4'; break;
            case   91: ch = '5'; break;
            case   93: ch = '6'; break;
            case  124: ch = '7'; break;
            case  123: ch = '8'; break;
            case  125: ch = '9'; break;
            case 8800: ch = '0'; break;
            default:   ch = '-'; break;
        }
    }
    userDefined(keys[0], keys[1]);
    if (registeredKeyHandlers.length > 0) {
        for (i = 0; i < registeredKeyHandlers.length; i++) {
            //alert('calling ' + registeredKeyHandlers[i]);
            eval(registeredKeyHandlers[i] + "(keys[0],keys[1]);");
        }
    }
    return true;
}

/**
 * Durchsucht alle links der Seite und sorgt dafür das das onEnter nicht ausgelöst wird, wenn man gerade
 * einen Link im Focus hat. Ansonsten würde das Command doppelt ausgeführt werden.
 */
function disableOnEnterForAnchor() {
    //javascript:alert(frames[1].frames[4].document.links.length);
    var doc = disableOnEnterForAnchor.arguments[0] == null ? self.document : disableOnEnterForAnchor.arguments[0];
    /* DEBUG: Wird diese Funktion überhaupt aufgerufen???
     var txt="Events ("+doc.links.length+"):\n";
     for(var i=0;i<doc.links.length;i++){
     txt+=doc.links[i].onclick+" "+doc.links[i].href+"\n";
     }
     alert(txt);
     */

    for (var i = 0; i < doc.links.length; i++) {
        setOrAddEvent(doc, 'doc.links[' + i + '].onfocus', 'releaseOnEnter()');
        setOrAddEvent(doc, 'doc.links[' + i + '].onblur', 'initOnEnter()');
    }
}

/**
 *
 * @param doc Auf diesem Document arbeiten wir! Dem Document der aktuellen Seite.
 * @param elementStr Dieser String wird als EVAl ausgeführt und muss das Event eines Elements
 *        addressieren, wenn es auf DOC angewendet wird!
 * @param addStuff Dieser JavaScript-Code wirddem addressierten Event hinzugefügt.
 */
function setOrAddEvent(doc, elementStr, addStuff) {
    var eventString = elementStr.substring(elementStr.lastIndexOf('.') + 1);
    var execStr = "";

    //    alert("doc = " + doc + "\nelementStr = " + elementStr + "\naddStuff = " + addStuff);
    if (eval(elementStr + '==null')) execStr = "function " + eventString + "(event){" + addStuff + ";}";
    else {
        var funcElement = eval(elementStr);
        var funcStr = funcElement.toString();
        //eval("funcStr="+elementStr.toString());
        var pos = funcStr.indexOf('{') + 1;
        var prefix = funcStr.substring(0, pos);
        var suffix = funcStr.substr(pos);
        if (suffix.indexOf("javascript:") == 0)suffix = suffix.substr(11);
        execStr = prefix + addStuff + ';' + suffix;
    }
    //    alert(execStr)
    //    if(execStr=='window.onload') execStr = 'onload';
    eval(elementStr + "=" + execStr);
    //alert('FunctionForEvent: '+eval(elementStr+'.toString()'));
}

function addEvent(element, elementStr, addStuff) {
    //    dispArgs("addEvent",addEvent.arguments);
    if (element == null || element == undefined) {
        var eventString = elementStr.substring(elementStr.lastIndexOf('.') + 1);
        //eval(elementStr+"=function "+eventString+"(event){"+addStuff+";}");
        eval(elementStr + "=function(){" + addStuff + ";}");
        return;
    }
    else {
        var funcStr = element.toString();
        pos = funcStr.indexOf('{') + 1;
        prefix = funcStr.substring(0, pos);
        suffix = funcStr.substr(pos);
        if (suffix.indexOf('javascript:') == 0)suffix = suffix.substr(11);
        execStr = prefix + addStuff + suffix;
        //alert("addEvent adding :"+elementStr+"=\n"+execStr);
        eval(elementStr + "=" + execStr);
    }
}

//window.onerror=handledError;
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();
        }
    }

    /*
     msg="Folgende Parameter:";
     for(i=0;i<args.length;i++){
     if(args[i].toString() == '[object HTMLFormElement]') msg+="\narg_ "+i+" : "+args[i].name;
     else msg+="\narg "+i+" : "+args[i];
     }
     alert(msg);
     */
    return true;
}

//
// addLoadEvent()
// Adds event to window.onload without overwriting currently assigned onload functions.
// Function found at Simon Willison's weblog - http://simon.incutio.com/
//
function addLoadEvent(func)
{
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
            if (oldonload != undefined && oldonload != null)oldonload();
            func();
        }
    }
}

function randChar() {
    return (Math.floor(Math.random() * 250) % 25) + 65;
}
/**
 * Function for previewing all kinds of objects except power-point-presentations.
 * @param[0] width 				The width of the current object.
 * @param[1] height 			The height of the current object.
 * @param[2] title 				The title
 * @param[3 to (n-1)] 			URLs of objects which are to be display.
 * @param[n] mime 	     		Shows if this object is an image.
 */
function new_preview() {
    // Parameterformat: width, height, title, id, id, id....
    param = new_preview.arguments;
    if (param.length < 4) {
        alert("Zu wenig Parameter fuer new_preview!");
        return;
    }

    var pictureArr = null;
    var width = param[0];
    var height = param[1];
    var title = param[2];
    var mime = param[ param.length - 1 ];
    var isImage = ( 0 == mime.indexOf("image/") );
    var isQuicktime = ( 0 == mime.indexOf("video/quicktime"));
    var isQuicktimeMpeg = ( 0 == mime.indexOf("video/mpeg"));
    var isMpeg = ( 0 == mime.indexOf("video/mpeg"));
    var isPDF = ( 0 == mime.indexOf("application/pdf"));
    var isFlash = ( 0 == mime.indexOf("application/x-shockwave-flash"));
    var isAudio = ( 0 == mime.indexOf("audio/"));
    var reload = null;


    title = title.replace(/</gi, "&#60;");
    title = title.replace(/>/gi, "&#62;");
    title = title.replace(/"/gi, "&#34;");
    title = title.replace(/'/gi, "&#8242;");
    title = translateText(title);
    var title_cut = title.length > 30 ? title.substring(0, 29) + "..." : title;
    /* debug
     for(i=0;i<param.length;i++){
     alert("Param "+i+": "+param[i]);
     }
     */
    var pics = "";

    var noDims = false;

    if ((width == "" || height == "") && isImage) {
        noDims = true;
        for (i = 3; i < (param.length - 1); i++) {
            pictureArr[i - 3] = new Image()
            pictureArr[i - 3].src = param[i];
        }
    }

    if ((isQuicktime || isMpeg) && (width == "" || height == "" || width == "0" || height == "0")) {
        width = "400";
        height = "300";
    }
    if ((isPDF) && (width == "" || height == "" || width == "0" || height == "0")) {
        width = "500";
        height = "600";
    }

    if ((isQuicktime || isMpeg) && (height && height != "0")) {
        if (isQuicktime || !(navigator.userAgent.indexOf("Windows") && ie)) {
            height = parseInt(height) + 15;
        } else {
            // Entzerrung
            height = parseInt(height) + 50;
        }
    }
    var dimStr = noDims ? "" : " width=\"" + width + "\" height=\"" + height + "\"";

    for (i = 3; i < (param.length - 1); i++) {
        if (isImage) {
            pics += "<a href=\"javascript:self.close()\"><img src=\"" + param[i] + "\"" + dimStr + " title=\"" + title + "\" border=\"0\"></a>";
        } else if (isQuicktime) {
            var paramTag = "<param name=\"src\" value=\"" + param[i] + "\" />";
            var objectTag = "<object data=\"" + param[i] + "\" type=\"" + mime + "\" " + dimStr;
            if (navigator.userAgent.indexOf("Windows") && ie) {
                objectTag += " classid=\"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B\" "
                // BugZilla #5041; Der IE meldelt 'Die Seite enthaelt unsichere Elemente' wenn eine Vorschau
                // ueber eine ssl-Verbindung betrachtet werden soll. Daher darf in einem
                // Object-Tag keine codebase mit 'http' angegeben werden.
                // codebase=\"http://www.apple.com/qtactivex/qtplugin.cab\"
            }
            objectTag += ">" + paramTag + "Objects of type: '" + mime + "' can not be previewed in your browser. Sorry.</object>"
            pics += objectTag;
        } else if (isQuicktimeMpeg) {
            var paramTag = "<param name=\"src\" value=\"" + param[i] + "\" />";
            var objectTag = "<object data=\"" + param[i] + "\" type=\"" + mime + "\" " + dimStr;
            if (ie) {
                if (navigator.userAgent.indexOf("Windows")) {
                    objectTag += " classid=\"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B\" "
                    // BugZilla #5041; Der IE meldelt 'Die Seite enthaelt unsichere Elemente' wenn eine Vorschau
                    // ueber eine ssl-Verbindung betrachtet werden soll. Daher darf in einem
                    // Object-Tag keine codebase mit 'http' angegeben werden.
                    // codebase=\"http://www.apple.com/qtactivex/qtplugin.cab\"
                }
            }
            objectTag += ">" + paramTag + "Objects of type: '" + mime + "' can not be previewed in your browser. Sorry.</object>"
            pics += objectTag;
        } else if (isPDF) {
            var objectTag = "<OBJECT CLASSID=\"clsid:CA8A9780-280D-11CF-A24D-444553540000\" id=\"objPdf\" ";
            objectTag += dimStr + " >"
            objectTag += "<param name=\"src\" value=\"" + param[i] + "\"/>";
            objectTag += "<embed src=\"" + param[i] + "\" " + dimStr + " />";
            objectTag += "</object>";
            if (!ie && (navigator.userAgent.indexOf("Mac") == -1)) {
                reload = param[i];
            } else {
                pics += objectTag;
            }
        } else if (isFlash) {
            var objectTag = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" ";
            // BugZilla #5041; Der IE meldelt 'Die Seite enthaelt unsichere Elemente' wenn eine Vorschau
            // ueber eine ssl-Verbindung betrachtet werden soll. Daher darf in einem
            // Object-Tag keine codebase mit 'http' angegeben werden.
            //  codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\"
            objectTag += dimStr
            objectTag += " id=\"movie\">";
            objectTag += "<param name=\"movie\" value=\"" + param[i] + "\"/>";
            objectTag += "<embed src=\"" + param[i] + "\" quality=\"high\" ";
            objectTag += dimStr;
            objectTag += " name=\"movie\" type=\"" + mime + "\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"/>";
            objectTag += "</object>";
            pics += objectTag;
        } else if (isAudio) {

            //Funktioniert nicht unter Windows:
            /*
             var objectTag = "<object data=\""+param[i]+"\" type=\""+mime+"\"";
             if( navigator.userAgent.indexOf( "Windows" ) && ie ) {
             objectTag += " width=\"500\" height=\"400\"";
             objectTag += " classid=\"clsid:05589FA1-C356-11CE-BF01-00AA0055595A\"";
             } else {
             objectTag += " width=\"500\" height=\"20\"";
             }
             objectTag += "><param name=\"src\" value=\""+param[i]+"\"/>";
             objectTag += "Objects of type: '"+mime+"' can not be previewed in your browser. Sorry."
             objectTag += "</object>";
             pics+=objectTag;
             */


            var objectTag = "<EMBED src=\"" + param[i] + "\" autostart=true hidden=false>";
            pics += objectTag;

        } else if (isMpeg) {
            var objectTag = "<object data=\"" + param[i] + "\" type=\"" + mime + "\"";
            objectTag += dimStr;
            if (navigator.userAgent.indexOf("Windows") && ie) {
                objectTag += " classid=\"clsid:05589FA1-C356-11CE-BF01-00AA0055595A\"";
            }
            objectTag += "><param name=\"src\" value=\"" + param[i] + "\"/>";
            objectTag += "Objects of type: '" + mime + "' can not be previewed in your browser. Sorry."
            objectTag += "</object>";
            pics += objectTag;
        } else {
            pics += "Objects of type: '" + mime + "' can not be previewed in your browser. Sorry.";
        }
    }

    var sizeItRightStr = noDims ? "onload=\"window.opener.sizeItRight()" : "";
    //var previewFrame = findFrame(getFrameName("Preview"),top);
    //alert( "previewFrame: " + previewFrame );

    //Wird fuer mehrere preview-Fenster benoetigt
    //d = new Date();
    //txt="v"+String.fromCharCode(randChar(),randChar(),randChar(),randChar(),randChar(),randChar());

    //alert(str);

    wind = null;

    if (!noDims) {
        var winHeight = height * 1 + 15;
        if (is.ie) winHeight += 25;
        var winWidth = width * (param.length - 4);
        //alert("width="+ winWidth);
        //alert("heigth="+ winHeight);
        xpos = (screen.width - winWidth) / 2;  //Fenster zentrieren
        ypos = (screen.height - winHeight) / 2;
        //eval(txt+"=window.open('','Preview"+txt+"','width="+winWidth+",height="+winHeight+",left="+xpos+",top="+ypos+"');"); //Variante fuer mehrere previews

        wind = window.open("", getFrameName("Preview"), "width=" + (winWidth) + ",height=" + (winHeight) + ",left=" + xpos + ",top=" + ypos + ",resizable=yes");
        winWidth -= 10;
        posx = 250;
        posy = 100;
        sizeItRightStr = "onload=\"window.opener.sizeIt(" + winWidth + "," + winHeight + ",this);";
        if (null != reload) {
            sizeItRightStr += ";self.location.href='" + reload + "';";
        }
    }
    else {
        wind = window.open("", getFrameName("Preview"), "width=100,height=100,left=0,top=0,resizable=yes");
    }

    tableWidth = "100%";

    pos1 = param[3].indexOf("/image/");
    pos2 = param[3].indexOf(".jpg", pos1);

    var iframeWidth = winWidth - 30;
    //alert("pos1=" + pos1 + " | pos2 = " + pos2)
    idStr = "";
    iframeHeight = "20";
    if (document.all) iframeHeight = "25";

    if (pos1 > 0 && pos2 > 0) {
        idStr = "?id=" + param[3].substring(pos1 + 7, pos2);
    }
    var str = "<html><head><title>Preview " + title_cut + "</title>"
            + "</head><body " + sizeItRightStr + "\" style=\"margin:0px;padding:0px;\" bgcolor=\"#999999\">"
            + "<script language=\"JavaScript\">if(self.document.layers)document.captureEvents(Event.KEYDOWN);"
            + "document.onkeydown=keyDown;self.focus();function keyDown(evt){var e=evt||window.event;"
            + "var ch='';var code;if(document.layers){if(e.which>0)code=e.which;}"
            + "else if(document.all){if(e.keyCode>0)code=e.keyCode;}"
            + "else if(document.getElementById){if(e.which>0)code=e.which;if(e.keyCode>0){code=e.keyCode;}}"
            + "if(code==13)self.close();}</script><table width=\"100%\" border=\"0\"><tr align=\"center\"><td>" + pics + "</td></tr></table>"
            + "</body></html>";

    wind.document.open("text/html");
    wind.document.write(str);
    wind.document.close();
    if (document.layers)wind.document.history.go(-1); // nur IE

}


/*
 Funktion dient zur dynamischen Anzeige des Previews
 Redaktion->Anzeige->'Suchergebnis'->bearbeiten->'auf das Thumbnail klicken'
 ckroeger
 */
function preview() {
    // Parameterformat: width, height, id, id, id....
    param = preview.arguments;
    if (param.length < 3) alert("Zu wenig Parameter fuer preview!");
    else {
        var width = param[0];
        var height = param[1];
        /* debug
         for(i=0;i<param.length;i++){
         alert("Param "+i+": "+param[i]);
         }
         */
        var pics = "";

        var noDims = false;

        if (width == "" || height == "") {
            noDims = true;
            for (i = 2; i < param.length; i++) {
                pictureArr[i - 2] = new Image()
                pictureArr[i - 2].src = param[i];
            }
        }

        var dimStr = noDims ? "" : " height=\"" + height + "\" width=\"" + width + "\" ";

        for (i = 2; i < param.length; i++) {
            pics += "<a href=\"javascript:self.close()\"><img src=\"" + param[i] + "\"" + dimStr + " border=\"0\"></a>";
        }

        var sizeItRightStr = noDims ? "onload=\"window.opener.sizeItRight()" : "";
        var previewFrame = findFrame(getFrameName("Preview"), top);

        //Wird fuer mehrere preview-Fenster benoetigt
        //d = new Date();
        //txt="v"+String.fromCharCode(randChar(),randChar(),randChar(),randChar(),randChar(),randChar());

        //alert(str);

        wind = null;

        if (!noDims) {
            var winHeight = height * 1 + 30;
            var winWidth = width * (param.length - 2) + 20;
            //alert("width="+ winWidth);
            //alert("heigth="+ winHeight);
            xpos = (screen.width - winWidth) / 2;  //Fenster zentrieren
            ypos = (screen.height - winHeight) / 2;
            //eval(txt+"=window.open('','Preview"+txt+"','width="+winWidth+",height="+winHeight+",left="+xpos+",top="+ypos+"');"); //Variante fuer mehrere previews

            wind = window.open("", getFrameName("Preview"), "width=" + (winWidth) + ",height=" + (winHeight) + ",left=" + xpos + ",top=" + ypos);
            winWidth -= 20;
            winHeight -= 30;
            sizeItRightStr = "onload=\"window.opener.sizeIt(" + winWidth + "," + winHeight + ",this)";
        }
        else {
            wind = window.open("", getFrameName("Preview"), "width=100,height=100,left=0,top=0");
        }

        var str = "<html><head><title>Preview</title></head><body " + sizeItRightStr + "\"cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#999999\"><script language=\"JavaScript\">self.focus();</script><table border=\"0\"><tr><td>" + pics + "</td></tr></table></body></html>";

        wind.document.open("text/html");
        wind.document.write(str);
        wind.document.close();
        if (document.layers)wind.document.history.go(-1); // nur IE
    }
}
// helper vor preview function
// author ckroeger
function sizeIt(width, height, frame) {
    frame.resizeTo(width + 40, height + 60);
    xpos = (screen.width - (width + 40)) / 2;
    ypos = (screen.height - (height + 60)) / 2;
    ;
    frame.moveTo(xpos, ypos);
}

// helper vor preview function
// author ckroeger
function sizeItRight() {
    width = 0;
    height = pictureArr[0].height;
    for (i = 0; i < pictureArr.length; i++) {
        width += pictureArr[i].width;
    }
    sizeIt(width, height);
}


/* Schließt das Fenster mit dem angegebenen Namen.
 * Noch nicht getestet!
 *
 * @param popupName Der Name des zu schließenden Fensters.
 *
 * @author <A href="mailto: gaschbrenner@picturesafe.de">Gerd Aschbrenner</A>
 */
function closePopup(popupName) {
    if (popupName != null && !popupName.closed) popupName.close();
}


/********************* c k r o e g e r ****************************************************************************/

/**
 * s.u.
 */
var ALL_ENTRY_BOX = new String("ALL_ENTRY_BOX");

/**
 * Waehlt alle selectboxen einer Seite aus.
 * (wird fuer das versenden veraenderter Selectboxen gebraucht)
 *
 * ZUSATZ: 14.06.02 ckroeger
 *
 *         Wird checkAllSelectboxes("FELDNAME") aufgerufen,
 *         so wird nur diese Selectbox selektiert.
 * ERWEITERUNG: 2004-02-09 ehirsch
 *              Bei einem Aufruf ohne Parameter werden nicht mehr l&auml;nger stumpf
 *              alle Selectboxen markiert, sondern nur solche, die in ihrem Namen nicht
 *              den 'Wortvorsatz' "ALL_ENTRY_BOX" enthalten haben.
 *              Den Zusatz geibt's natuerlich auch in JAVA-Form. In dem Interface:
 *              de.picturesafe.adam.adapter.SelectListAssist gibt es jetzt die Konstante:
 *              ALL_ENTRY_BOX (wer haette das gedacht?).
 *
 * 6.1.03 shadowing kompatibel gemacht
 *
 * @author <A href="mailto: ckroeger [at] picturesafe.de">Christian Kroeger</A>
 */
function checkAllSelectboxes() {
    args = checkAllSelectboxes.arguments;
    var last = args.length > 0 ? args[args.length - 1] : -1;
    //alert("Type ="+typeof(last)); //debug
    //alert("_Last_ = "+last.name); //debug
    var form = typeof(last) == 'object' ? last : self.document.WebForm;
    var stop = 0;
    //alert(args[0].name);
    if (-1 < last && args[0].name == "WebForm") {
        form = args[0];
        stop = 1;
    }
    var el = form.elements;
    for (i = el.length; --i >= stop;) {
        if (args.length != stop) {
            for (iii = stop; iii < args.length; iii++) {
                //alert("Aktuelles Element name="+el[i].name+" | gesuchtes="+args[iii]);
                if (args[iii].length > stop)
                    if ((el[i].name.indexOf(args[iii]) != (stop - 1)
                            && -1 == el[i].name.indexOf(ALL_ENTRY_BOX))
                            && el[i].type.toLowerCase() == 'select-multiple') {
                        for (ii = stop; ii < el[i].options.length; ii++) {
                            el[i].options[ii].selected = true;
                        }
                        break;
                    }
            }
        }
        else {
            if (el[i].type.toLowerCase() == 'select-multiple' && (-1 == el[i].name.indexOf(ALL_ENTRY_BOX))) {
                for (ii = stop; ii < el[i].options.length; ii++) {
                    el[i].options[ii].selected = true;
                }
            }
        }
    }
}

/**
 * Soll nur bei dblClick-event ausgefuehrt werden
 * Verschiebt alle selektierten Eintraege einer Quell-Selectbox
 * zu einer Ziel-Selectbox (ANGEPASSTE METHODE FueR MAC)
 *
 * @param source Der Name der Selectbox aus der 'verschoben' werden soll (Quelle)
 * @param target Der Name der Selectbox in die die Inhalte 'verschoben' werden sollen(Ziel)
 * @param WebForm Hier wird die WebForm uebergeben (die shadow.js kuemmert sich darum) OPTIONAL - nur bei shadowing
 *
 * @author <A href="mailto: ckroeger [at] picturesafe.de">Christian Kroeger</A>
 */
function moveSelectboxEntries2() {
    args = moveSelectboxEntries2.arguments;
    //dispArgs("moveSelectboxEntries2",args);//debug
    //auf Mac IE funtioniert dieses feature nicht! Mac68k, MacPPC
    if (navigator.platform.toLowerCase().indexOf("mac") != -1
            && -1 == navigator.userAgent.toLowerCase().indexOf("safari")) return;
    if (args.length == 3)moveSelectboxEntries(args[0], args[1], true, args[2]);
    else moveSelectboxEntries(args[0], args[1]);
}

/**
 * Verschiebt alle selektierten Eintraege einer Quell-Selectbox
 * zu einer Ziel-Selectbox
 *
 * @param source Der Name der Selectbox aus der 'verschoben' werden soll (Quelle)
 * @param target Der Name der Selectbox in die die Inhalte 'verschoben' werden sollen(Ziel)
 * [@param] checkMac Soll der eintrag aus Quellfeld NICHT geloescht werden?
 *
 * @author <A href="mailto: ckroeger [at] picturesafe.de">Christian Kroeger</A>
 */
function moveSelectboxEntries() {
    //source,target
    var doIt = true;
    param = moveSelectboxEntries.arguments;
    //dispArgs("moveSelectboxEntries",param);//debug
    if (param.length < 2) alert("moveSelectboxEntries(source,target[,checkMac]) called with wrong number of parameter!");
    source = param[0];
    target = param[1];
    //alert("param.length = "+param.length+"\nparam[2] ? "+param[2]+"\nnavigator.platform.toLowerCase() = "+navigator.platform.toLowerCase());
    if (param.length == 3) if (param[2] == true) {
        //check
        //auf Mac IE funtioniert dieses feature nicht! Mac68k, MacPPC
        if (navigator.platform.toLowerCase().indexOf("mac") != -1
                && -1 == navigator.userAgent.toLowerCase().indexOf("safari"))
            doIt = false;
        //doIt=false; //debug fuer MAC Bugs
    }
    //alert("doit = "+doIt+"\nparam[2] = "+param[2]);
    /*
     if(param[2]==null || param[2]==true) {  //default ist der CHECK
     //check
     if(navigator.platform.toLowerCase().indexOf("mac")!=-1)doIt=false; //auf Mac funtioniert dieses feature nicht! Mac68k, MacPPC
     }
     */
    //xtime = new Date();
    var wF = self.document.WebForm;
    if (param.length == 4) wF = param[3] == true ? wF : param[3];
    sourceField = findField(source, wF); //aehnlichkeitssuche vorsicht!
    targetField = findField(target, wF);
    //cal(xtime,'2x Suchen:');
    countSource = sourceField.options.length;
    countTarget = targetField.options.length;
    /* ueberpruefen ob in der Ziel-Box nur ein leerer Eintrag ist. Wenn ja diesen entfernen */
    if (1 == countTarget && ( -1 == targetField.options[0].value )) {
        targetField.options[0] = null;
        countTarget = 0;
    }
    arr = new Array();
    pos = 0;
    /* kopieren der ausgew. Inhalte zum Ziel */
    //xtime = new Date();
    for (x = 0; x < countSource; x++) {
        if (sourceField.options[x].selected) {
            targetField.options[countTarget++] = new Option(sourceField.options[x].text, sourceField.options[x].value);
        }
        else {
            arr[pos++] = sourceField.options[x];
        }
    }
    //cal(xtime,'kopieren der ausgew. Inhalte zum Ziel:');

    /*
     xtime = new Date();
     for(i=sourceField.options.length; i >= 0; i--) {
     sourceField.options[i] = null;
     }
     for(i=0;i<arr.length; i++) {
     //sourceField.options[i] = arr[i];
     eval("sourceField.options[i]=new Option(\""+arr[i].text+"\", \""+arr[i].value+"\")");
     }
     cal(xtime,'loeschen der Inhalte:');
     */

    /* loeschen der ausgew. Inhalte aus Quelle*/
//    if (doIt) {
    if (true) {
        //alert("loeschen ");
        //xtime = new Date();
        for (x = countSource; x >= 0; x--) {
            if (x < arr.length) {
                sourceField.options[x] = arr[x];
            }
            else {
                sourceField.options[x] = null;
            }
        }
        //cal(xtime,'loeschen der Inhalte:');
    }
    /* ueberpruefen ob eine der beiden Boxen jetzt leer ist. Wenn ja einen leeren Eintrag einfuegen*/
    /*
     if( sourceField.length == 0){ sourceField.options[0]= new Option('',-1); }
     if( targetField.length == 0){ targetField.options[0]= new Option('',-1); }
     */
}


function cal(xtime, str) {
    ytime = new Date();
    diff = ytime.getTime() - xtime.getTime();
    alert(str + " " + diff / 1000 + " sekunden.");
}

/**
 * Bestimmt die eigene Fensterbreite
 */
function getWindowWidth() {
    var x;
    if (self.innerWidth) // all except Explorer
    {
        x = self.innerWidth;
    }
    else if (document.documentElement && document.documentElement.clientWidth)
    // Explorer 6 Strict Mode
    {
        x = document.documentElement.clientWidth;
    }
    else if (document.body) // other Explorers
    {
        x = document.body.clientWidth;
    }
    return x;
}

/**
 * Bestimmt die eigene Fensterhöhe
 */
function getWindowHeight() {
    var x;
    if (self.innerHeight) // all except Explorer
    {
        x = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight)
    // Explorer 6 Strict Mode
    {
        x = document.documentElement.clientHeight;
    }
    else if (document.body) // other Explorers
    {
        x = document.body.clientHeight;
    }
    return x;
}
