var nbsp = 160;		// non-breaking space char
var node_text = 3;	// DOM text node-type
var emptyString = /^\s*$/ ;
var global_valfield;	// retain valfield for timer thread


function trim(str)
{
    return str.replace(/^\s+|\s+$/g, '');
}

function setFocusDelayed()
{
    global_valfield.focus();
}

function setfocus(valfield)
{
    // save valfield in global variable so value retained when routine exits
    global_valfield = valfield;
    setTimeout( 'setFocusDelayed()', 100 );
}

function changeStyle(elem,     // element, which style has to be changed
isValid) // style to which element will be set
{
    if(isValid){
    	elem.style.border = "2px solid green";  
    }
    else{
    	elem.style.border = "2px solid red";  
    }
}

function msg(fld,     // id of element to display message in
msgtype, // class to give element ("warn" or "error")
message) // string to display
{
    // setting an empty string can give problems if later set to a 
    // non-empty string, so ensure a space present. (For Mozilla and Opera one could 
    // simply use a space, but IE demands something more, like a non-breaking space.)
    var dispmessage;
    if (emptyString.test(message)) 
        dispmessage = String.fromCharCode(nbsp);    
    else  
        dispmessage = message;

    var elem = document.getElementById(fld);
    elem.firstChild.nodeValue = dispmessage;  
							      
    elem.className = msgtype;   // set the CSS class to adjust appearance of message
}

var proceed = 2;  

function commonCheck    (valfield,   // element to be validated
infofield,  // id of element to receive info/error msg
required)   // true if required
{
    if (!document.getElementById) 
        return true;  // not available on this browser - leave validation to the server
    var elem = document.getElementById(infofield);

    if (!elem.firstChild) return true;  // not available on this browser 

    if (elem.firstChild.nodeType != node_text) return true;  // infofield is wrong type of node 

	if(valfield.value.match("<a>"))
	{
		msg (infofield, "error", "unerlaubte zeichen verwendet!");  
        setfocus(valfield);
        return false;
	}

    if (emptyString.test(valfield.value)) {
        if (required) {
            msg (infofield, "error", "verpflichtend");  
            setfocus(valfield);
            return false;
        }
        else {
            msg (infofield, "warn", "");   // OK
            return true;  
        }
    }
    return proceed;
}

function validatePresent(valfield,   // element to be validated
infofield) // id of element to receive info/error msg
{
    var stat = commonCheck (valfield, infofield, true);
    if (stat != proceed) return stat;

    msg (infofield, "warn", "");  
    return true;
}

function validateEmail  (valfield,   // element to be validated
infofield,  // id of element to receive info/error msg
required)   // true if required
{
    var stat = commonCheck (valfield, infofield, required);
    if (stat != proceed) return stat;

    var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
    var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
    if (!email.test(tfld)) {
        changeStyle(valfield, false); 
		msg (infofield, "warn", "bitte gültige E-Mail angeben");
        setfocus(valfield);
        return false;
    }

    var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
    if (!email2.test(tfld)) {
       changeStyle(valfield, false); 
	   msg (infofield, "warn", "ungütlige email");
    }
    else {
        changeStyle(valfield, true);
	    msg (infofield, "warn", "");
    }
    return true;
}

function validateTelnr  (valfield,   // element to be validated
infofield,  // id of element to receive info/error msg
required)   // true if required
{
    var stat = commonCheck (valfield, infofield, required);
    if (stat != proceed) return stat;

    var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
    var telnr = /^\+?[0-9 ()-]+[0-9]$/  ;
    if (!telnr.test(tfld)) {
        msg (infofield, "error", "ERROR: not a valid telephone number. Characters permitted are digits, space ()- and leading +");
        setfocus(valfield);
        return false;
    }

    var numdigits = 0;
    for (var j=0; j<tfld.length; j++)
        if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

    if (numdigits<6) {
        msg (infofield, "error", "ERROR: " + numdigits + " digits - too short");
        setfocus(valfield);
        return false;
    }

    if (numdigits>14)
        msg (infofield, "warn", numdigits + " digits - check if correct");
    else { 
        if (numdigits<10)
            msg (infofield, "warn", "Only " + numdigits + " digits - check if correct");
        else
            msg (infofield, "warn", "");
    }
    return true;
}

function validateSelect(valfield, infofield)
{
	var selectedValue = (valfield.options[valfield.selectedIndex]).value;

	if((selectedValue != 10) && (selectedValue != 20))
	{
		changeStyle(valfield, true);
	    msg (infofield, "warn", "");
		setfocus(valfield);
		return true;
    }
    else {
		changeStyle(valfield, false); 
	    msg (infofield, "warn", "verpflichtend");
		setfocus(valfield);
		return false;
    }

}