
function validate() {
    var valid = true;
    
    jQuery(".ka-mandatory").each(
        function() {
            var tval = this.value.replace(/^\s+|\s+$/g,"");

            // If this is a dynamic dropdown, then check the dependent field
            // as well if the dropdown is set to "1" (yes/no dropdowns)
            if (this.type == "select-one") {
                var fieldId = "#" + this.id + "_detail";

                var detailField = jQuery(fieldId);

                if (detailField.size() > 0) {
                    var dval = detailField.val();

                    dval = dval.replace(/^\s+|\s+$/g,"");

                    if (dval == "" && tval == "1") {
                        // detailField.removeClass().addClass("invalid-input");
                        detailField.css("border","1px dashed #ff0000");
                        valid = false;
                    } else {
                        // detailField.removeClass("invalid-input");
                        detailField.css("border","none");
                    }
                }
            }

            if (this.type == 'radio') {
                // Re-initialize this field coz IE7 returns the value of
                // the first radio button even if no radio button was checked.
                tval = "";
                var qs = "input[@name='" + this.name + "']";
                var field = jQuery(qs);

                if (field.length != 0) {
                    if( field.is(":checked") ) {
                        tval = field.val();
                    }
                }
            }
           
            if (tval == "") {
                var parentSpan = jQuery("#parent_" + this.id);
                // IE chokes on the outline attribute. In other browsers outline
                // looks much better or doesn't make a difference.
                var border = jQuery.browser.msie ? "border" : "outline";

                if (this.type == 'radio') {
                    var parentId = "#parent_" + this.name.replace(/\./g,"_");
                    parentSpan = jQuery(parentId);
                }

                if (parentSpan.length != 0) {
                    //parentSpan.removeClass().addClass("invalid-input");
                    parentSpan.css(border,"1px dashed #ff0000");
                } else {
                    //jQuery(this).removeClass().addClass("invalid-input");
                    jQuery(this).css("border","1px dashed #ff0000");
                }
                valid = false;
            } else {
                var parentSpan = jQuery("#parent_" + this.id);
                var border = jQuery.browser.msie ? "border" : "outline";

                if (this.type == 'radio') {
                    var parentId = "#parent_" + this.name.replace(/\./g,"_");
                    parentSpan = jQuery(parentId);
                }

                if (parentSpan.length != 0) {
                    //parentSpan.css(border, "none");
                    parentSpan.attr("style","");
                } else {
                    //jQuery(this).css("border","1px solid #BABCBF");
                    jQuery(this).attr("style","");
                }
            }
        }
    );

    var cbxSelected = 0;
    var cbxCount = 0;

    // At least one checkbox must be selected
    jQuery("input[type=checkbox]").each(
        function() {
            child = jQuery(this).parents().is(".dynamic-cbx-list");
            if( !child )
                return;
            cbxCount ++;
            if (jQuery(this).is(":checked")) {
                cbxSelected ++;
            }
        }
    );


    if (cbxCount > 0) {
        if (cbxSelected == 0) {
            // Ensure compatibility to IE7
            if( parseInt(jQuery.browser.version.major) < 8 ) {
                jQuery(".dynamic-cbx-list").css("border", "1px dashed #ff0000");
                jQuery(".dynamic-cbx-list").css("margin", "0 3px 0 0");
            } else {
                jQuery("#cbx-container:first").css("border","1px dashed #ff0000");
            }
            valid = false;
        } else {
            if( parseInt(jQuery.browser.version.major) < 8 ) {
                jQuery(".dynamic-cbx-list").attr("style", "");
            } else {
                jQuery("#cbx-container:first").attr("style","");
            }
        }
    }

    if (valid) {
        jQuery("#error-message").hide();
    } else {

        jQuery("#error-message").show();

        try {
            window.scrollTo(0,0);
        } catch (exception) {
            // do nothing...
        }

    }
    return valid;
}

function matchPatterns() {
    var match = true;
    jQuery(".ka-usepattern").each(
        function() {
            var dummy = "/";
            var pattern = jQuery(this).attr("pattern");
            var value = this.value.replace(/^\s*|\s*$/g,'');
            if( value == null || value == "" ) return;
            if( pattern[0] == "/" )
                pattern = pattern.substr(1);
            pattern = pattern.replace(/(\/\w*$)/, "");
            // Get the global and/or ignore case parameters without spaces.
            var flags   = RegExp.$1.substr(1).replace(/^\s*|\s*$/,"");
            // "empty" the global RegExp.$1 field. If a regular expression did
            // not match, RegExp.$1 would contain the value of the last match.
            dummy.replace(/(\/\w*$)/, "");
            var rgx = new RegExp(pattern, flags);
            if( rgx.test(value) == false ) {
                jQuery(this).css("border", "1px dashed #eeee00");
                match = false;
            } else {
                //jQuery(this).css("border", "1px solid #BABCBF");
                jQuery(this).attr("style","");
            }
        }
    )
    return match;
}
