var formValid = new Array();

ie = (document.all) ? true:false; // ie4+
dom2 = ((document.getElementById)&&(!ie))?true:false; // mozilla, netscape 6+ 

// wait until all the elements are loaded until we assign event listeners.
window.onload = function() {
    traverseElements(setListeners);
    setEventById('submit_button','click',validateForm);
}   

function ieRadioCheck(radioGroup){
    var ieradiocheck = document.forms[0][radioGroup];
    for (var i = 1; i <= ieradiocheck.length; i++){
        evalRadio(document.getElementById(radioGroup+i));
    }
    
}

function ieCheckBoxCheck(checkBoxGroup){
    var iecheckboxcheck = document.forms[0][checkBoxGroup];
    for (var i = 1; i <= iecheckboxcheck.length; i++){
        evalCheckBox(document.getElementById(checkBoxGroup+i));
    }
    
}

function validateForm(e){
    traverseElements(dispatchEvent);
    if( document.getElementById('akkreditierung') != undefined){
        workSum();
        //dispatchEvent('reqIchBinNichtOther',{});
        //dispatchEvent('reqGewunschteAkkred',{});
        // stupid ie.
        ieRadioCheck('reqIchBin');
        //ieRadioCheck('reqIchBinArt');
        ieRadioCheck('reqMedium');
        ieCheckBoxCheck('reqGewunschteAkkred');
    }
    if( document.getElementById('medien') != undefined){
        dispatchEvent('reqArtOther',{});
        // stupid ie.
        ieRadioCheck('reqSprache');
        ieRadioCheck('reqAnrede');
        ieRadioCheck('reqArt');
        //ieCheckBoxCheck('reqGewunschteAkkred');
    }
    var isFormValid = false;
    for (var i in formValid){
   // debug // text = document.createTextNode(i + " ("+formValid[i]+") ");
   //document.getElementById('debug').appendChild(text);
        if(!formValid[i]){
            isFormValid = false;
            break;
        }
        else isFormValid = true;
    }
    
    
    if(isFormValid) {
        document.forms[0].submit();
    }
}

function workSum(){
	if(formValid['reqNumberWorkNoTel'] && 
	   formValid['reqNumberWorkAnalog'] &&
	   formValid['reqNumberWorkISDN']){
		sum = document.getElementById('reqNumberWorkNoTel').value +
			  document.getElementById('reqNumberWorkAnalog').value +
			  document.getElementById('reqNumberWorkISDN').value;
		if(sum == 0){
        	document.getElementById('msgNumberWorkCHK').className = "form_error_visible";
        	formValid['workCheckSum'] = false;
		}
		else {	
        	document.getElementById('msgNumberWorkCHK').className = "form_error_hidden";
        	formValid['workCheckSum'] = true;
		}
		
	}

}


function traverseElements(funct){
    el = document.forms[0].elements;
    for (var i in el) {
        if(el[i] != null){
            if(el[i].id != undefined){
                if( String(el[i].id).substr(0,3) == "req" ){
                    if( el[i].type == "text" ){
                        var contEmail = /email/i;
                        var contVerify = /number/i;
                        if (contEmail.test(el[i].id)){
                            funct(el[i].id, evalEmail);
                        }
                        else if (contVerify.test(el[i].id)){
                            funct(el[i].id, evalNumber);
                        }
                        else if (el[i].id !=  "reqArtOther" && el[i].id !=  "reqIchBinNichtOther"){
                            funct(el[i].id, evalText);
                        }
                    }
                    else if( el[i].type == "radio" ){
                        funct(el[i].id, evalRadioListener);
                    }
                    
                    
                    else if( el[i].type == "checkbox" ){
                        funct(el[i].id, evalCheckBoxListener);
                    }
                }
            }
        }
    }
}

// listeners for the events.
function setListeners(name, funct){
    if(dom2) {
        setEventById(name,'change', funct);
        setEventById(name,'blur', funct);
        setEventById(name,'focus',funct);
    }
    if(ie){
        setEventById(name,'scroll',funct);
    }
    //setEventById(name,'keypress',funct);
    //setEventById(name,'click',funct);
}

function removeListeners(name, funct){
    if(dom2){
        removeEventById(name,'change', funct);
        removeEventById(name,'blur', funct);
        removeEventById(name,'focus',funct);
    }
    if(ie){
        removeEventById(name,'scroll',funct);
    }
    //removeEventById(name,'keypress',funct);
    //removeEventById(name,'click',funct);
    var msg = document.getElementById('msg'+name.substr(3,name.length));
        msg.className = "form_error_hidden";

}

function dispatchEvent(id, funct){
    var fireOnThis = document.getElementById(id);
    if( document.createEvent ) { var evObj = document.createEvent('HTMLEvents');
        evObj.initEvent( 'blur', true, false);
        fireOnThis.dispatchEvent(evObj);
        } 
    else if( document.createEventObject ) {
         //funct(document.createEventObject);
       fireOnThis.fireEvent('onscroll');
    }
}


var text;

counter = 1;

function evalRadioListener(e){
    var el = getSrc(e);
    evalRadio(el);
}


function evalCheckBoxListener(e){
    var el = getSrc(e);
    evalCheckBox(el);
}



function evalRadio(el){
   // debug // text = document.createTextNode(el.name + " ("+el.id+") ");
    //document.getElementById('debug').appendChild(text);
    var msg = document.getElementById('msg'+String(el.name).substr(3,String(el.name).length));
    var allChecked = true;
    var t = document.forms[0][el.name];
    for (var i = 1; i <= t.length; i++) {
        allChecked = document.getElementById(el.name+i).checked;
        if(allChecked) break;
        //text = document.createTextNode(document.getElementById(el.name+i).checked + " ");
       // document.getElementById('debug').appendChild(text);
    }
    if(!allChecked){
        msg.className = "form_error_visible";
        formValid[el.name] = false;
    }
    else {
        formValid[el.name] = true;
        msg.className = "form_error_hidden";
        if( el.name == "reqArt"){ // Special case where one radio choice is a text field.
            if( document.getElementById('reqArt7').checked){
                setListeners(document.getElementById('reqArtOther').id, evalText);
                if(document.getElementById('reqArtOther').value == "") {
                    document.getElementById('reqArtOther').focus();
                }
            }
            else {
                removeListeners(document.getElementById('reqArtOther').id, evalText);
                document.getElementById('reqArtOther').className = 'form_input_required';
            }
        }
        else if (el.name == "reqIchBinNicht"){ // Special case where one radio choice is a text field.
            if( document.getElementById('reqIchBinNicht5').checked){
                setListeners(document.getElementById('reqIchBinNichtOther').id, evalText);
                if(document.getElementById('reqIchBinNichtOther').value == "") {
                    document.getElementById('reqIchBinNichtOther').focus();
                }
            }
            else {
                removeListeners(document.getElementById('reqIchBinNichtOther').id, evalText);
                document.getElementById('reqIchBinNichtOther').className = 'form_input_required';
            }
        
        }
    }
}

function evalCheckBox(el){
    var msg = document.getElementById('msg'+String(el.name).substr(3,String(el.name).length));
    var allChecked = 0;
    var t = document.forms[0][el.name];
    document.getElementById("oblgewunschte_akkred").value = "";
    for (var i = 1; i <= t.length; i++) {
        allChecked += document.getElementById(el.name+i).checked ? 1 : 0;
        if(document.getElementById(el.name+i).checked) document.getElementById("oblgewunschte_akkred").value += document.getElementById(el.name+i).value+" ";
        //if(!allChecked) break;
        //text = document.createTextNode(document.getElementById(el.name+i).checked + " ");
       // document.getElementById('debug').appendChild(text);
    }
    if(!allChecked){
        msg.className = "form_error_visible";
        formValid[el.name] = false;
    }
    else {
        formValid[el.name] = true;
        msg.className = "form_error_hidden";
    }
}


function evalText(e){
    var el = getSrc(e);
    var msg = document.getElementById('msg'+String(el.id).substr(3,String(el.id).length));
    
    if( el.id == 'reqArtOther') {
        document.getElementById('reqArt7').checked = true;
    }
    if( el.id == 'reqIchBinNichtOther') {
        document.getElementById('reqIchBinNicht5').checked = true;
    }
    if (el.value == ""){
        msg.className = "form_error_visible";
        el.className = "form_input_error";
        formValid[el.name] = false;
    }
    else {
        msg.className = "form_error_hidden";
        el.className = "form_input_required";
        formValid[el.name] = true;
        if( el.id == 'reqArtOther') {
            document.forms[0].reqArt[6].checked = true;
            document.forms[0].reqArt[6].value = el.value;
         }
        if( el.id == 'reqIchBinNichtOther') {
            document.forms[0].reqArt[4].checked = true;
            document.forms[0].reqArt[4].value = el.value;
         }
    }

}

/*
 *  Evaluates an email address using regular expressions. The address has to end
 *  with either dsv.su.se or kth.se.
 *
 */
function evalEmail(e){
    // get the message field reference into a variable for legibility.
    var el = getSrc(e);
    var msg = document.getElementById('msg'+String(el.id).substr(3,String(el.id).length));
    // set the regex filter to match characters allowed in an email, it has to
    // have an @ sign, and it has to belong to dsv.su.se or kth.se, while 
    // bearing in mind email addresses are case insensitive.
    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    // if we do not have a match then we export the text into the appropriate
    // container in the html document.
    if (!filter.test(el.value)) {
        msg.className = "form_error_visible";
        el.className = "form_input_error";
        formValid[el.name] = false;
    }
    // othwerwise we let the user know that the address is valid.
    else {
        msg.className = "form_error_hidden";
        el.className = "form_input_required";
        formValid[el.name] = true;
    }
}

/*
 *  Evaluates a password regular expressions. The password may only be comprised
 *  of digits.
 *

 */
function evalNumber(e){
    // get the message field reference into a variable for legibility.
    var el = getSrc(e);
    var msg = document.getElementById('msg'+String(el.id).substr(3,String(el.id).length));
    // set the regex filter to match on digits in the password.
    var filter = /^(\d)+$/;
    // if we do not have a match then we export the text into the appropriate
    // container in the html document.
    if (!filter.test(el.value)) {
        msg.className = "form_error_visible";
        el.className = "form_input_error";
        formValid[el.name] = false;
    }
    // othwerwise we let the user know that the password is valid.
    else {
        msg.className = "form_error_hidden";
        el.className = "form_input_required";
        formValid[el.name] = true;
    }
}

