// CW Advisor Java Script
// prepares some help-functions
// Last modified: 22.04.2005

var timer;
var elementIdGlobal;

function BlinkDiv(elementId, howoften) {
    if (! elementId) return;
    elementIdGlobal = elementId;
    times = 5;
    if (howoften) times = howoften;
    if ((times % 2) == 0) times += 1; // we do not allow even numbers!
    onOrOff = false;
    rate = 300;
    // start
    //alert('got request to blink elementid: ' + elementId + " " + times + " times! calling BlinkDivNow() now");
    setTimeout('BlinkDivNow()', howoften);
}

function BlinkDivNow() {
    //alert('BlinkDivNow('+elementIdGlobal+') has been called!');
    var tooltipOBJ = (document.getElementById) ? document.getElementById(elementIdGlobal) : eval("document.all['" + elementIdGlobal + "']");
    if (onOrOff == false) {
        if (tooltipOBJ != null) {
            onOrOff = true;
            tooltipOBJ.style.visibility = "visible";
        }
    }
    else {
        if (tooltipOBJ != null) {
            onOrOff = false;
            tooltipOBJ.style.visibility = "hidden";
        }
    }
    times--;
    if (times <= 0) {
        times = 2;
        onOrOff = false;
        return;
    }
    setTimeout('BlinkDivNow()', rate);
}

/**
 * Check if all fields in <fields> have a value
 * Show popup for each question with no value
 * use <msg> as starting message
 * Parameters will be constructed by custom tags.
 * Parameters are separated by special symbol
 * Add-On by TB, 25-02-05
 * Check Bounds of Integer & Float values
 * Check, if there is an float value in an integer field
 * Add-On by TB, 10-03-05
 * Error Messages are given as parameters
 *
 * @params:
 * f - form
 * checkfields - fields in form, of which input has to be checked
 * minfields - min-values of the fields
 * maxfields - detto
 * questionnames - display header of questions
 * g_msg - infotext with a general message, i.e. "Error in field "
 * wd_msg - infotext, if user gives in wrong datatype, i.e "Integer required!"
 * ts_msg - infotext, if input is too small (only lower bound given)
 * tb_msg - infotext, if input is too big (only upper bound given)
 * oob_msg - infotext, if input is out of allowed bounds (both bounds given)
 *
 */

function CwCheckFormInput(f, fields, questions, msg, checkfields, minfields, maxfields, datatypes, questionnames, g_msg, wd_msg, ts_msg, tb_msg, oob_msg) {
    var thefields = fields.split(',');

    if (thefields[0] == 'null') {
        if (checkfields == '§§,§§,§§,§§' || checkfields == null) {
            f.submit();
            return;
        }

        //if there are fields with bounds, check them
        //submit only if checkBounds is true
        if (checkBounds(checkfields, minfields, maxfields, datatypes, /*questions,*/questionnames, g_msg, wd_msg, ts_msg, tb_msg, oob_msg)) {
            f.submit();
        }
        return;
    }

    var thequestions = questions.split('°');
    var allok = true;
    for (var i = 0; i < thefields.length; i++) {
        var ok = false;
        var name = "document.f." + thefields[i];
        var fld = eval(name);
        if (!fld) fld = eval(name + "singleselect");
        if (fld.length) { // an array
            for (var j = 0; j < fld.length; j++) {
                if (fld[j].checked == true || fld[j].selected == true) {
                    ok = true;
                    thequestions[i] = "";
                    break;
                }
            }
            if (ok == false) {
				if (!fld.disabled) { // dj 26-1-07: Only enabled fields can be used.
					allok = false;
				}
            }
        }
        else {
            if (fld.value == null || fld.value == "") {
                allok = false;
            }
        }
    }
    // mandatory field without input:
    if (!allok) {
        var qdisplay = "";
        for (var i = 0; i < thequestions.length; i++) {
            if (thequestions[i] != "") qdisplay += thequestions[i] + "\n"; // WS 20050712 Bugfix we omit empty lines for answered questions
        }
        alert(msg + '\n\n' + qdisplay);
    }
    //mandatory fields ok, now check bounds
    else {
        //no bounds to check, so submit form input
        if (checkfields == '§§,§§,§§,§§' || checkfields == null) {
            f.submit();
            return;
        }
        //if there are fields with bounds, check them
        //submit only if checkBounds is true
        if (checkBounds(checkfields, minfields, maxfields, datatypes, /*questions,*/questionnames, g_msg, wd_msg, ts_msg, tb_msg, oob_msg)) f.submit();
    }
}



	/** VARIANT: RETURN TRUE, if checks ok, else return false */
	/*   No submit will be done, dj 12-jan-2007
	*/
	function CwCheckInput(f, fields,questions,msg,checkfields,minfields,maxfields,datatypes,questionnames,g_msg,wd_msg,ts_msg,tb_msg,oob_msg) {
		var thefields = fields.split(',');

		if (thefields[0] == 'null') {
			if(checkfields == '§§,§§,§§,§§' || checkfields == null) {
			  //f.submit();
			  return true;
			}

			//if there are fields with bounds, check them
            //submit only if checkBounds is true
            if(checkBounds(checkfields,minfields,maxfields,datatypes,/*questions,*/questionnames,g_msg,wd_msg,ts_msg,tb_msg,oob_msg)) {
              // f.submit(); 
              return true;
              }
            return false;
		}

		var thequestions = questions.split('°');
		
		var allok = true;
		for (var i=0;i<thefields.length;i++) {
			var ok = false;
			var name = "document.f." + thefields[i];
			var fld = eval(name);
			if ( !fld ) fld = eval(name+"singleselect");
			if (fld.length) { // an array
				for (var j=0;j<fld.length;j++) {
					if (fld[j].checked == true || fld[j].selected == true) {
						ok = true;
						thequestions[i] = "";
						break;
					}
				}
				if (ok == false) {
					allok = false;
				}
			}
			else {
	            if (fld.value == null || fld.value == "") {
					if (!fld.disabled) { // dj 26-1-07: Only enabled fields can be used.
	                	allok = false;
	                }
	            }
			}
		}
		// mandatory field without input:
		if (!allok) {
			var qdisplay = "";
			for (var i=0;i<thequestions.length;i++) {
				if ( thequestions[i] != "" ) qdisplay += thequestions[i] + "\n"; // WS 20050712 Bugfix we omit empty lines for answered questions
			}
			alert (msg + '\n\n' + qdisplay);
		}
		//mandatory fields ok, now check bounds
		else {
			//no bounds to check, so submit form input
			if(checkfields == '§§,§§,§§,§§' || checkfields == null) {
				//f.submit();
				return true;
			}
			//if there are fields with bounds, check them
			//submit only if checkBounds is true
			if(checkBounds(checkfields,minfields,maxfields,datatypes,/*questions,*/questionnames,g_msg,wd_msg,ts_msg,tb_msg,oob_msg)) {
				return true;
			}
		}
		return false;
	}

/**
 * function to check bounds of input fields
 * TB, 25-02-05
 * fields - input fields, seperated by "-"
 * min - minima, seperated by "!"
 * max - maxima, seperated by "#"
 */
function checkBounds(fields, min, max, datatypes, /*questions,*/questionnames, g_msg, wd_msg, ts_msg, tb_msg, oob_msg) {
    if (fields == '§§,§§,§§,§§') {
        return true;
    }
    var thefields = fields.split('-');
    var themin = min.split('!');
    var themax = max.split('#');
    var thedatatype = datatypes.split('§');
    //var thequestions = questions.split('°');
    var thequestionnames = questionnames.split('-');
    for (var i = 0; i < thefields.length; i++) {

        var name = "document.f." + thefields[i];
        var fld = eval(name);
        var msg = g_msg + "\n" + thequestionnames[i] + "\n\n";
        thedatatype[i] = parseInt(thedatatype[i], 10);

        //Integer
        if (thedatatype[i] == 1) {
            themin[i] = parseInt(themin[i], 10);
            if (isNaN(themin[i])) themin[i] = 'null';
            themax[i] = parseInt(themax[i], 10);
            if (isNaN(themax[i])) themax[i] = 'null';
        }
        //Float
        if (thedatatype[i] == 3) {
            themin[i] = parseFloat(replaceCommaByDot(themin[i]), 10);
            if (isNaN(themin[i])) themin[i] = 'null';
            themax[i] = parseFloat(replaceCommaByDot(themax[i]), 10);
            if (isNaN(themax[i])) themax[i] = 'null';
        }

        if (!checkDatatype(fld, thedatatype[i], msg, wd_msg)) return false;
        if (!helpToCheckBounds(fld, themin[i], themax[i], msg, wd_msg, ts_msg, tb_msg, oob_msg)) return false;
    }
    return true;
}

//------------------------------------------------------
// auxiliary function for checking bounds of input fields
// min - allowed minimum
// max - allowed maximum
// msg - message which should be displaye on error
// TB 25-02-05,
// Add-on 10-03-05: differentiate, if only one bound is given or two
function helpToCheckBounds(x, min, max, msg, wd_msg, ts_msg, tb_msg, oob_msg) {
    //if there is no value in the field, nothing is checked
    if (x == null || x.value == null || x.value == "") return true;
    x.value = replaceCommaByDot(x.value);
    //if field.value is not a number, an error message is displayed
    if (isNaN(x.value)) {
        alert(msg + wd_msg);
        return false;
    }

    //check, if number is within the allowed bounds

    //no lower bound given
    if (min == 'null' || min == null) {
        if (x.value > max) {
            alert(msg + tb_msg + max);
            return false;
        }
        else {
            return true;
        }
    }

    //no upper bound given
    if (max == 'null' || max == null) {
        if (x.value < min) {
            alert(msg + ts_msg + min);
            return false;
        }
        else {
            return true;
        }
    }

    //both, upper and lower bound are given
    if (x.value < min || x.value > max) {
        alert(msg + oob_msg + '[' + min + ',' + max + ']');
        return false;
    }
    return true;
}

//********************************
// function checks, if there is an float value in an integer field
// TB 25-02-05
// x - field
// datatype - expected datatype, at the moment only int, represented by "1"
// msg - Error Message, wich should be displayed
function checkDatatype(x, datatype, msg, wd_msg) {
    //  alert("datatype");
    if (x == null || x.value == null || x.value == "") return true;
    if (datatype == 1) {
        //check, if x.value is float
        var help1 = parseFloat(replaceCommaByDot(x.value), 10);
        var help2 = parseInt(x.value, 10);
        var help3 = parseFloat(replaceCommaByDot(help2), 10);
        if (help1 != help3) {
            alert(msg + wd_msg);
            return false;
        }
    }
    return true;
}

// *****************************************
// Positionieren eines Slider-Elements
// DJ 11-mar-2004
//
function positionSlider(thename, pos, thevalue, top, left, answersize, width, height) {
    var s_name = 'SLIDER_' + thename;
    var theslider = (document.getElementById) ? document.getElementById('' + s_name) : eval("document.all['" + s_name + "']");
    y = top + ((height * 0.3) / 2);
    x = (left + (width / answersize) * pos) + ((width / answersize) / 2);
    theslider.style.top = y;
    theslider.style.left = x;
    var theformelement = (document.getElementById) ? document.getElementById(thename) : eval("document.all['" + thename + "']");
    if (theformelement == null) {
        theformelement = eval("document.f." + thename);
        if (theformelement == null) {
        }
    }
    theformelement.value = thevalue;
}


// *****************************************
// Deselektieren von Checkboxes bei bestimmten Wert ('egal');
// field = aktuelle Auswahl
// cb = die Checkbox, für die das gilt
// onwhichvalue = Der Wert mit 'egal' - Bedeutung
// Beispiel:
// <advise:checkbox additionalAttributes="onclick=\"deselectOnValue(this,document.f.knd_aufgaben,'ka')\""/>

function deselectOnValue(field, cb, onwhichvalue) {
    var option = field.value;
    if (option == onwhichvalue) {
        for (i = 0; i < cb.length - 1; i++) {
            cb[i].checked = false;
        }
        cb[cb.length - 1].checked = true;
    }
    else {
        cb[cb.length - 1].checked = false;
    }
    var found = 0;
    for (i = 0; i < cb.length; i++) {
        if (cb[i].checked == true) {
            found = found + 1;
        }
    }
    if (found == 0) {
        cb[cb.length - 1].checked = true;
    }
}


// *****************************************
// TK: 30.06.2005
// realisiert einen Konflikt von beliebig vielen Werten d.h. von den Werten kann nur maximal einer angeklickt sein!!
// field = aktuelle Auswahl
// cb = die Checkbox, für die das gilt
// danach kann man beliebig viele Werte angeben, die sich alle gegenseitig ausschliessen!
// Beispiel:
// <advise:checkbox additionalAttributes="onclick=\"checkboxConflict(this,document.f.knd_aufgaben,'server','cad','spiele')\""/>
function checkboxConflict(field, cb) {
    var option = field.value;

    // nur wenn mehr als 3 Werte angegeben werden, haben wir was zu tun
    if (checkboxConflict.arguments.length > 3) {

        // wir iterieren über alle eingegebenen Werte
        for (i = 2; i < checkboxConflict.arguments.length; i++) {
            // wenn einer der Werte angeklickt wurde
            if (option == checkboxConflict.arguments[i]) {

                // iterieren über alle Checkboxex
                for (j = 0; j < cb.length; j++) {
                    // und iterieren wieder über alle Werte (wir müssen nämlich die anderen Werte auf false setzen)
                    for (k = 2; k < checkboxConflict.arguments.length; k++) {
                        // diese prüfung ist notwendig, damit wir nicht den angeklickten Wert auf false setzen!!
                        if (checkboxConflict.arguments[i] != checkboxConflict.arguments[k]) {
                            // alle anderen angegebenen Werte setzen wir auf false
                            if (cb[j].value == checkboxConflict.arguments[k]) {
                                cb[j].checked = false;
                            }
                        }
                    }
                    //for
                }
                //for

            }
        }
        //for


    }//if
}
//checkboxConflict


//*****************************************
// TK: 30.06.2005
// Deselektieren von bestimmten Checkboxes bei einem bestimmten Wert
// field = aktuelle Auswahl
// cb = die Checkbox, für die das gilt
// onwhichvalue = der bestimmte Wert, bei dem die anderen bestimmten Checkboxes deselektiert werden sollen
// anschließend können beliebig viele Checkboxes angegeben werden, die bei dem einen bestimmten Wert deselektiert werden
// Beispiel:
// <advise:checkbox additionalAttributes="onclick=\"deselectSpecialsOnValue(this,document.f.knd_aufgaben,'spiele','cad','server')\""/>
// Wenn der Wert 'spiele' angeklickt wird, dann werden die Werte 'server' + 'cad' deselektiert!
// wenn 'server' oder 'cad' angeklickt wird, dann wird 'spiele' deselektiert!!
function deselectSpecialsOnValue(field, cb, onwhichvalue) {
    var option = field.value;

    // Fehlerbehandlung: nur falls mehr als 3 Parameter angegeben wurden, tun wir was
    if (deselectSpecialsOnValue.arguments.length > 3) {

        // wenn der bestimmte Wert angeklickt worden ist
        if (option == onwhichvalue) {
            // dann iterieren wir über die Checkbox
            for (i = 0; i < cb.length; i++) {
                // und über die angegebenen Werte
                for (j = 3; j < deselectSpecialsOnValue.arguments.length; j++) {
                    // und suchen die angebebenen Werte in der Checkbox
                    if (cb[i].value == deselectSpecialsOnValue.arguments[j]) {
                        // und deselektieren die angegebenen Werte!!
                        cb[i].checked = false;
                    }
                }
                //for
            }
            //for
        }
        // falls nicht der bestimmte Wert angeklickt worden ist, prüfen wir ob einer der angegebenen Werte geklickt wurde
        else {

            // Fall: dass einer der angegebenen Werte angeklickt wird
            // wir iterieren über die angegebenen Werte
            for (i = 3; i < deselectSpecialsOnValue.arguments.length; i++) {
                // falls einer von ihnen angegeben worden ist
                if (option == deselectSpecialsOnValue.arguments[i]) {
                    // iterieren wir über die Checkbox
                    for (k = 0; k < cb.length; k++) {
                        // suchen den bestimmten Wert
                        if (cb[k].value == onwhichvalue) {
                            // und deselektieren ihn
                            cb[k].checked = false;
                        }
                    }
                    //for
                }
            }
            //for
        }
        //else
    }

}
//deselectSpecialsOnValue

// *****************************************

// Ändern des HTML-Inhalts zur Laufzeit. Wird verwendet
// für das dynamische Befüllen Tooltips
// elementid = Name des (DIV) Elements
// thetext   = neuer Inhalt des Elements.

function changecontent(elementid, thetext) {
    if (navigator.appName != 'Netscape') {
        var theobject = eval("document.all['" + elementid + "']")
        theobject.innerHTML = thetext;
    }
    else {
        dynamiccontentNS6(elementid, thetext);
    }
}
function dynamiccontentNS6(elementid, content) {
    if (document.getElementById) {
        rng = document.createRange();
        el = document.getElementById(elementid);
        rng.setStartBefore(el);
        htmlFrag = rng.createContextualFragment(content);
        while (el.hasChildNodes())
            el.removeChild(el.lastChild);
        el.appendChild(htmlFrag);
    }
}

// -----------------------------------------------------------------
// Anzeigen und Verbergen des Tooltip-Elements
// fArg = Name des Tooltip (DIV) Elements
// event = Auslösendes Ereigns, z.B. Mouse-Over Event - wird für
//	   	Positionsabfrage verwendet.
// DJ: 23-3-2004 -> Use delay function
// DJ: 13-may-2005 -> optional paramters x, y
// -----------------------------------------------------------------
// Anzeigen und Verbergen des Tooltip-Elements
// fArg = Name des Tooltip (DIV) Elements
// event = Auslösendes Ereigns, z.B. Mouse-Over Event - wird für
//	   	Positionsabfrage verwendet.
// DJ: 23-3-2004 -> Use delay function
// DJ: 13-may-2005 -> optional paramters x, y
function ShowTooltip(fArg, event, x, y) {
    var tooltipOBJ = (document.getElementById) ? document.getElementById('' + fArg) : eval("document.all['" + fArg + "']");
    //TB:
    //Erklärungstext soll nur angezeigt werden, wenn auch wirklich einer exisitiert
    if (tooltipOBJ.innerHTML == "" || tooltipOBJ.innerHTML == " ") {
        return false;
    }
    if (tooltipOBJ != null) {
        if (navigator.appName != 'Netscape') {
            //alert(event.clientY);
            var tooltipTop = event.clientY;
            var tooltipLft = event.clientX;
            // lousy, move to left... (to be done - only works with small window.)

            if (tooltipLft > 400)
            {
                tooltipLft = 300;
            }

            tooltipOBJ.style.pixelLeft = tooltipLft + 10;
            tooltipOBJ.style.pixelTop = tooltipTop + 10;
            // dj: override settings if given
            if (x != null) {
                tooltipOBJ.style.pixelLeft = x;
            }
            if (y != null) {
                tooltipOBJ.style.pixelTop = y;
            }
        }
        else {
            var tooltipTop = parseInt(event.pageY);
            var tooltipLft = parseInt(event.pageX);
            // lousy, move to left... (to be done - only works with small window.)
            if (tooltipLft > 400)
            {
                tooltipLft = 300;
            }
            tooltipOBJ.style.left = tooltipLft + 'px';
            tooltipOBJ.style.top = tooltipTop + 'px';
            // dj: override settings if given
            if (x != null) {
                tooltipOBJ.style.left = x + 'px';
            }
            if (y != null) {
                tooltipOBJ.style.top = y + 'px';
            }
        }
    }
    else {
        var tooltipTop = 10;
        tooltipOBJ.style.left = tooltipLft;
        tooltipOBJ.style.top = tooltipTop;
    }

    // dj: override position
    string = "delayedTooltip('" + fArg + "')";
    timer = setTimeout(string, 500);
}

// Delayed tooltip display
function delayedTooltip(fArg)
{
    var tooltipOBJ = (document.getElementById) ? document.getElementById('' + fArg) : eval("document.all['" + fArg + "']");
    tooltipOBJ.style.visibility = "visible";
    //tooltipOBJ.style.display = "block";

}
function HideTooltip(fArg)
{
    clearTimeout(timer)
    var tooltipOBJ = (document.getElementById) ? document.getElementById('' + fArg) : eval("document.all['" + fArg + "']");
    if (tooltipOBJ != null) {
        tooltipOBJ.style.visibility = "hidden";
    }
}

// ***********************************************
// Ändern eines Bilds zur Laufzeit (z.B: Highlighting einer Schaltfläche bei Mouse-Over
// name = Name des IMG-elements
// offsrc = Bild-Url wenn nicht highlighted
// onsrc = Bild-Url wenn Highlighted
// action = ON-CLICK javacode kann hier mitgegeben werden.
// example in html: <script>dynamicpic('y','fe/cw/button_back.gif','fe/cw/button_ok.gif','alert(\'hallo\')'); </script>

function dynamicpic(name, offsrc, onsrc, action) {
    document.write("<img src=" + offsrc + " NAME=" + name + " ONMOUSEOVER=\"changeimage('" + name + "','" + onsrc + "')\"" +
                   " ONMOUSEOUT=\"changeimage('" + name + "','" + offsrc + "')\" ONCLICK=\"" + action + "\">");
}

function changeimage(imgname, src) {
    var imgobj = document[imgname];
    if (imgobj != null) {
        imgobj.src = src;
    }
}


//********************************
// Verzweigen zu einer anderen Seite via SUBMIT
function goToPage(form, thepage) {
    form.CW_NEXT_PAGE.value = thepage;
    form.submit();
}

function goToPageIgnoreAllHints(form, thepage) {
    form.CW_NEXT_PAGE.value = thepage;
    form.CW_IGNORE_ERROR.value = 'allhints';
    form.submit();
}


// ***********************************************
/**
 * Öffnet ein PopUp-Window in der Mitte des Bildschirms mit einer Meldung (text)
 */
function alertText(text, theheight, thewidth)
{
    var link = "__infopopup.jsp?message=" + text;
    var height = theheight;
    var width = thewidth;

    openwindowlink(link, height, width);
}


// ***********************************************
/**
 * Zentriertes PopUp eines jsp's (link) mit vorgegebener Groesse (height,width)
 * @return
 */
function openwindowlink(link, height, width) {
    var x = (screen.availWidth / 2);
    var y = (screen.availHeight / 2);
    var left = x - width / 2;
    var top = y - height / 2;
    newwin = window.open(link, "", "left=" + left + ",top=" + top + ",height=" + height + ",width=" + width + ",'toolbar=no,scrollbars=yes,menubar=no,resizable=yes,fullscreen=no,titlebar=no,personalbar=no,status=no");
    newwin.focus();
}

// ***********************************************
// In 1.7 nicht mehr verwendete Funktionen f. Tooltips

function show_it() {
    if (document.getElementById)
    {
        document.getElementById("tip").style.visibility = "visible"
    }

    else {
        document.tip.visibility = "visible"
    }
}
//ends open function

function hide_it() {
    if (navigator.appName == "Microsoft Internet Explorer") {
        document.all.tip.style.visibility = "hidden";
    }
    if (!document.all) {
        document.tip.visibility = "hidden";
    }
    if (navigator.appName != "Microsoft Internet Explorer" && document.all)
    {
        document.getElementById("tip").style.visibility = "hidden"
    }
}
//ends close function



// ***********************************************
// Selektieren und deselktieren aller Checkbox fields

function selectAllCheckboxItems(field) {
    for (i = 0; i < field.length; i++) {
        field[i].checked = true;
    }
}
function deselectAllCheckboxItems(field) {
    for (i = 0; i < field.length; i++) {
        field[i].checked = false;
    }
}

// ***********************************************
// Hilfsfunktion für Schnellsuche: Prüft Carriage-Return in Suchbegriffsfeld
// e = Auslösendes Event
// resultpage = *Name* der Ergebnisseite (ohne jsp)

function checkEnter(e, resultpage) {
    var characterCode
    if (e && e.which) {
        characterCode = e.which
    }
    else {
        characterCode = e.keyCode
    }
    if (characterCode == 13) { //if generated character code is equal to ascii 13 (if enter key)
        callsearchresult(document.f.searchfield, resultpage, 'true');
        return true;
    }
    return false;
}

// ***********************************************
// Hilfsfunktion für Schnellsuche: Aufgerufen bei "Jetzt Suchen"
// searchfield = HTML-Form Element mit dem Suchstring
// resultpage = *Name* der Ergebnisseite (ohne jsp)
function callsearchresult(searchfield, resultpage, nosubmit) {
    document.f.CW_NEXT_PAGE.value = resultpage + '?searchstring=' + searchfield.value;
    if (!nosubmit) {
        document.f.submit();
    }
    return false;
}


// ***********************************************
// Funktion, die auf der Produktberwertungsseite überprüft, ob tatsächlich
// eine Bewertung ausgewählt wurde.
function checkRating(m) {
    var check = false;
    for (i = 0; i < document.f.CW_RATING_VALUE.length; i++) {
        if (document.f.CW_RATING_VALUE[i].checked) {
            check = true;
        }
    }
    //for
    if (check) {
        document.f.submit();
        return true;
    }
    else {
        alert(m);
    }
}
//checkRating()


// Funktion, mit der versucht wird ein neues Fenster bildschirmfüllend zu öffnen
function openFullWindow(link, defaultwidth, defaultheight) {
    var w = 1024;
    var h = 768;
    if (defaultwidth) w = defaultwidth;
    if (defaultheight) h = defaultheight;

    if (window.screen) {
        w = window.screen.availWidth;
        h = window.screen.availHeight;
    }
    var newwin = window.open(link, '', 'width=' + w + ',height=' + h + ',top=0,left=0,toolbar=no,scrollbars=yes,menubar=no,resizable=yes,fullscreen=no,titlebar=no,personalbar=no,status=no');
    return newwin;
}

// Change visibility of group with id 'elementid'.
// Additionally change the sign from '+' to '-' and vice versa.
// Funktion zum auf-/zuklappen eines html elements, zusätzlich wird der Inhalt von einem sign-element (signid) verändert.
function changeVisibility(elementid, signId, blocksign, showsign) {
    var divElement = (document.getElementById) ? document.getElementById('' + elementid) : eval("document.all['" + elementid + "']");
    if (!divElement) return;
    //alert(divElement.style.display);
    if (divElement.style.display == 'none') {
        divElement.style.display = 'block';
        if (signId && blocksign) changecontent(signId, blocksign);
    } else {
        divElement.style.display = 'none';
        if (signId && showsign) changecontent(signId, showsign);
    }
}

// Funktion zum Ändern der Hintergrundfarbe eines html elements
function changeStyle(elementid, backgroundColor) {
    var divElement = (document.getElementById) ? document.getElementById('' + elementid) : eval("document.all['" + elementid + "']");
    if (!divElement) return;
    divElement.style.backgroundColor = backgroundColor;
}


/*
  CHECK email syntax QUELLE http://aktuell.de.selfhtml.org/artikel/javascript/email-check/
  Copyright Lutz Eymers <ixtab@polzin.com>, 1997
  Polzin GmbH, Duesseldorf
*/

/* wahr, wenn das Zeichen eine Zahl ist */
function isDigit(ch)
{
    if ((ch >= '0') && (ch <= '9'))
        return true;
    else
        return false;
}

/* wahr, wenn das Zeichen ein Buchstabe ist*/
function isAlpha(ch)
{
    if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))
        return true;
    else
        return false;
}

/* wahr, wenn das Zeichen alphanumerisch ist */
function isAlnum(ch)
{
    if (isAlpha(ch) || isDigit(ch))
        return true;
    else
        return false;
}

/* wahr, wenn kein Zeichen aus str2 in str1 vorkommt */
function notIn(str1, str2)
{
    var i = 0;
    var j = str2.length;
    for (; i < j; i++)
    {
        var str3 = str2.charAt(i);
        if (str1.indexOf(str3) != -1)
            return false;
    }
    return true;
}

/* wahr, wenn der Username gültig ist */
function checkUsername(username, mustBeQuoted)
{
    var i = 0;
    var j = username.length;
    if (username.charAt(0) != '"')
    {
        if ((username.charAt(0) < ' ') || (username.charAt(0) > '~')
                || !notIn(mustBeQuoted, username.charAt(0)))
            return false;
        for (i = 1; i < j; i++)
        {
            if (( (username.charAt(i) < ' ') || (username.charAt(i) > '~')
                    || !notIn(mustBeQuoted, username.charAt(i)) )
                    && ( username.charAt(i - 1) != '\\' ))
                return false;
        }
    }
    else
    {
        if (username.charAt(j - 1) != '"')
            return false;
        for (i = 1; i < j - 1; i++)
        {
            if (( (username.charAt(i) == '\n') || (username.charAt(i) == '\r')
                    || (username.charAt(i) == '\"') )
                    && (username.charAt(i - 1) != '\\'))
                return false;
        }

    }
    return true;
}

/* wahr, wenn eine Zifferfolge vorliegt */
function checkNr(nr)
{
    var i = 0;
    var j = nr.length;

    if (j < 1)
        return false;

    for (; i < j; i++)
        if (( nr.charAt(i) < '0' ) || ( nr.charAt(i) > '9' ))
            return false;

    return true;
}

/* wahr, wenn IP-Adresse als gütig eingestuft wurde */
function checkIpnr(ipnr)
{
    var iL = 0;
    var iC = 0;
    var i = 0;
    var sNr = "";

    for (; i < ipnr.length; i++)
    {
        if (ipnr.charAt(i) == '.')
        {
            if (!iL || (iL > 3) || parseInt(sNr, 10) > 255)
                return false;
            iC++;
            iL = 0;
            sNr = "";
            continue;
        }
        if (isDigit(ipnr.charAt(i)))
        {
            iL++;
            sNr = sNr + ipnr.charAt(i);
            continue;
        }
        return false;
    }

    if (parseInt(sNr, 10) > 255)
        return false;
    if (( (iC == 3) && (iL >= 1) && (iL <= 3) ) || ( (iC == 4) && (!iL) ))
        return true;
    else
        return false;
}


/*  wahr, wenn der Fully Qualified Domain Name als gütig eingestuft wurde */
function checkFqdn(fqdn)
{
    var iL = 0;
    var iC = 0;
    var i = fqdn.length - 1;

    if ((fqdn.charAt(0) == '.') || (fqdn.charAt(0) == '-'))
        return false;
    if (fqdn.charAt(i) == '.')
        i = i - 1;

    for (; i >= 0; i--)
    {
        if (fqdn.charAt(i) == '.')
        {
            if (iL < 2 && iC < 2)
                return false;
            if (fqdn.charAt(i - 1) == '-')
                return false;
            iC++;
            iL = 0;
            continue;
        }
        if (isAlnum(fqdn.charAt(i)))
        {
            iL++;
            continue;
        }
        if (fqdn.charAt(i) == '-')
        {
            if (!iL)
                return false;
            iL++;
            continue;
        }
        return false;
    }

    if (!iC || ( iL == 1 && iC < 2 ) || ( !iL && iC == 1 )) {
        return false;
    }

    return true;

}

/*  wahr, wenn der Hostname als gütig eingestuft wurde */
function checkHostname(hostname)
{
    if (hostname.charAt(0) == '[')
    {
        if (hostname.charAt(hostname.length - 1) != ']')
            return false;
        var ipnr = hostname.substring(1, hostname.length - 1);
        return checkIpnr(ipnr);
    }

    if (hostname.charAt(0) == '#')
    {
        var nr = hostname.substring(1, hostname.length);
        return checkNr(nr);
    }

    return checkFqdn(hostname);
}

/* wahr, wenn die E-mail ohne Realname als gütig eingestuft wurde */
function checkEmailAdr(address)
{
    var status = true;
    var username = "";
    var hostname = "";

    if (address.length < 8)
        return false;

    var seperate = address.lastIndexOf("@");
    if (seperate == -1)
        return false;

    username = address.substring(0, seperate);
    if (! checkUsername(username, "<>()[],;:@\" "))
        return false;

    hostname = address.substring(seperate + 1, address.length);
    if (! checkHostname(hostname))
        return false;

    return true;
}

/* wahr, wenn die E-Mail Adresse als gütig eingestuft wurde, wobei der zweite Parameter festlegt, ob Realname akzeptiert werden oder nicht */
function checkEmail(email, allowFullname)
{
    if (email == "") return true;
    var existFullname = false;
    var status = true;
    var fullname = "";
    var adress = "";
    if (email.length < 8)
        return false;
    var emailBegin = email.indexOf("<");
    var emailEnd = email.lastIndexOf(">");

    if ((emailBegin == -1) && (emailEnd == -1))
        return checkEmailAdr(email);

    if (( (emailBegin == -1) && (emailEnd != -1) )
            || ( (emailBegin != -1) && (emailEnd == -1) ))
        return false;

    adress = email.substring(emailBegin + 1, emailEnd);

    if (! checkEmailAdr(adress))
        return false;

    if (email.length == adress.length + 2)
        return true;
    else
        if (! allowFullname)
            return false;

    if (emailEnd == email.length - 1)
    {
        if (emailBegin == 0)
            return true;
        if (email.charAt(emailBegin - 1) != ' ')
            return false;
        fullname = email.substring(0, emailBegin - 1);
        return checkUsername(fullname, "<>()[],;:@\"");
    }

    return false;

}

/* WS check Email with alert msg */
function checkEmailWithAlert(email, allowFullname, msg)
{
    if (!checkEmail(email, allowFullname))
    {
        alert(msg + "\n");
        return false;
    }
    return true;
}
// KI 2005.08.30
// replaces commas in string by dots (e.g. 3,3-> 3.3), needed for number checks
function replaceCommaByDot(string) {
    var comma = ',';
    var dot = '.';
    var doublevalue = "" + string;
    while (doublevalue.indexOf(comma) > -1)
    {
        pos = doublevalue.indexOf(comma);
        doublevalue = "" + (doublevalue.substring(0, pos) + dot +
                            doublevalue.substring((pos + comma.length), doublevalue.length));
    }
    return doublevalue;
}

// Ajax methods to send request
function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if (browser == "Microsoft Internet Explorer") {
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        ro = new XMLHttpRequest();
    }
    return ro;
}

var http = createRequestObject();
var theid;

function showHints() {
	sendRequest('hints.jsp', 'DYNAMIC');
}

function sendRequest(page, id) {
		if (!document.getElementById(id)) return;
    var fieldsdone = new Array();
    /* collect all the fields on the screen */
    var theform = document.f;
    var nbElements = theform.length;
    var querystring = "e=e"
    for (var i = 0; i < nbElements; i++) {
        var aname = theform[i].name;
        if (aname.substring(0, 2) != 'CW') {
            var value = eval('document.f.' + aname + '.value');
            if (value != null) {
                querystring += "&" + aname + "=" + value;
            }
            else {
                var found = false;
                for (var j = 0; j < fieldsdone.length; j++) {
                    var f = fieldsdone[j];
                    var x = '';
                    var y = '';
                    x += aname;
                    y += f;
                    if (x == y) {
                        found = true;
                    }
                }
                if (!found) {
                    fieldsdone.push(aname);
                    var len = eval('document.f.' + aname + '.length');
                    for (var j = 0; j < len; j++) {
                        var sel = eval('document.f.' + aname + '[' + j + '].checked || document.f.' + aname + '[' + j + '].selected');
                        if (sel == true) {
                            var anothervalue = eval('document.f.' + aname + '[' + j + '].value');
                            querystring += "&" + aname + "=" + anothervalue;
                        }
                    }
                }
            }
        }
    }
    http.open('get', page + '?' + querystring);
    theid = id;
    http.onreadystatechange = handleResponse;
    http.send(null);
}

function handleResponse() {
    if (http.readyState == 4) {
        var response = http.responseText;
        document.getElementById(theid).innerHTML = response;
    }
}

//Shows a checkbox if the show string is true
function showCheckbox(show) {
	
    if (show == "1" || show == "true" || show == "TRUE" || show == "Ja" || show == "JA" || show =="ja") {
    	document.write("<IMG SRC='images/checkbox.gif' ALT='' BORDER=0>");
    }
    else {
        document.write("<IMG SRC='images/checkbox_empty.gif' ALT='' BORDER=0>");
    }
}

//Checks if myin is null, if yes, then show the myout string
function showNotNull(tester, ok_text, not_ok_text) {
	
	if (tester == "NULL" || tester=="" || tester==" " || tester=="Null" || tester=="null" || tester=="0" || tester=="0.0") {
	    document.write(not_ok_text);
	}
	else {
	    document.write(ok_text);
	}
}

