(function($) {

    $.validateForm = {version: '1.0'};
    
    $.fn.validateForm = function(aFormValidationFields, formSettings, debugSettings)
    {   
        /*
        // include ajaxupload.js
        var fileref = document.createElement("script");        
        fileref.setAttribute("type","text/javascript")
        fileref.setAttribute("src", "js/ajaxupload.js");
        document.getElementsByTagName("head")[0].appendChild(fileref);
        */

        bFormValid = true;
        
        $.formSettings = jQuery.extend({
             formId                 : "form",
             completeMsgDivId       : "contact_form",
             completeMsgSucces      : "Het formulier is succesvol verzonden",
             completeMsgError       : "Er is een fout opgetreden tijdens het verzenden van het formulier. Excuses voor het ongemak.",
             errorMsgClass          : "errorMsg",
             errorMsgCustomHTML     : "",
             validationType         : 1,
             selectboxDefaultValue  : -1,
             postUrl                : "/mail/postform.php",
             CBFunctionSent         : "",    
             CBFunctionFormInvalid  : "",    
             fileUpload             : { bFileUpload : false, uploadBtnId : "btnUpload", inputId : "_Files", inputName : "Files" },
             bIFramePost            : false  // for posting multiple files + posting to iManager
        }, formSettings);  
        
        
        
        debugSettings = jQuery.extend({
             bDebug                 : false,
             ajaxValidationUrl      : "/repos/form/php/formValidation.php"
        }, debugSettings);        
        
        $.validateForm.init = function ()
        {                
            if(debugSettings.bDebug && $.browser.mozilla) {
                console.debug("init");
            }
            
            if($.formSettings.bIFramePost) {
                $("#" + $.formSettings.formId).attr("target","fileuploadframe");     
                
                var iFrame = $.validateForm.createNamedElement("iframe", "fileuploadframe");
                iFrame.id = "_fileuploadframe";
                iFrame.style.display = "none";
                $("body").append(iFrame);
                
                if(debugSettings.bDebug && $.browser.mozilla) {
                    console.debug("iFrame post set");
                }
            }
                
            for(var i=0; i < aFormValidationFields.length; i++)
            {
                switch($.formSettings.validationType)
                {
                    case 0 : //AlertMessage
                    {
                        var ErrorMsg = $.validateForm.validateField(aFormValidationFields[i]);
                        if(ErrorMsg.length > 0)
                        {
                            if(aFormValidationFields[i].ElementId != null) {
                                $("#" + aFormValidationFields[i].ElementId).focus();
                            } else if (aFormValidationFields[i].ElementName != null ) {
                                $("input[name='" + aFormValidationFields[i].ElementName + "']:first").focus();    
                            }
                            alert(ErrorMsg);
                            return false;
                        }                           
                    }
                    break;
                    
                    case 1 : //AjaxValidation
                    {
                        var Options = aFormValidationFields[i];
                        $.validateForm.setBlurEvent(Options, i);                     
                    }
                    break;    
                }       
            };
                      
            
            return true;
        }
        
        $.validateForm.setBlurEvent = function (Options, i) 
        {  
            if(Options.ElementId != null) {
                var Element = "#" + Options.ElementId;   
            } else if(Options.ElementName != null) {
                var Element = "input[name='" + Options.ElementName + "']";  
            }

            if(Element != null) {
                if($(Element).length == 0) {
                    alert("'" + Element + "' doesn't exists!");    
                } else {
                    $(Element).bind("blur", function () {
                        $.validateForm.validateField(Options, true); 
                     });
                }
            } else {
                alert("No ElementId or ElementName defined (0)");   
            }          
        }  
  
        $.validateForm.validateField = function (Options, bAjaxValidation)
        {
            var bValid = true; 
            
            if(debugSettings.bDebug && $.browser.mozilla) {
                console.debug("validateField");
            }
            
            if($("#" + Options.ElementId).length > 0 || Options.ElementName != null)
            {
                if(bAjaxValidation) {
                 
                    if(Options.ElementId != null) {
                        var Element = "#" + Options.ElementId;  

                        var FieldData = {
                          "ValidationType":     Options.ValidationType,
                          "ErrorMsg":           Options.ErrorMsg,
                          "FieldValue":         $(Element).val(),
                          "SelectDefaultValue": $.formSettings.selectboxDefaultValue,
                          "CharacterCount":     Options.CharacterCount,
                          "DefaultValue": 	    Options.DefaultValue
                        };
                    
                    } else if(Options.ElementName != null) {
                        var Element = "input[name='" + Options.ElementName + "']:checked";  
 
                        var FieldValue = [];
                        $(Element).each(function(i, selected){
                          FieldValue[i] = $(selected).val();
                        });                        

                        var FieldData = {
                          "ValidationType":     Options.ValidationType,
                          "ErrorMsg":           Options.ErrorMsg,
                          "FieldValue[]":       FieldValue,
                          "SelectDefaultValue": $.formSettings.selectboxDefaultValue,
                          "CharacterCount":     Options.CharacterCount,
                          "DefaultValue": 	    Options.DefaultValue
                        };
                    }
                    
                    
                    var ajaxPostUrl = "/repos/form/php/formValidation.php"; 
                    if(debugSettings.ajaxValidationUrl.length > 0) {
                        ajaxPostUrl = debugSettings.ajaxValidationUrl;            
                    }

                    $.ajax({
                        type: "POST",
                        url: ajaxPostUrl,
                        data: FieldData,
                        success: function(ErrorMsg) {
                        
                            if(Options.ElementId != null) {
                                var Element = "#" + Options.ElementId;
                            } else if (Options.ElementName != null) {
                                var Element = "input[name='" + Options.ElementName + "']:first";
                            } 
                            
                            if(Element != null) {
                                if($(Element).prev("." + $.formSettings.errorMsgClass).length == 0 && ErrorMsg.length > 0) {
                                    
                                    ErrorMsg = ErrorMsg.replace(/"/g, "&#34;");
                                    ErrorMsg = ErrorMsg.replace(/'/g, "&#39;");
                                    
                                    if($.formSettings.errorMsgCustomHTML.length > 0) {
                                        ErrorMsg = $.formSettings.errorMsgCustomHTML.replace(/_ERROR_/g, ErrorMsg)
                                    } 
                                    $(Element).before("<div class=\"" + $.formSettings.errorMsgClass + "\">" + ErrorMsg + "</div>");      
                                }  
                            } else {
                                alert("No ElementId or ElementName defined (1)");
                            }            
                            
                            if(ErrorMsg.length == 0 && $(Element).prev("." + $.formSettings.errorMsgClass).length > 0) {
                                $(Element).prev("." + $.formSettings.errorMsgClass).remove();    
                            }  
                        }
                    });        
                } else {
                    // JS Validation
                    switch(Options.ValidationType)
                    {
                        case "NotEmpty" :
                        {
                            bValid = $.validateForm.NotEmpty(Options.ElementId, Options.DefaultValue);           
                        }
                        break; 
                        
                        case "EMailAddress" :
                        {
                            bValid = $.validateForm.EMailAddress(Options.ElementId, Options.DefaultValue);           
                        }
                        break; 
                        
                        case "RequiredCheckBox" :
                        case "RequiredRadio" :
                        {
                            if($("input[name='" + Options.ElementName + "']").length > 0) {
                                var aElements = $("input[name='" + Options.ElementName + "']");
                                bValid = $.validateForm.RequiredCheckBoxOrRadio(aElements, Options.DefaultValue);        
                            } else {
                                alert("Error: validateForm.validateField :: ElementName '" + Options.ElementName + "' doesnÂ´t exists! (0)");     
                            }    
                        }
                        break;
                        
                        case "Selectbox" :
                        {
                            bValid = $.validateForm.Selectbox(Options.ElementId);           
                        }
                        break;
                        
                        case "IsNumber" :
                        {
                        		if(!$.validateForm.IsNumber(Options.ElementId, Options.DefaultValue)) {
                        			bValid = $.validateForm.IsNumber(Options.ElementId);
                        		} else {
                            	bValid = $.validateForm.CharacterCount(Options.ElementId, Options.CharacterCount);           
                          	}
                        }
                        break; 
                         
                    }
                }
                
                if(!bValid) {
                    return Options.ErrorMsg;
                }  
            } else {
                alert("Error: validateForm.validateField :: ElementId '" + Options.ElementId + "' doesnÂ´t exists! (1)");
                return false;
            } 
            
            return true;     
        };
        
         $.validateForm.setFormSubmit = function () 
        {            

            if($("#" + $.formSettings.formId).length > 0) {
                switch($.formSettings.validationType) 
                {
                    case 0 :
                    {
                        $("#" + $.formSettings.formId).bind("submit", function() {
                            var bValid = $.validateForm.init(aFormValidationFields);  
                            if(bValid) {
                               $.validateForm.submitForm();  
                            }
                        });    
                    } 
                    break;
                    
                    case 1 :
                    {
                        $("#" + $.formSettings.formId).bind("submit", function() {
                            
                /* doesn't work in jquery 1.4.2 ?? */
                            //$("#" + $.formSettings.formId).unbind("submit");
                            bFormValid      = false;                                 
                              
                            $("input, textarea, select").trigger("blur");                                                
                            setTimeout(function() {
                                if($("." + $.formSettings.errorMsgClass).length == 0) {
                                    bFormValid = true;
                                } else {
                                    //$.validateForm.setFormSubmit();
                                } 

                                if(bFormValid) {    
                                    $.validateForm.submitForm();  
                                } else {
                                  if(typeof $.formSettings.CBFunctionFormInvalid == "function") {
                                      $.formSettings.CBFunctionFormInvalid();
                                  } else {
                                      return;
                                  }
                                }     
                            }, 750); 
                        });    
                    } 
                    break;    
                }
            } else {
                alert("Form doesn't exists: #" + $.formSettings.formId);
            } 
        } 
        
        $.validateForm.submitForm = function() {   
            
            if($.formSettings.bIFramePost) { 
                $("#" + $.formSettings.formId).attr("action", $.formSettings.postUrl); 
                
                if($.formSettings.validationType != 0) { //bug        
                    $("#" + formSettings.formId).submit();    
                } else {
                    alert("Submit iFrame error"); //bug 
                }              
                
                $.validateForm.showMsgAfterSubmit("");    
                
                if(debugSettings.bDebug && $.browser.mozilla) {
                    console.debug("submit iFrame");
                }
                 
                return;     
            } else {
                        
                var DataStr = $("#" + $.formSettings.formId).serialize();
                
                if($.formSettings.fileUpload.bFileUpload) {
                    ajaxUpload.setData({"DataStr": DataStr});
                    ajaxUpload.submit();
                    
                    if(debugSettings.bDebug && $.browser.mozilla) {
                        console.debug("submit ajaxUpload");
                    }    
                } else {
                    if(debugSettings.bDebug && $.browser.mozilla) {
                        console.debug("submit ajax");
                    }

                    if($.formSettings.postUrl != "") {
                        $.ajax({
                            type: "POST",
                            url: $.formSettings.postUrl,
                            data: DataStr,
                            success: function(response) {
                                if(debugSettings.bDebug && $.browser.mozilla) {
                                    console.debug("submit ajax succes");
                                }

                                $.validateForm.showMsgAfterSubmit(response);                                
                            }
                        });
                    }     
                }
            }
        }
        
        $.validateForm.showMsgAfterSubmit = function(response) {  
         
            if(response != "error") {
                response = $.formSettings.completeMsgSucces;     
            } else {
                response = $.formSettings.completeMsgError;     
            }
            
            if(response == null) {
                response = "";    
            }
            
            var completeMsgDivId = $.formSettings.completeMsgDivId;            
            $("#" + completeMsgDivId).html(response)
            .hide()
            .fadeIn(500, function() {
                if(typeof $.formSettings.CBFunctionSent == "function") {
                    $.formSettings.CBFunctionSent();
                } else {
                    //return;
                }                          
            });    
        } 
  
       /**
       * JsValidation functions 
       */
       
        $.validateForm.NotEmpty = function (ElementId, DefaultValue)
        {
            var FieldValue = $("#" + ElementId).attr("value"); 
            
            if(FieldValue.length == 0 || FieldValue == DefaultValue) {
                return false;           
            } 
            return true;   
        }
        
        $.validateForm.EMailAddress = function (ElementId, DefaultValue)
        {
            var FieldValue = $("#" + ElementId).attr("value");
            
            var regex = /^[\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,4}$/;
            if (!regex.test(FieldValue) || FieldValue == DefaultValue) {
                return false;
            }
            return true; 
        }
        
        $.validateForm.RequiredCheckBoxOrRadio = function (aElements)
        {
            for(i=0;i<aElements.length;i++){
                if(aElements[i].checked){
                    return true;  
                }  
            }
            return false;        
        }
        
        $.validateForm.Selectbox = function (ElementId)
        {
            var FieldValue = $("#" + ElementId).val(); 
            if(FieldValue == $.formSettings.selectboxDefaultValue) {
                return false;           
            } 
            return true;     
        }
        
        $.validateForm.IsNumber = function (ElementId, DefaultValue)
        {
            var FieldValue = $("#" + ElementId).attr("value"); 
            
            if(isNaN(FieldValue) || FieldValue.length == 0 || FieldValue == DefaultValue) {
                return false;           
            } 
            return true;   
        } 
        
        $.validateForm.CharacterCount = function (ElementId, Count)
        {
            var FieldValue = $("#" + ElementId).attr("value"); 
            if(FieldValue.length != Count) {
                return false;           
            } 
            return true;   
        }
        
        
        /**
        * Initial form functions for single fileupload
        */
        $.validateForm.setFormSubmit();
        
        if($.formSettings.fileUpload.bFileUpload) { 
            
            var ajaxUpload = new AjaxUpload($.formSettings.fileUpload.uploadBtnId, {
                action: $.formSettings.postUrl,
                name: $.formSettings.fileUpload.inputName,
                autoSubmit: false,
                onComplete : function(file, response){
                    $.validateForm.showMsgAfterSubmit(response);
                },
                onChange : function(file, extension){ 
                   if($("#" + $.formSettings.fileUpload.inputId).length > 0) {
                      $("#" + $.formSettings.fileUpload.inputId).attr("value",file); 
                   }
                }
              });
        }
        
        /**
        * if ajaxvalidation, set onblur events on init
        */
        if($.formSettings.validationType == 1) {            
            bFormValid = $.validateForm.init(aFormValidationFields);  
        }
        
        
        
        return bFormValid;         
    };        
    
    $.validateForm.setFormSettings = function (oFormSettings) 
    {
        $.formSettings = jQuery.extend({}, $.formSettings, oFormSettings);
    };     
       
    /* function for ie named elements bug */
    $.validateForm.createNamedElement = function(type, name) {
        var element = null;
        // Try the IE way; this fails on standards-compliant browsers
        try {
            element = document.createElement('<'+type+' name="'+name+'">');
        } catch (e)  {
        }
        if (!element || element.nodeName != type.toUpperCase()) {
            // Non-IE browser; use canonical method to create named element
            element = document.createElement(type);
            element.name = name;
        }
        return element;
    }  
    
})(jQuery);   

