/*******************************
   PLUGIN - Validate Form
        
   Author: Jack Lukic - KNI
   Last revision: April 2010
*******************************/

jQuery.fn.extend({
    validateForm: function(fields, params) {
        // extensible
        var settings = {
            promptClass: 'prompt',
            onSuccess: function() {
                return true;
            },
            onFailure: function() {
                return false;
            },
            validate: {
                empty: function(value) {
                    return !(typeof(value) == 'undefined' || '' == value);
                },
				terms: function(value) {
					return $("input:checkbox:checked[name='terms']").length>0;
				},
                email: function(value){
                    var regex = new RegExp("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");    
                    return regex.test(value);
                },
                match: function(value, matchingValue) {
                    return (value.toString() == matchingValue.toString());
                },
                url: function(value) {
                    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
                    return regexp.test(value);
                }
            }
        };    
        jQuery.extend(settings, params);
        // reduce object depth to validation (performance)
        var validate = settings.validate;
        // iterate over all forms
        $(this).each(function() {
            // attach event handler
            $(this).submit(function() {
                // start off with a clean record
                var allValid = true;
                jQuery.each(fields, function(fieldName, field) {
                    // cache jq
                    var $field = $('#'+fieldName);
                    // iterate over all validation types for a certain field
                    jQuery.each(field, function(i, validation) {
                        var $promptField = $field.next('.' + settings.promptClass);    
                        var promptExists = ($promptField.size() != 0);
                        // vars                
                        var type = validation.type;
                        var value = $field.val();
                        // normal case
                        if(type.indexOf('match') == -1) {
                            if(!validate[type](value)) {
                                // create message container on first invalid validation attempt
                                if(!promptExists) {
                                    var $promptField = $('<div />')
                                        .addClass(settings.promptClass)
                                        .insertAfter($field)
                                    ;
                                }
                                // add prompt message
                                $promptField
                                    .html(validation.prompt)
                                    .show()
                                ;
                                // form invalid
                                allValid = false;
                                // break each loop for this field
                                return false;
                            }
                            else {
                                // hide prompt
                                $promptField.hide();
                            }
                        }
                        // special case for matching fields
                        else {
                            // instead of waste time with expensive regex, lets assume its properly formatted
                            var matchField = type.substr(6, (type.length - 7));
                            matchValue = $('#' + matchField).val();
                            if(!validate['match'](value, matchValue)) {
                                // create message container on first invalid validation attempt
                                if(!promptExists) {
                                    var $promptField = $('<div />')
                                        .addClass(settings.promptClass)
                                        .insertAfter($field)
                                    ;
                                }
                                // add prompt message
                                $promptField.html(validation.prompt)
                                    .show()
                                ;
                                // form invalid
                                allValid = false;
                                // break each loop for this field
                                return false;
                            }
                            else {
                                // hide prompt
                                $promptField.hide();
                            }
                        }                        
                    });
                });    
                //return false;
                // Evaluate user callbacks
                if(allValid) {
                    return settings.onSuccess();    
                }
                else {
                    return settings.onFailure();    
                }    
            });                        
        });        
        return this;
    }
});
