
// mark required fields width *
function markFormRequiredFields (id) {
    
    if (id == undefined || id == null || id == false) {
        id = '';
    } else {
        id = '#' + id + ' ';
    }
    
    $(id + '.required').each(function(){
        
        if ($('label[for = "' + $(this).attr('id') + '"]').html().indexOf(' *') == -1) {
            $('label[for = "' + $(this).attr('id') + '"]').append(' *');
        }
        
    });
    
}


// init ajax forms
var boolIsAjaxSubmit = false;
function initAjaxForm (id) {
    
    $('#' + id).ajaxForm({
        success: function(data) { 
            var arrData = data.split(':::');
            if (arrData[0] == 'true') {
                // append the "ajax'd" data to the table body 
                $(arrData[1] + " tbody").append(arrData[2]); 
                window.setTimeout("triggerTablesorterUpdate ('#budgetTable');", 300);
            }
            boolIsAjaxSubmit = true;
            $('.nyroModalClose').click();
        },
        beforeSubmit: function() {
            return validateForm ('#' + id);
        }
    });
    
}


// init form validation
function initFormValidation () {
   
    $('form:has(input.required), form:has(textarea.required), form:has(select.required)').unbind('submit');    
    $('form:has(input.required), form:has(textarea.required), form:has(select.required), form:has(input[type="file"]), form:has(input[class*="match"])').submit(function(){
        
        if ($(this).hasClass('ajaxForm') == false) {
            return validateForm ($(this));
        }    

    });

}


// validate form
function validateForm (selector) {
    
    $('label').removeClass('missing');
    var boolInputFieldsOk = true;
    var boolIsValidEmail = true;
    var boolIsValidFile = true;
    var boolIsAbsoluteUri = true;
    var boolIsNumber = true;
    var arrBoolMatchingOk = new Array();
    var arrBoolOrElseOk = new Array();
    
    // check all text-, password-, file fields, textareas and select boxes 
    // (email needs for sntax check the class: email, file needs accept="ext,ext" to check file extensions)
    var objTextCollector = $(selector).find(":text.required, :password.required, :textarea.required, :select.required, :file.required, :file, :password[class*='match'], :text[class*='match']");
    if (objTextCollector.length > 0) {
        
        for ( var i = 0; i < objTextCollector.length; i++) {
            
            // depends on required class 
            if ($(objTextCollector[i]).attr('class').match(/required/gi)) {
                
                // or-else check
                var arrOfObjectClasses = $(objTextCollector[i]).attr('class').split(' ');
                if (arrOfObjectClasses.length > 0) {
                    
                    var boolOrElseOk = true;
                    var arrOfOrElseValues = new Array();
                    
                    for (var k = 0; k < arrOfObjectClasses.length; k++) {
                        
                        if (arrOfObjectClasses[k].match(/orElse/gi)) {
                            $('.' + arrOfObjectClasses[k]).each(function(){
                                if ($(this).attr('type').toLowerCase() == 'checkbox' || $(this).attr('type').toLowerCase() == 'radio') {
                                    if ($(this).attr('checked') == true) {
                                        arrOfOrElseValues.push($(this).val().trim());
                                    }
                                } else {
                                    if ($(this).val().trim() != '') {
                                        arrOfOrElseValues.push($(this).val().trim());
                                    }
                                }
                            });
                        }
                        
                    }
                    
                    if ($(objTextCollector[i]).attr('class').match(/orElse/gi) && arrOfOrElseValues.length == 0) {
                        $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
                        boolOrElseOk = false;
                    }
                    
                    arrBoolOrElseOk.push(boolOrElseOk);
                    
                }

                // empty field check
                if ($(objTextCollector[i]).val().trim() == '' && !$(objTextCollector[i]).attr('class').match(/orElse/gi)) {
                    boolInputFieldsOk = false;
                    $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
                }
                
                // email syntax check
    			if ($(objTextCollector[i]).attr('class').match(/email/gi)) {
    				var strReg = "^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$";
    				var regex = new RegExp(strReg);
    				if (!regex.test($(objTextCollector[i]).val())) {
    				    $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
    					boolIsValidEmail = false;
    				}
    			}

                // absolute uri check
                if ($(objTextCollector[i]).attr('class').match(/absoluteUri/gi) && $(objTextCollector[i]).val().indexOf('http://') == -1) {
                    boolIsAbsoluteUri = false;
                    $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
                }
                
                // number check
                if ($(objTextCollector[i]).attr('class').match(/number/gi)) {
                    var numValue = str_replace (',', '.', $(objTextCollector[i]).val());
    				if (isFinite(numValue) == false) {
                        boolIsNumber = false;
                        $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
                    }
                }
                
                // matching check (needs a class match with pre- or suffix in all fields which should be matching)
                var arrOfObjectClasses = $(objTextCollector[i]).attr('class').split(' ');
                if (arrOfObjectClasses.length > 0) {
                    
                    var boolMatchingOk = true;
                    
                    for (var k = 0; k < arrOfObjectClasses.length; k++) {
                        
                        if (arrOfObjectClasses[k].match(/match/gi)) {
                            var strMatchingValue = $(objTextCollector[i]).val().trim();
                            $('.' + arrOfObjectClasses[k]).each(function(){
                                if ($(this).val().trim() != strMatchingValue) {
                                    boolMatchingOk = false;
                                    $('label[for = "' + $(this).attr('id') + '"]').addClass('missing');
                                }
                            });
                        }
                        
                    }
                    
                    if (boolMatchingOk == false) {
                        $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
                    }
                    
                    arrBoolMatchingOk.push(boolMatchingOk);
                    
                }                    
                
            }

            // file type check (independent of required class)
            if ($(objTextCollector[i]).attr('type').match(/file/gi) && $(objTextCollector[i]).val().trim() != '') {
                if ($(objTextCollector[i]).attr('accept') != '*') {
                    var arrPermittedFileTypes = $(objTextCollector[i]).attr('accept').split(',');
                    var strSelectedFileExtension = $(objTextCollector[i]).val().split('.').pop();
                    if (!in_array(strSelectedFileExtension.toLowerCase(), arrPermittedFileTypes)) {
                        $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
                        $(objTextCollector[i]).val('');
                        $(objTextCollector[i]).focus();
                        boolIsValidFile = false;
                    }
                }
            }
            
            // check matching (independent of required class)
            var arrOfObjectClasses = $(objTextCollector[i]).attr('class').split(' ');
            if (arrOfObjectClasses.length > 0) {
                
                var boolMatchingOk = true;
                
                for (var k = 0; k < arrOfObjectClasses.length; k++) {
                    
                    if (arrOfObjectClasses[k].match(/match/gi)) {
                        var strMatchingValue = $(objTextCollector[i]).val().trim();
                        $('.' + arrOfObjectClasses[k]).each(function(){
                            if ($(this).val().trim() != strMatchingValue) {
                                boolMatchingOk = false;
                                $('label[for = "' + $(this).attr('id') + '"]').addClass('missing');
                            }
                        });
                    }
                    
                }
                
                if (boolMatchingOk == false) {
                    $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
                }
                
                arrBoolMatchingOk.push(boolMatchingOk);
                
            }
            

        }
        
    }
    
    // check all checkboxes
    var objTextCollector = $(this).find(":checkbox.required");
    if (objTextCollector.length > 0) {
        
        for ( var i = 0; i < objTextCollector.length; i++) {
            
            if (document.getElementById($(objTextCollector[i]).attr('id')).checked == false) {
                boolInputFieldsOk = false;
                $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
            }
            
        }
        
    }
    
    // check all radio buttons
    var objTextCollector = $(this).find(":radio.required");
    if (objTextCollector.length > 0) {
        
        var boolRadioOk = false;
        
        for ( var i = 0; i < objTextCollector.length; i++) {
            $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').addClass('missing');
            $(":radio[name='" + $(objTextCollector[i]).attr('name') + "']").each(function(){
                if (document.getElementById($(this).attr('id')).checked == true) {
                    boolRadioOk = true;
                    $('label[for = "' + $(objTextCollector[i]).attr('id') + '"]').removeClass('missing');
                }
            });
        }
        
        if (boolRadioOk == false) {
            boolInputFieldsOk = false;
        }
        
    }

    if (boolInputFieldsOk == false) {
        alert('Es wurden nicht alle benötigten Felder ausgefüllt!');
    } else {
        if (boolIsValidEmail == false) {
            boolInputFieldsOk = false;
            alert('Bitte geben Sie eine gültige Email-Adresse ein!');
        } else if (boolIsValidFile == false) {
            boolInputFieldsOk = false;
            alert('Der angegebene Dateityp ist nicht erlaubt!');
        } else if (boolIsAbsoluteUri == false) {
            boolInputFieldsOk = false;
            alert('Dieser Eintrag muss komlett sein, inkl. http:// bzw. https://');
        } else if (boolIsNumber == false) {
            boolInputFieldsOk = false;
            alert('Dieser Eintrag muss eine Zahl sein!');
        } else {
            for (var k = 0; k < arrBoolMatchingOk.length; k++) {
                if (arrBoolMatchingOk[k] == false) {
                    boolInputFieldsOk = false;
                    alert('Die eingebenen Werte stimmen nicht überein!');
                    break;
                }
            }
            for (var k = 0; k < arrBoolOrElseOk.length; k++) {
                if (arrBoolOrElseOk[k] == false) {
                    boolInputFieldsOk = false;
                    alert('Es wurden nicht alle benötigten Felder ausgefüllt!');
                    break;
                }
            }
        }
    }
    
    return boolInputFieldsOk;
    
}


